nitro 0.31.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/bin/nitro +135 -37
  2. data/doc/CHANGELOG.1 +108 -108
  3. data/doc/CHANGELOG.2 +89 -89
  4. data/doc/CHANGELOG.3 +105 -105
  5. data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
  6. data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
  7. data/doc/LIBRARIES +13 -0
  8. data/doc/LICENSE +2 -3
  9. data/doc/MIGRATION +45 -0
  10. data/doc/RELEASES +131 -11
  11. data/doc/TODO +67 -0
  12. data/lib/glue/magick.rb +0 -3
  13. data/lib/glue/sweeper.rb +30 -15
  14. data/lib/glue/thumbnails.rb +0 -2
  15. data/lib/glue/webfile.rb +23 -11
  16. data/lib/nitro.rb +37 -44
  17. data/lib/nitro/adapter/cgi.rb +0 -3
  18. data/lib/nitro/adapter/console.rb +0 -2
  19. data/lib/nitro/adapter/fastcgi.rb +6 -3
  20. data/lib/nitro/adapter/mongrel.rb +97 -58
  21. data/lib/nitro/adapter/script.rb +4 -6
  22. data/lib/nitro/adapter/webrick.rb +33 -87
  23. data/lib/nitro/adapter/webrick/vcr.rb +85 -0
  24. data/lib/nitro/caching.rb +0 -2
  25. data/lib/nitro/caching/actions.rb +0 -2
  26. data/lib/nitro/caching/fragments.rb +0 -2
  27. data/lib/nitro/caching/output.rb +45 -16
  28. data/lib/nitro/caching/proxy.rb +49 -0
  29. data/lib/nitro/cgi.rb +3 -6
  30. data/lib/nitro/cgi/cookie.rb +0 -3
  31. data/lib/nitro/cgi/request.rb +67 -24
  32. data/lib/nitro/cgi/response.rb +0 -2
  33. data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
  34. data/lib/nitro/compiler.rb +62 -55
  35. data/lib/nitro/compiler/cleanup.rb +0 -3
  36. data/lib/nitro/compiler/elements.rb +31 -28
  37. data/lib/nitro/compiler/errors.rb +2 -5
  38. data/lib/nitro/compiler/include.rb +10 -8
  39. data/lib/nitro/compiler/layout.rb +0 -2
  40. data/lib/nitro/compiler/localization.rb +0 -2
  41. data/lib/nitro/compiler/markup.rb +14 -6
  42. data/lib/nitro/compiler/morphing.rb +1 -5
  43. data/lib/nitro/compiler/script.rb +2 -4
  44. data/lib/nitro/compiler/squeeze.rb +0 -2
  45. data/lib/nitro/compiler/xslt.rb +0 -2
  46. data/lib/nitro/context.rb +10 -5
  47. data/lib/nitro/control.rb +18 -0
  48. data/lib/nitro/control/attribute.rb +88 -0
  49. data/lib/nitro/control/attribute/checkbox.rb +19 -0
  50. data/lib/nitro/control/attribute/datetime.rb +21 -0
  51. data/lib/nitro/control/attribute/file.rb +20 -0
  52. data/lib/nitro/control/attribute/fixnum.rb +26 -0
  53. data/lib/nitro/control/attribute/float.rb +26 -0
  54. data/lib/nitro/control/attribute/options.rb +38 -0
  55. data/lib/nitro/control/attribute/password.rb +16 -0
  56. data/lib/nitro/control/attribute/text.rb +16 -0
  57. data/lib/nitro/control/attribute/textarea.rb +16 -0
  58. data/lib/nitro/control/none.rb +16 -0
  59. data/lib/nitro/control/relation.rb +53 -0
  60. data/lib/nitro/control/relation/belongs_to.rb +0 -0
  61. data/lib/nitro/control/relation/has_many.rb +97 -0
  62. data/lib/nitro/control/relation/joins_many.rb +0 -0
  63. data/lib/nitro/control/relation/many_to_many.rb +0 -0
  64. data/lib/nitro/control/relation/refers_to.rb +29 -0
  65. data/lib/nitro/controller.rb +7 -296
  66. data/lib/nitro/dispatcher.rb +72 -34
  67. data/lib/nitro/element.rb +36 -10
  68. data/lib/nitro/element/javascript.rb +0 -2
  69. data/lib/nitro/flash.rb +23 -10
  70. data/lib/nitro/global.rb +36 -11
  71. data/lib/nitro/helper.rb +22 -8
  72. data/lib/nitro/helper/benchmark.rb +0 -2
  73. data/lib/nitro/helper/buffer.rb +0 -3
  74. data/lib/nitro/helper/css.rb +12 -0
  75. data/lib/nitro/helper/debug.rb +1 -3
  76. data/lib/nitro/helper/default.rb +1 -0
  77. data/lib/nitro/helper/feed.rb +400 -386
  78. data/lib/nitro/helper/form.rb +246 -116
  79. data/lib/nitro/helper/javascript.rb +28 -2
  80. data/lib/nitro/helper/javascript/morphing.rb +0 -2
  81. data/lib/nitro/helper/javascript/prototype.rb +0 -2
  82. data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
  83. data/lib/nitro/helper/layout.rb +0 -2
  84. data/lib/nitro/helper/navigation.rb +87 -0
  85. data/lib/nitro/helper/pager.rb +11 -22
  86. data/lib/nitro/helper/table.rb +9 -32
  87. data/lib/nitro/helper/url.rb +104 -0
  88. data/lib/nitro/helper/xhtml.rb +20 -4
  89. data/lib/nitro/helper/xml.rb +0 -2
  90. data/lib/nitro/markup.rb +131 -0
  91. data/lib/nitro/part.rb +52 -7
  92. data/lib/nitro/publishable.rb +328 -0
  93. data/lib/nitro/render.rb +30 -61
  94. data/lib/nitro/router.rb +12 -4
  95. data/lib/nitro/sanitize.rb +48 -0
  96. data/lib/nitro/scaffold.rb +9 -11
  97. data/lib/nitro/scaffold/controller.rb +25 -0
  98. data/lib/nitro/scaffold/model.rb +150 -0
  99. data/lib/nitro/scaffolding.rb +1 -3
  100. data/lib/nitro/server.rb +57 -32
  101. data/lib/nitro/server/drb.rb +16 -2
  102. data/lib/nitro/server/runner.rb +80 -102
  103. data/lib/nitro/service.rb +0 -1
  104. data/lib/nitro/service/xmlrpc.rb +0 -2
  105. data/lib/nitro/session.rb +26 -18
  106. data/lib/nitro/session/drb.rb +2 -16
  107. data/lib/nitro/session/memory.rb +0 -2
  108. data/lib/nitro/template.rb +219 -0
  109. data/lib/nitro/test/assertions.rb +1 -3
  110. data/lib/nitro/test/context.rb +0 -1
  111. data/lib/nitro/test/testcase.rb +0 -1
  112. data/lib/nitro/version.rb +6 -0
  113. data/lib/part/admin.rb +16 -0
  114. data/lib/part/admin/controller.rb +19 -0
  115. data/lib/part/admin/helper.rb +30 -0
  116. data/lib/part/admin/og/controller.rb +114 -0
  117. data/lib/part/admin/og/customize.rb +4 -0
  118. data/lib/part/admin/og/template/index.xhtml +27 -0
  119. data/lib/part/admin/og/template/list.xhtml +38 -0
  120. data/lib/part/admin/og/template/search.xhtml +20 -0
  121. data/lib/part/admin/og/template/update.xhtml +25 -0
  122. data/lib/part/admin/skin.rb +207 -0
  123. data/lib/part/admin/template/denied.xhtml +13 -0
  124. data/lib/part/admin/template/index.xhtml +12 -0
  125. data/lib/part/admin/todo.txt +2 -0
  126. data/proto/public/error.xhtml +4 -2
  127. data/proto/run.rb +0 -2
  128. data/test/glue/tc_webfile.rb +1 -0
  129. data/test/nitro/cgi/tc_request.rb +23 -0
  130. data/test/nitro/helper/tc_feed.rb +0 -3
  131. data/test/nitro/helper/tc_navbar.rb +74 -0
  132. data/test/nitro/helper/tc_table.rb +2 -0
  133. data/test/nitro/tc_cgi.rb +72 -19
  134. data/test/nitro/tc_controller.rb +35 -26
  135. data/test/nitro/tc_controller_aspect.rb +1 -0
  136. data/test/nitro/tc_controller_params.rb +864 -0
  137. data/test/nitro/tc_dispatcher.rb +2 -2
  138. data/test/nitro/tc_element.rb +16 -16
  139. data/test/nitro/tc_flash.rb +3 -3
  140. data/test/nitro/tc_markup.rb +31 -0
  141. data/test/nitro/tc_render.rb +12 -14
  142. data/test/nitro/tc_session.rb +9 -7
  143. data/test/nitro/tc_template.rb +34 -0
  144. metadata +217 -198
  145. data/INSTALL +0 -121
  146. data/ProjectInfo +0 -74
  147. data/README +0 -555
  148. data/doc/apache.txt +0 -9
  149. data/doc/config.txt +0 -28
  150. data/doc/faq.txt +0 -7
  151. data/doc/lhttpd.txt +0 -7
  152. data/lib/nitro/adapter/scgi.rb +0 -239
  153. data/lib/nitro/helper/form/builder.rb +0 -144
  154. data/lib/nitro/helper/form/controls.rb +0 -389
  155. data/lib/nitro/helper/rss.rb +0 -72
  156. data/proto/conf/apache.conf +0 -51
  157. data/proto/public/scaffold/advanced_search.xhtml +0 -30
  158. data/proto/public/scaffold/edit.xhtml +0 -11
  159. data/proto/public/scaffold/form.xhtml +0 -1
  160. data/proto/public/scaffold/index.xhtml +0 -20
  161. data/proto/public/scaffold/list.xhtml +0 -32
  162. data/proto/public/scaffold/new.xhtml +0 -11
  163. data/proto/public/scaffold/search.xhtml +0 -29
  164. data/proto/public/scaffold/view.xhtml +0 -8
  165. data/proto/script/scgi_ctl +0 -221
  166. data/proto/script/scgi_service +0 -128
  167. data/setup.rb +0 -1585
  168. data/src/part/admin.rb +0 -16
  169. data/src/part/admin/controller.rb +0 -81
  170. data/src/part/admin/skin.rb +0 -21
  171. data/src/part/admin/system.css +0 -135
  172. data/src/part/admin/template/denied.xhtml +0 -1
  173. data/src/part/admin/template/index.xhtml +0 -43
  174. data/test/nitro/helper/tc_rss.rb +0 -24
