nitro 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +410 -0
- data/ProjectInfo +36 -44
- data/README +5 -5
- data/doc/AUTHORS +6 -0
- data/doc/RELEASES +159 -2
- data/lib/glue/sweeper.rb +2 -2
- data/lib/glue/webfile.rb +14 -1
- data/lib/nitro.rb +6 -9
- data/lib/nitro/adapter/mongrel.rb +36 -43
- data/lib/nitro/adapter/scgi.rb +1 -1
- data/lib/nitro/adapter/webrick.rb +96 -24
- data/lib/nitro/caching/actions.rb +2 -1
- data/lib/nitro/caching/fragments.rb +1 -8
- data/lib/nitro/caching/output.rb +14 -4
- data/lib/nitro/cgi.rb +19 -21
- data/lib/nitro/cgi/cookie.rb +5 -1
- data/lib/nitro/cgi/request.rb +20 -4
- data/lib/nitro/compiler.rb +74 -28
- data/lib/nitro/compiler/cleanup.rb +1 -1
- data/lib/nitro/compiler/elements.rb +1 -2
- data/lib/nitro/compiler/localization.rb +1 -1
- data/lib/nitro/compiler/markup.rb +1 -1
- data/lib/nitro/compiler/script.rb +52 -44
- data/lib/nitro/compiler/squeeze.rb +4 -3
- data/lib/nitro/compiler/xslt.rb +7 -6
- data/lib/nitro/context.rb +39 -20
- data/lib/nitro/controller.rb +24 -5
- data/lib/nitro/dispatcher.rb +13 -5
- data/lib/nitro/global.rb +63 -0
- data/lib/nitro/helper/feed.rb +432 -0
- data/lib/nitro/helper/form.rb +11 -3
- data/lib/nitro/helper/form/builder.rb +140 -0
- data/lib/nitro/helper/form/controls.rb +2 -1
- data/lib/nitro/helper/javascript.rb +6 -0
- data/lib/nitro/helper/javascript/morphing.rb +13 -6
- data/lib/nitro/helper/xhtml.rb +42 -6
- data/lib/nitro/helper/xml.rb +3 -0
- data/lib/nitro/part.rb +2 -2
- data/lib/nitro/render.rb +7 -2
- data/lib/nitro/router.rb +57 -16
- data/lib/nitro/scaffolding.rb +29 -20
- data/lib/nitro/server.rb +4 -10
- data/lib/nitro/server/drb.rb +1 -1
- data/lib/nitro/server/runner.rb +10 -0
- data/lib/nitro/session.rb +31 -12
- data/lib/nitro/session/drb.rb +13 -1
- data/lib/nitro/session/file.rb +1 -1
- data/lib/nitro/session/memcached.rb +1 -1
- data/lib/nitro/session/memory.rb +1 -1
- data/lib/nitro/session/og.rb +1 -1
- data/lib/nitro/test/testcase.rb +3 -0
- data/proto/public/error.xhtml +5 -5
- data/proto/public/js/controls.js +2 -2
- data/proto/public/js/dragdrop.js +320 -79
- data/proto/public/js/effects.js +200 -152
- data/proto/public/js/prototype.js +284 -63
- data/proto/public/js/scriptaculous.js +7 -5
- data/proto/public/js/unittest.js +11 -0
- data/proto/public/scaffold/advanced_search.xhtml +30 -0
- data/proto/public/scaffold/list.xhtml +8 -1
- data/proto/public/scaffold/search.xhtml +2 -1
- data/proto/script/scgi_service +1 -1
- data/src/part/admin/controller.rb +1 -1
- data/src/part/admin/skin.rb +1 -1
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/tc_webrick.rb +1 -1
- data/test/nitro/cgi/tc_cookie.rb +1 -1
- data/test/nitro/cgi/tc_request.rb +5 -5
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +2 -0
- data/test/nitro/helper/tc_feed.rb +138 -0
- data/test/nitro/helper/tc_pager.rb +1 -1
- data/test/nitro/helper/tc_rss.rb +1 -1
- data/test/nitro/helper/tc_table.rb +1 -1
- data/test/nitro/helper/tc_xhtml.rb +1 -1
- data/test/nitro/tc_caching.rb +1 -1
- data/test/nitro/tc_cgi.rb +1 -1
- data/test/nitro/tc_context.rb +1 -1
- data/test/nitro/tc_controller.rb +31 -3
- data/test/nitro/tc_controller_aspect.rb +1 -1
- data/test/nitro/tc_dispatcher.rb +1 -1
- data/test/nitro/tc_element.rb +1 -1
- data/test/nitro/tc_flash.rb +1 -1
- data/test/nitro/tc_helper.rb +1 -1
- data/test/nitro/tc_render.rb +6 -6
- data/test/nitro/tc_router.rb +8 -4
- data/test/nitro/tc_server.rb +1 -3
- data/test/nitro/tc_session.rb +1 -3
- metadata +107 -104
- data/Rakefile +0 -232
- data/lib/nitro/adapter/acgi.rb +0 -237
- data/proto/public/Makefile.acgi +0 -40
- data/proto/public/acgi.c +0 -138
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'glue/builder/xml'
|
2
|
+
|
3
|
+
module Nitro
|
4
|
+
module FormHelper
|
5
|
+
|
6
|
+
# A specialized Builder for dynamically building of forms.
|
7
|
+
# Provides extra support for forms backed by managed objects
|
8
|
+
# (entities).
|
9
|
+
#--
|
10
|
+
# TODO: allow multiple objects per form.
|
11
|
+
# TODO: use more generalized controls.
|
12
|
+
#++
|
13
|
+
|
14
|
+
class FormXmlBuilder < ::Glue::XmlBuilder
|
15
|
+
|
16
|
+
def initialize buffer = '', options = {}
|
17
|
+
super
|
18
|
+
@obj = options[:object]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Render a control+label for the given property of the form
|
22
|
+
# object.
|
23
|
+
|
24
|
+
def property sym, options = {}
|
25
|
+
if prop = @obj.class.properties[sym]
|
26
|
+
control = Form::Control.fetch(@obj, prop, options).render
|
27
|
+
print element(prop, control)
|
28
|
+
else
|
29
|
+
raise "Undefined property '#{sym}' for class '#{@obj.class}'."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Render controls+labels for all relations of the form object.
|
34
|
+
|
35
|
+
def all_properties options = {}
|
36
|
+
for prop in @obj.class.properties.values
|
37
|
+
property prop.symbol, options
|
38
|
+
end
|
39
|
+
end
|
40
|
+
alias_method :properties, :all_properties
|
41
|
+
|
42
|
+
#--
|
43
|
+
# IMPLEMENT ME
|
44
|
+
#++
|
45
|
+
|
46
|
+
def relation sym, options = {}
|
47
|
+
end
|
48
|
+
|
49
|
+
#--
|
50
|
+
# IMPLEMENT ME
|
51
|
+
#++
|
52
|
+
|
53
|
+
def all_relations options = {}
|
54
|
+
end
|
55
|
+
|
56
|
+
# Renders a control to select a file for upload.
|
57
|
+
|
58
|
+
def select_file name, options = {}
|
59
|
+
print %|<input type="file" name="#{name}" />|
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Emit a label. Override this method to customize the
|
65
|
+
# rendering for your application needs.
|
66
|
+
|
67
|
+
def label prop
|
68
|
+
%{<label for="#{prop.name}">#{prop[:title] || prop.name.to_s.humanize}</label>}
|
69
|
+
end
|
70
|
+
|
71
|
+
# Emit a form element. Override this method to customize the
|
72
|
+
# rendering for your application needs.
|
73
|
+
|
74
|
+
def element prop, html
|
75
|
+
%{
|
76
|
+
<p class="form_#{prop.symbol}">
|
77
|
+
<div>#{label(prop)}</div>
|
78
|
+
#{html}
|
79
|
+
</p>
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
# A sophisticated form generation helper method.
|
86
|
+
#
|
87
|
+
# === Options
|
88
|
+
#
|
89
|
+
# * :object, :entity, :class = The object that acts as model
|
90
|
+
# for this form. If you pass a class an empty object is
|
91
|
+
# instantiated.
|
92
|
+
#
|
93
|
+
# === Example
|
94
|
+
#
|
95
|
+
# #{form(:object => @owner, :action => :save_profile) do |f|
|
96
|
+
# f.property :name, :editable => false
|
97
|
+
# f.property :password
|
98
|
+
# f.br
|
99
|
+
# f.submit 'Update'
|
100
|
+
# end}
|
101
|
+
|
102
|
+
def form options = {}, &block
|
103
|
+
obj = (options[:object] ||= options[:entity] || options[:class])
|
104
|
+
|
105
|
+
# If the passed obj is a Class instantiate an empty object
|
106
|
+
# of this class.
|
107
|
+
|
108
|
+
if obj.is_a? Class
|
109
|
+
obj = options[:object] = obj.allocate
|
110
|
+
end
|
111
|
+
|
112
|
+
# Convert virtual :multipart method to method="post",
|
113
|
+
# enctype="multipart/form-data"
|
114
|
+
|
115
|
+
if options[:method] == :multipart
|
116
|
+
options[:method] = :post
|
117
|
+
options[:enctype] = 'multipart/form-data'
|
118
|
+
end
|
119
|
+
|
120
|
+
b = FormXmlBuilder.new('', options)
|
121
|
+
|
122
|
+
b << '<form'
|
123
|
+
b << %| action="#{options[:action]}"| if options[:action]
|
124
|
+
b << %| method="#{options[:method]}"| if options[:method]
|
125
|
+
b << %| enctype="#{options[:enctype]}"| if options[:enctype]
|
126
|
+
b << '>'
|
127
|
+
|
128
|
+
b.hidden(:name => 'oid', :value => obj.oid) if obj and obj.saved?
|
129
|
+
|
130
|
+
yield b
|
131
|
+
|
132
|
+
b << '</form>'
|
133
|
+
|
134
|
+
return b
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# * George Moschovitis <gm@navel.gr>
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'glue/configuration'
|
2
|
+
|
1
3
|
require 'nitro/helper/xhtml'
|
2
4
|
|
3
5
|
module Nitro
|
@@ -365,7 +367,6 @@ class Control
|
|
365
367
|
# or :symbol defaults to Control if not found
|
366
368
|
|
367
369
|
def self.fetch(obj, key, options={})
|
368
|
-
|
369
370
|
if key.kind_of? Og::Relation
|
370
371
|
control_sym = key[:control] || key.class.to_s.demodulize.underscore.to_sym
|
371
372
|
elsif key.kind_of? Property
|
@@ -2,6 +2,12 @@ require 'facet/inflect'
|
|
2
2
|
|
3
3
|
module Nitro
|
4
4
|
|
5
|
+
module Javascript
|
6
|
+
# The javascript files to auto include.
|
7
|
+
|
8
|
+
setting :required_files, :default => [], :doc => 'The javascript files to auto include'
|
9
|
+
end
|
10
|
+
|
5
11
|
# Javascript utilities.
|
6
12
|
|
7
13
|
module JavascriptUtils
|
@@ -89,20 +89,27 @@ end
|
|
89
89
|
#
|
90
90
|
# <a client="action">..</a>
|
91
91
|
# becomes
|
92
|
-
# <a href="#" onclick="__nc_action(); return false"
|
92
|
+
# <a href="#" onclick="__nc_action(); return false">..</a>
|
93
|
+
#
|
94
|
+
# <a client="action" params="this.id">..</a>
|
95
|
+
# becomes
|
96
|
+
# <a href="#" onclick="__nc_action(this.id); return false">..</a>
|
93
97
|
|
94
98
|
class ClientMorpher < SharedMorpher
|
95
99
|
def before_start(buffer)
|
96
100
|
require_script_file :prototype, :effects
|
97
101
|
|
102
|
+
params = @attributes['params']
|
103
|
+
|
98
104
|
case @name
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
105
|
+
when 'form'
|
106
|
+
@attributes['onsubmit'] = "__nc_#@value(#{params}); return false"
|
107
|
+
else
|
108
|
+
@attributes['href'] = '#'
|
109
|
+
@attributes['onclick'] = "__nc_#@value(#{params}); return false"
|
104
110
|
end
|
105
111
|
@attributes.delete(@key)
|
112
|
+
@attributes.delete('params')
|
106
113
|
end
|
107
114
|
end
|
108
115
|
|
data/lib/nitro/helper/xhtml.rb
CHANGED
@@ -5,7 +5,31 @@ module Nitro
|
|
5
5
|
|
6
6
|
module XhtmlHelper
|
7
7
|
|
8
|
-
|
8
|
+
# Creates the href of an Object.
|
9
|
+
|
10
|
+
def href_of(obj, base = nil)
|
11
|
+
if obj.is_a?(Symbol) or obj.is_a?(String)
|
12
|
+
href = obj.to_s
|
13
|
+
elsif obj.respond_to? :to_href
|
14
|
+
href = obj.to_href
|
15
|
+
else
|
16
|
+
href = "#{obj.class.name.pluralize.undescore}/#{obj.oid}"
|
17
|
+
end
|
18
|
+
|
19
|
+
if base
|
20
|
+
base += '/'
|
21
|
+
else
|
22
|
+
base = "#{self.class.mount_path}/".squeeze
|
23
|
+
end
|
24
|
+
|
25
|
+
return "#{base}#{href}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Creates a link to an Object.
|
29
|
+
|
30
|
+
def link_to(obj, base = nil)
|
31
|
+
%|<a href="#{href_of(obj, base)}">#{obj}</a>|
|
32
|
+
end
|
9
33
|
|
10
34
|
# Render select options. The parameter is a hash of options.
|
11
35
|
#
|
@@ -64,17 +88,29 @@ private
|
|
64
88
|
end
|
65
89
|
end
|
66
90
|
|
91
|
+
# Render a hidden form input.
|
92
|
+
|
93
|
+
def hidden(options)
|
94
|
+
opts = options.collect { |k, v| %[#{k}="#{v}"] }.join(' ')
|
95
|
+
%[<input type="hidden" #{opts} />]
|
96
|
+
end
|
97
|
+
|
67
98
|
# Render a submit input.
|
68
99
|
|
69
|
-
def submit(options = nil)
|
100
|
+
def submit(label, options = nil)
|
70
101
|
str = ''
|
71
102
|
|
72
|
-
|
103
|
+
label = options.delete(:value) unless label
|
104
|
+
|
105
|
+
str << '<input type="submit"'
|
106
|
+
str << %[ value="#{label}"] if label
|
107
|
+
|
108
|
+
unless options.empty?
|
73
109
|
opts = options.collect { |k, v| %[#{k}="#{v}"] }.join(' ')
|
74
|
-
str << %[
|
75
|
-
else
|
76
|
-
str << %|<input type="submit" />|
|
110
|
+
str << %[ #{opts} ]
|
77
111
|
end
|
112
|
+
|
113
|
+
str << ' />'
|
78
114
|
|
79
115
|
return str
|
80
116
|
end
|
data/lib/nitro/helper/xml.rb
CHANGED
data/lib/nitro/part.rb
CHANGED
@@ -9,8 +9,8 @@ class Part
|
|
9
9
|
# Require (include) a part in the current application.
|
10
10
|
|
11
11
|
def self.require(name)
|
12
|
-
Logger.debug "Requiring part '#{name}'."
|
13
|
-
Kernel.require
|
12
|
+
Logger.debug "Requiring part '#{name}'." if $DBG
|
13
|
+
Kernel.require 'part/' + name + '/run.rb'
|
14
14
|
end
|
15
15
|
|
16
16
|
end
|
data/lib/nitro/render.rb
CHANGED
@@ -94,6 +94,7 @@ module Render
|
|
94
94
|
# A parent render/controller acts as the context.
|
95
95
|
|
96
96
|
def initialize(context, base = nil)
|
97
|
+
@rendering_context = 0
|
97
98
|
@request = @response = @context = context
|
98
99
|
@controller_name = @base = base
|
99
100
|
@out = context.out
|
@@ -119,13 +120,17 @@ module Render
|
|
119
120
|
@context.content_type = klass.instance_variable_get('@content_type') || 'text/html'
|
120
121
|
|
121
122
|
raise 'No controller for action' unless klass
|
122
|
-
|
123
|
+
|
124
|
+
@context.level += 1
|
125
|
+
|
123
126
|
if self.class == klass
|
124
127
|
self.send(action)
|
125
128
|
else
|
126
129
|
klass.new(@context, base).send(action)
|
127
130
|
end
|
128
131
|
|
132
|
+
@context.level -= 1
|
133
|
+
|
129
134
|
rescue NoActionError => e1
|
130
135
|
log_error(e1, path, false)
|
131
136
|
print '(error)'
|
@@ -308,7 +313,7 @@ private
|
|
308
313
|
def emit(meth, *options)
|
309
314
|
Emitter.instance.send(meth, *options)
|
310
315
|
end
|
311
|
-
|
316
|
+
|
312
317
|
end
|
313
318
|
|
314
319
|
end
|
data/lib/nitro/router.rb
CHANGED
@@ -10,9 +10,30 @@ module Nitro
|
|
10
10
|
#
|
11
11
|
# === Example
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
13
|
+
# can also be initialized by a YAML file through Configuration.
|
14
|
+
#
|
15
|
+
# Router.rules = [
|
16
|
+
# {:match => /rewritten\/url\/(.*)/, :controller => IdController, :action => :register, :param => :name},
|
17
|
+
# {:match => %r{another/zelo/(.*)/(.*)}, :controller => AdminController, :action => :kick, :params => [:name, :age]}
|
18
|
+
# ]
|
19
|
+
#
|
20
|
+
# or
|
21
|
+
#
|
22
|
+
# Router.add_rule :match => /rewritten\/url\/(.*)/, :controller => IdController, :action => :register, :param => :name
|
23
|
+
# Router.add_rule :match => %r{another/zelo/(.*)/(.*)}, :controller => AdminController, :action => :kick, :params => [:name, :age]
|
24
|
+
#
|
25
|
+
# this is the global table that initializes each Router
|
26
|
+
# instance.
|
27
|
+
#
|
28
|
+
# or (specialized per Router instance)
|
29
|
+
#
|
30
|
+
# r.add_rule(:match => %r{rewritten/url/(.*)}, :controller => IdController, :action => :register, :param => :name)
|
31
|
+
# r.add_rule(:match => %r{another/zelo/(.*)/(.*)}, :controller => AdminController, :action => :kick, :params => [:name, :age])
|
32
|
+
# r.add_rule(:match => %r{cool/(.*)_(.*).html}, :controller => AdminController, :action => :long, :params => [:name, :age])
|
33
|
+
#
|
34
|
+
#--
|
35
|
+
# gmosx, TODO: use a hash only instead of [rule, options]
|
36
|
+
#++
|
16
37
|
|
17
38
|
module Router
|
18
39
|
|
@@ -20,26 +41,39 @@ module Router
|
|
20
41
|
|
21
42
|
setting :strip_path, :default => nil, :doc => 'Strip the beginning of the path, used by cgi adapter'
|
22
43
|
|
23
|
-
# The
|
44
|
+
# The routing rules. The rules in this table are used to initialize
|
45
|
+
# the routing table of each instantiated router.
|
46
|
+
|
47
|
+
setting :rules, :default => [], :doc => 'The routing rules'
|
48
|
+
|
49
|
+
# The rules map 'nice URLs' to real URLs that
|
24
50
|
# can be handled by the Dispatcher.
|
25
51
|
|
26
|
-
attr_accessor :
|
52
|
+
attr_accessor :rules
|
53
|
+
|
54
|
+
# Initialize the routing table by importing from the global
|
55
|
+
# Router rules.
|
56
|
+
|
57
|
+
def init_routes
|
58
|
+
@rules = Router.rules.dup
|
59
|
+
end
|
27
60
|
|
28
61
|
# Decodes a url to a [controller, action, params] tupple.
|
29
62
|
# Returns false if no decoding is possible.
|
30
63
|
|
31
64
|
def decode_route(url)
|
32
|
-
for rule
|
33
|
-
if md = url.match(rule)
|
65
|
+
for rule in @rules
|
66
|
+
if md = url.match(rule[:match])
|
34
67
|
params = nil
|
35
|
-
if param_names =
|
68
|
+
if param_names = rule[:params] || rule[:param]
|
36
69
|
param_names = [ param_names ] unless param_names.is_a?(Array)
|
37
70
|
params = {}
|
38
71
|
md.captures.each_with_index do |val, idx|
|
39
72
|
params[param_names[idx].to_s] = val
|
40
73
|
end
|
41
74
|
end
|
42
|
-
|
75
|
+
Logger.debug "Rewriting '#{url}' to '#{rule[:controller]}##{rule[:action]}(#{params.values.join(', ')})." if $DBG
|
76
|
+
return rule[:controller], rule[:action], params
|
43
77
|
end
|
44
78
|
end
|
45
79
|
return false
|
@@ -50,9 +84,8 @@ module Router
|
|
50
84
|
# Returns false if no encoding is possible.
|
51
85
|
|
52
86
|
def encode_route(controller, action, *params)
|
53
|
-
if
|
54
|
-
|
55
|
-
url = rule.source
|
87
|
+
if rule = @rules.find { |r| (r[:controller] == controller) and (r[:action] == action) }
|
88
|
+
url = rule[:match].source
|
56
89
|
|
57
90
|
(params.size / 2).times do |i|
|
58
91
|
val = params[i + i + 1]
|
@@ -66,12 +99,20 @@ module Router
|
|
66
99
|
|
67
100
|
# Add a route to the routing table.
|
68
101
|
|
69
|
-
def
|
70
|
-
|
102
|
+
def add_rule(rule)
|
103
|
+
@rules << rule
|
71
104
|
end
|
72
|
-
alias_method :<<, :
|
105
|
+
alias_method :<<, :add_rule
|
73
106
|
|
74
|
-
def
|
107
|
+
def add_rules(new_rules)
|
108
|
+
@rules.concat(new_rules)
|
109
|
+
end
|
110
|
+
|
111
|
+
class << self
|
112
|
+
def add_rule(rule)
|
113
|
+
self.rules << rule
|
114
|
+
end
|
115
|
+
alias_method :<<, :add_rule
|
75
116
|
end
|
76
117
|
|
77
118
|
end
|
data/lib/nitro/scaffolding.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'nitro/helper/form'
|
2
2
|
require 'nitro/helper/pager'
|
3
3
|
|
4
|
-
|
5
4
|
module Nitro
|
6
5
|
|
7
6
|
# Scaffolding is a feature of Nitro that automatically generates
|
@@ -118,11 +117,12 @@ module Scaffolding
|
|
118
117
|
if File.exist?(path) and source = File.read(path)
|
119
118
|
# Interpolate the source.
|
120
119
|
source.gsub!(/%base%/, @base.to_s)
|
120
|
+
source.gsub!(/%klass%/, @klass.to_s)
|
121
121
|
source.gsub!(/%name%/, @name)
|
122
122
|
source.gsub!(/%plural%/, @plural)
|
123
123
|
|
124
124
|
# Transform the source.
|
125
|
-
source = @compiler.transform_template(source)
|
125
|
+
source = @compiler.transform_template(action, source)
|
126
126
|
|
127
127
|
@controller.module_eval %{
|
128
128
|
def #{action}_template
|
@@ -144,15 +144,15 @@ module Scaffolding
|
|
144
144
|
|
145
145
|
def scaffold_class
|
146
146
|
define_class_method :scaffold_base, %{
|
147
|
-
"#{@controller.
|
147
|
+
"#{@controller.mount_path}/#@base"
|
148
148
|
}
|
149
149
|
|
150
150
|
define_class_method :to_href, %{
|
151
|
-
"#{@controller.
|
151
|
+
"#{@controller.mount_path}/#@base/view/\#@#{@oid}"
|
152
152
|
}
|
153
153
|
|
154
154
|
define_class_method :to_edit_href, %{
|
155
|
-
"#{@controller.
|
155
|
+
"#{@controller.mount_path}/#@base/edit/\#@#{@oid}"
|
156
156
|
}
|
157
157
|
end
|
158
158
|
|
@@ -160,28 +160,28 @@ module Scaffolding
|
|
160
160
|
|
161
161
|
def scaffold_controller
|
162
162
|
define_controller_action 'index', %{
|
163
|
-
#{
|
163
|
+
#{::Aspects.gen_advice_code(:scaffold_index, @controller.advices, :pre)}
|
164
164
|
@list, @pager = paginate(@klass, :per_page => Scaffolding.per_page)
|
165
165
|
}
|
166
166
|
|
167
167
|
define_controller_action 'list', %{
|
168
|
-
#{
|
168
|
+
#{::Aspects.gen_advice_code(:scaffold_list, @controller.advices, :pre)}
|
169
169
|
@list, @pager = paginate(@klass, :per_page => Scaffolding.per_page)
|
170
170
|
}
|
171
171
|
|
172
172
|
define_controller_action 'view(oid)', %{
|
173
|
-
#{
|
173
|
+
#{::Aspects.gen_advice_code(:scaffold_view, @controller.advices, :pre)}
|
174
174
|
@obj = @klass[oid]
|
175
175
|
}
|
176
176
|
|
177
177
|
define_controller_action 'new(all = false)', %{
|
178
|
-
#{
|
178
|
+
#{::Aspects.gen_advice_code(:scaffold_new, @controller.advices, :pre)}
|
179
179
|
@obj = @klass.new
|
180
180
|
@all = all
|
181
181
|
}
|
182
182
|
|
183
183
|
define_controller_action 'edit(oid = nil, all = false)', %{
|
184
|
-
#{
|
184
|
+
#{::Aspects.gen_advice_code(:scaffold_edit, @controller.advices, :pre)}
|
185
185
|
@obj = @klass[oid]
|
186
186
|
@all = all
|
187
187
|
}
|
@@ -195,29 +195,38 @@ module Scaffolding
|
|
195
195
|
else
|
196
196
|
obj = request.fill(@klass.create, :assign_relations => true, :preprocess => true)
|
197
197
|
end
|
198
|
-
#{
|
198
|
+
#{::Aspects.gen_advice_code(:scaffold_save, @controller.advices, :pre)}
|
199
199
|
unless obj.valid?
|
200
200
|
flash[:ERRORS] = obj.errors
|
201
201
|
redirect_to_referer
|
202
202
|
end
|
203
203
|
obj.save
|
204
204
|
oid = obj.pk
|
205
|
-
#{
|
205
|
+
#{::Aspects.gen_advice_code(:scaffold_save, @controller.advices, :post)}
|
206
206
|
redirect '#{action_path(:list)}'
|
207
207
|
}
|
208
208
|
|
209
209
|
define_controller_action 'search(query)', %{
|
210
|
-
#{
|
210
|
+
#{::Aspects.gen_advice_code(:scaffold_search, @controller.advices, :pre)}
|
211
211
|
@query = query
|
212
212
|
if @klass.respond_to? :search
|
213
213
|
@list = #@klass.search(query)
|
214
214
|
end
|
215
|
+
#{::Aspects.gen_advice_code(:scaffold_search, @controller.advices, :post)}
|
216
|
+
}
|
217
|
+
|
218
|
+
define_controller_action 'advanced_search', %{
|
219
|
+
#{::Aspects.gen_advice_code(:scaffold_search, @controller.advices, :pre)}
|
220
|
+
if request.post?
|
221
|
+
@list = #@klass.query_by_example(request.params)
|
222
|
+
end
|
223
|
+
#{::Aspects.gen_advice_code(:scaffold_advanced_search, @controller.advices, :post)}
|
215
224
|
}
|
216
225
|
|
217
226
|
define_controller_action 'delete(oid)', %{
|
218
|
-
#{
|
227
|
+
#{::Aspects.gen_advice_code(:scaffold_delete, @controller.advices, :pre)}
|
219
228
|
@klass.delete(oid)
|
220
|
-
#{
|
229
|
+
#{::Aspects.gen_advice_code(:scaffold_delete, @controller.advices, :post)}
|
221
230
|
redirect_to_referer
|
222
231
|
}
|
223
232
|
|
@@ -226,18 +235,18 @@ module Scaffolding
|
|
226
235
|
for rel in @klass.relations
|
227
236
|
define_controller_action "remove_#{rel.target_singular_name}(oid, rid)", %{
|
228
237
|
obj = @klass[oid]
|
229
|
-
#{
|
238
|
+
#{::Aspects.gen_advice_code(:scaffold_remove_relation, @controller.advices, :pre)}
|
230
239
|
rob = #{rel.target_class}[rid]
|
231
240
|
obj.#{rel.name}.remove(rob)
|
232
|
-
#{
|
241
|
+
#{::Aspects.gen_advice_code(:scaffold_remove_relation, @controller.advices, :post)}
|
233
242
|
redirect_to_referer
|
234
243
|
}
|
235
244
|
define_controller_action "delete_#{rel.target_singular_name}(oid, rid)", %{
|
236
|
-
#{
|
245
|
+
#{::Aspects.gen_advice_code(:scaffold_delete_relation, @controller.advices, :pre)}
|
237
246
|
obj = @klass[oid]
|
238
247
|
rob = #{rel.target_class}[rid]
|
239
248
|
obj.#{rel.name}.delete(rob)
|
240
|
-
#{
|
249
|
+
#{::Aspects.gen_advice_code(:scaffold_delete_relation, @controller.advices, :post)}
|
241
250
|
redirect_to_referer
|
242
251
|
}
|
243
252
|
end
|
@@ -323,7 +332,7 @@ module Scaffolding
|
|
323
332
|
if scaffold_all?
|
324
333
|
options = scaffold_all_options
|
325
334
|
Og.manager.manageable_classes.each do |klass|
|
326
|
-
unless
|
335
|
+
unless options[:except] && options[:except].include?(klass)
|
327
336
|
scaffold(klass, options)
|
328
337
|
end
|
329
338
|
end
|