@@ -3,22 +3,8 @@ require 'nitro/session'
3
3
 
4
4
  module Nitro
5
5
 
6
- Logger.info "Using DRb sessions at #{Glue::DrbCache.address}:#{Glue::DrbCache.port}." if defined?(Logger) && $DBG
6
+ Logger.info "Using DRb sessions at #{Session.cache_address}:#{Session.cache_port}." if defined?(Logger) && $DBG
7
7
 
8
- class Session < Hash
9
-
10
- # The address of the Drb store.
11
-
12
- setting :cache_address, :default => '127.0.0.1', :doc => 'The address of the Drb store'
13
-
14
- # The port of the Drb store.
15
-
16
- setting :cache_port, :default => 9069, :doc => 'The port of the Drb store'
8
+ Session.cache = Glue::DrbCache.new(Session.cache_address, Session.cache_port)
17
9
 
18
10
  end
19
-
20
- Session.cache = Glue::DrbCache.new
21
-
22
- end
23
-
24
- # * George Moschovitis <gm@navel.gr>
@@ -9,5 +9,3 @@ Logger.info "Using Memory sessions." if defined?(Logger) && $DBG
9
9
  Session.cache = Glue::MemoryCache.new
10
10
 
11
11
  end
12
-
13
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,219 @@
1
+ require 'ostruct'
2
+ require 'facets/more/openobject'
3
+ require 'glue/configuration'
4
+
5
+ module Nitro
6
+
7
+ # A template is a text file with embeded Ruby code. The template
8
+ # processor converts the original text file to ruby code and
9
+ # then evaluates this code to produce the result of the
10
+ # template transformation.
11
+
12
+ module TemplateMixin
13
+
14
+ # Set some pretty safe delimiters for templates.
15
+
16
+ START_DELIM = "<<NITRO_TEMPLATE_DELIMETER\n"
17
+ END_DELIM = "\nNITRO_TEMPLATE_DELIMETER\n"
18
+
19
+ # Convert a template to actual Ruby code, ready to be
20
+ # evaluated.
21
+ #
22
+ # [+template+]
23
+ # The template as a String.
24
+ #
25
+ # [+buffer+]
26
+ # The variable to act as a buffer where the ruby code
27
+ # for this template will be generated. Passed as a
28
+ # String.
29
+ #
30
+ # [+base_dir+]
31
+ # The base directory where the templates reside.
32
+
33
+ def compile_template(template, buffer = '@out', base_dir = File.expand_path(Template.root))
34
+ text = template.dup
35
+
36
+ # gmosx, THINK: what is this ?!?
37
+
38
+ buffer = '@out' unless buffer.is_a?(String) or buffer.is_a?(Symbol)
39
+
40
+ # Strip the xml header! (interracts with the following gsub!)
41
+
42
+ text.gsub!(/<\?xml.*\?>/, "")
43
+
44
+ # Transform include instructions <include href="xxx" />
45
+ # must be transformed before the processinc instructions.
46
+ # Useful to include fragments cached on disk
47
+ #--
48
+ # gmosx, FIXME: NOT TESTED! test and add caching.
49
+ # add load_statically_included fixes.
50
+ #++
51
+
52
+ text.gsub!(/<include href=["'](.*?)["'](.*)(.?)\/>/) do |match|
53
+ "<?r File.read( '\#{@dispatcher.root}/#$1' ?>"
54
+ end
55
+
56
+ # xform render/inject instructions <render href="xxx" />
57
+ # must be transformed before the processinc instructions.
58
+
59
+ text.gsub!(/<(render|inject) href=["'](.*?)["'](.*)(.?)\/>/) do |match|
60
+ "<?r render '#$2' ?>"
61
+ end
62
+
63
+ # Remove <root> elements. typically removed by xslt but lets
64
+ # play it safe. The <root> element is typically added to
65
+ # template files to make them XHTML valid.
66
+
67
+ text.gsub!(/<(\/)?root>/, '')
68
+
69
+ # Transform the processing instructions, use <?r as
70
+ # a marker.
71
+
72
+ text.gsub!(/\?>/, "; #{buffer} << #{START_DELIM}")
73
+ text.gsub!(/<\?r(\s?)/, "#{END_DELIM}; ")
74
+
75
+ # Transform alternative code tags.
76
+ # (very useful in xsl stylesheets)
77
+
78
+ text.gsub!(/<\/ruby>/, "; #{buffer} << #{START_DELIM}")
79
+ text.gsub!(/<ruby>/, "#{END_DELIM}; ")
80
+
81
+ # Also handle erb/asp/jsp style tags. Those tags
82
+ # *cannot* be used with an xslt stylesheet.
83
+
84
+ text.gsub!(/%>/, "; #{buffer} << #{START_DELIM}")
85
+ text.gsub!(/<%/, "#{END_DELIM}; ")
86
+
87
+ # Alterative versions of interpolation.
88
+ # (very useful in xsl stylesheets)
89
+ # Example: #\my_val\
90
+
91
+ text.gsub!(/\#\\(.*?)\\/, '#{\1}')
92
+
93
+ # Alternative for entities.
94
+ # (useful in xsl stylesheets)
95
+ # Examples: %nbsp;, %rquo;
96
+
97
+ text.gsub!(/%(#\d+|\w+);/, '&\1;')
98
+
99
+ # Compile time ruby code. This code is evaluated when
100
+ # compiling the template and the result injected directly
101
+ # into the result. Usefull for example to prevaluate
102
+ # localization. Just use the #[] marker instead of #{}.
103
+
104
+ text.gsub!(/\#\[(.*?)\]/) do |match|
105
+ eval($1)
106
+ end
107
+
108
+ text = "#{buffer} << #{START_DELIM}#{text}#{END_DELIM}"
109
+
110
+ return text
111
+ end
112
+
113
+ # Evaluate the template.
114
+ #
115
+ # [+ruby+]
116
+ # A String containing the compiled template
117
+ # code.
118
+ #
119
+ # [+binding+]
120
+ # The evaluation binding for the rendering.
121
+
122
+ def evaluate_template(ruby, the_binding = nil)
123
+ eval(ruby, the_binding)
124
+ end
125
+
126
+ # Compile and render the template.
127
+
128
+ def process_template(template, buffer = 'out', the_binding = nil)
129
+ evaluate_template(compile_template(template, buffer), the_binding)
130
+ end
131
+
132
+ end
133
+
134
+ # A helper class that provides access to the Template methods
135
+ # as singleton methods.
136
+
137
+ class Template
138
+
139
+ # The default root directory where template files reside.
140
+
141
+ if File.exist?('template')
142
+ default_root = 'template'
143
+ elsif File.exist?('src/template')
144
+ default_root = 'src/template'
145
+ else
146
+ default_root = 'public'
147
+ end
148
+
149
+ setting :root, :default => default_root, :doc => 'The default root directory where template files reside'
150
+
151
+ # The default template name.
152
+
153
+ setting :default, :default => 'index', :doc => 'The default template name'
154
+
155
+ # The default template file extension.
156
+
157
+ setting :extension, :default => 'xhtml', :doc => 'The default template file extension'
158
+
159
+ # Strip xml comments from templates?
160
+
161
+ setting :strip_xml_comments, :default => false, :doc => 'Strip xml comments from templates?'
162
+
163
+ class << self
164
+ include TemplateMixin
165
+ alias_method :compile, :compile_template
166
+ alias_method :transform, :compile_template
167
+ alias_method :evaluate, :evaluate_template
168
+ alias_method :process, :process_template
169
+ end
170
+
171
+ include TemplateMixin
172
+
173
+ # Helper.
174
+
175
+ def render(template)
176
+ str = ''
177
+ process_template(template, 'str', binding)
178
+ return str
179
+ end
180
+ end
181
+
182
+ # A Template that reads from files and also
183
+ # provides a simple but effective caching scheme.
184
+ # An intuitive binding mechanism provides the
185
+ # expansion environment.
186
+ #--
187
+ # gmosx: there is a problem with using OpenObject here!!!
188
+ # the eval no longer works!
189
+ #++
190
+
191
+ class FileTemplate < OpenStruct
192
+ include TemplateMixin
193
+
194
+ @@compiled_template_cache = {}
195
+
196
+ attr_accessor :template_filename
197
+
198
+ def initialize(filename = nil)
199
+ super
200
+ @template_filename = filename
201
+ end
202
+
203
+ def process
204
+ __out__ = ''
205
+
206
+ unless compiled = @@compiled_template_cache[@template_filename]
207
+ template = File.read(@template_filename)
208
+ compiled = compile_template(template, '__out__')
209
+ @@compiled_template_cache[@template_filename] = compiled
210
+ end
211
+
212
+ evaluate_template(compiled, binding)
213
+
214
+ return __out__
215
+ end
216
+ end
217
+
218
+ end
219
+
@@ -137,7 +137,7 @@ module Test::Unit::Assertions
137
137
  assert_block(msg) { cookie.value == value }
138
138
  end
139
139
 
140
- # :section: Glue::Template related assertions.
140
+ # :section: Nitro::Template related assertions.
141
141
 
142
142
  # :section: Redirection assertions.
143
143
 
@@ -167,5 +167,3 @@ module Test::Unit::Assertions
167
167
  end
168
168
 
169
169
  end
170
-
171
- # * George Moschovitis <gm@navel.gr>
@@ -53,4 +53,3 @@ class Context
53
53
  end
54
54
 
55
55
  end
56
- # * George Moschovitis <gm@navel.gr>
@@ -77,4 +77,3 @@ end
77
77
 
78
78
  end
79
79
 
80
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,6 @@
1
+
2
+ module Nitro
3
+ # The version of Nitro.
4
+
5
+ Version = '0.40.0'
6
+ end
@@ -0,0 +1,16 @@
1
+
2
+ require 'part/admin/skin'
3
+ require 'part/admin/controller'
4
+ require 'part/admin/og/controller'
5
+
6
+ Nitro::Server.map(
7
+ '/admin' => AdminController,
8
+ '/admin/og' => OgAdminController
9
+ )
10
+
11
+ # A admin management part.
12
+
13
+ class AdminPart < Nitro::Part
14
+ def initialiaze
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'part/admin/skin'
2
+ require 'part/admin/helper'
3
+
4
+ # The main Controller for the Admin part.
5
+
6
+ class AdminController < Nitro::Controller
7
+ helper :table, :sitemap
8
+ helper AdminHelper
9
+ ann :self, :element_namespace => AdminSkin
10
+
11
+ def self.setup_template_root(path)
12
+ super
13
+ @template_root << File.join(File.dirname(__FILE__), 'template')
14
+ end
15
+
16
+ def index
17
+ end
18
+ ann :index, :title => 'Admin', :parent_controller => '/'
19
+ end
@@ -0,0 +1,30 @@
1
+ # This helper should be included to all Admin plugins. Provides
2
+ # security and other utilities.
3
+
4
+ module AdminHelper
5
+ def self.included(base)
6
+ super
7
+ base.before :authorize
8
+ end
9
+
10
+ #--
11
+ # Generally you do not override this method.
12
+ #++
13
+
14
+ def authorize
15
+ unless authorized_user?
16
+ print 'Access denied'
17
+ exit
18
+ end
19
+ end
20
+
21
+ # Is the user authorizes to browse Admin pages?
22
+ #
23
+ #--
24
+ # Override this method in your application
25
+ #++
26
+
27
+ def authorized_user?
28
+ return true
29
+ end
30
+ end
@@ -0,0 +1,114 @@
1
+ require 'cgi'
2
+
3
+ require 'part/admin/skin'
4
+ require 'part/admin/helper'
5
+
6
+ #--
7
+ # Some helper methods. Also used by the extended enchanting
8
+ # code.
9
+ #++
10
+
11
+ module OgAdminHelper
12
+
13
+ def class_to_name(klass)
14
+ klass.to_s.gsub(/::/, '-')
15
+ end
16
+
17
+ def name_to_class(name)
18
+ constant(CGI.unescape(name.gsub(/-/, '::')))
19
+ end
20
+
21
+ end
22
+
23
+ # The Controller for the OgBrowser Admin module.
24
+
25
+ class OgAdminController < Nitro::Controller
26
+
27
+ helper :table, :sitemap
28
+ helper AdminHelper, OgAdminHelper
29
+
30
+ ann :self, :element_namespace => AdminSkin
31
+
32
+ def self.setup_template_root(path)
33
+ super
34
+ @template_root << File.join(File.dirname(__FILE__), 'template')
35
+ end
36
+
37
+ def index
38
+ @classes = Og.manager.managed_classes.sort { |x, y| x.name <=> y.name }
39
+ end
40
+ ann :index, :title => 'Og', :parent_controller => AdminController
41
+
42
+ def list(name)
43
+ @klass = name_to_class(name)
44
+ @objects, @pager = paginate(@klass, :per_page => Scaffolding.per_page)
45
+ end
46
+ ann :list, :title => 'List', :parent => :index
47
+
48
+ def search(name)
49
+ @klass = name_to_class(name)
50
+ @obj = @klass.allocate
51
+ end
52
+ ann :search, :title => 'Search', :parent => :list
53
+
54
+ def search_results
55
+ @klass = name_to_class(request.params.delete('object_class_name').to_s)
56
+ @objects, @pager = paginate(@klass.query_by_example(request.params), :per_page => Scaffolding.per_page)
57
+ end
58
+ ann :search_results, :template => :list
59
+ ann :search_results, :title => 'Results', :parent => :search
60
+
61
+ def delete_class(name)
62
+ name_to_class(name).delete_all
63
+ redirect_to_referer
64
+ end
65
+
66
+ def destroy_class(name)
67
+ name_to_class(name).destroy
68
+ redirect_to_referer
69
+ end
70
+
71
+ def create(name)
72
+ klass = name_to_class(name)
73
+ @obj = klass.allocate
74
+ end
75
+ ann :create, :template => :update
76
+ ann :create, :title => 'Create', :parent => :index
77
+
78
+ def read(name, oid)
79
+ end
80
+
81
+ def update(name, oid)
82
+ klass = name_to_class(name)
83
+ @obj = klass[oid]
84
+ end
85
+ ann :update, :title => 'Update', :parent => :index
86
+
87
+ def save
88
+ klass = name_to_class(request['object_class_name'].to_s)
89
+
90
+ if oid = request['oid']
91
+ obj = klass[oid.to_s]
92
+ obj.assign(request, :assign_relations => true, :force_boolean => true)
93
+ else
94
+ obj = klass.create
95
+ obj.assign(request, :assign_relations => true)
96
+ end
97
+
98
+ unless obj.valid?
99
+ flash.concat :ERRORS, obj.errors
100
+ redirect_to_referer
101
+ end
102
+
103
+ obj.save
104
+
105
+ redirect :list, :name, obj.class
106
+ end
107
+
108
+ def delete(name, oid)
109
+ klass = name_to_class(name)
110
+ klass.delete(oid)
111
+ redirect_to_referer
112
+ end
113
+
114
+ end