hobo 0.7.2 → 0.7.3
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/bin/hobo +24 -7
- data/hobo_files/plugin/CHANGES.txt +501 -0
- data/hobo_files/plugin/generators/hobo/hobo_generator.rb +8 -6
- data/hobo_files/plugin/generators/hobo/templates/application.dryml +3 -0
- data/hobo_files/plugin/generators/hobo/templates/dryml-support.js +132 -0
- data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +4 -5
- data/hobo_files/plugin/generators/hobo_model_resource/hobo_model_resource_generator.rb +75 -0
- data/hobo_files/plugin/generators/hobo_model_resource/templates/controller.rb +7 -0
- data/hobo_files/plugin/generators/hobo_model_resource/templates/functional_test.rb +8 -0
- data/hobo_files/plugin/generators/hobo_model_resource/templates/helper.rb +2 -0
- data/hobo_files/plugin/generators/hobo_rapid/templates/hobo-rapid.js +30 -11
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/application.css +149 -92
- data/hobo_files/plugin/generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +0 -48
- data/hobo_files/plugin/init.rb +45 -13
- data/hobo_files/plugin/lib/action_view_extensions/base.rb +4 -3
- data/hobo_files/plugin/lib/active_record/association_proxy.rb +18 -0
- data/hobo_files/plugin/lib/active_record/association_reflection.rb +5 -0
- data/hobo_files/plugin/lib/active_record/has_many_association.rb +7 -11
- data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +8 -0
- data/hobo_files/plugin/lib/extensions/test_case.rb +1 -1
- data/hobo_files/plugin/lib/hobo.rb +38 -60
- data/hobo_files/plugin/lib/hobo/authentication_support.rb +1 -1
- data/hobo_files/plugin/lib/hobo/bundle.rb +131 -34
- data/hobo_files/plugin/lib/hobo/composite_model.rb +1 -1
- data/hobo_files/plugin/lib/hobo/controller.rb +7 -8
- data/hobo_files/plugin/lib/hobo/dev_controller.rb +21 -0
- data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +14 -8
- data/hobo_files/plugin/lib/hobo/dryml/dryml_support_controller.rb +13 -0
- data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +6 -7
- data/hobo_files/plugin/lib/hobo/dryml/template.rb +207 -73
- data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +67 -55
- data/hobo_files/plugin/lib/hobo/dryml/template_handler.rb +53 -3
- data/hobo_files/plugin/lib/hobo/hobo_helper.rb +75 -107
- data/hobo_files/plugin/lib/hobo/model.rb +236 -429
- data/hobo_files/plugin/lib/hobo/model_controller.rb +277 -437
- data/hobo_files/plugin/lib/hobo/model_router.rb +62 -29
- data/hobo_files/plugin/lib/hobo/rapid_helper.rb +48 -9
- data/hobo_files/plugin/lib/hobo/scopes.rb +98 -0
- data/hobo_files/plugin/lib/hobo/scopes/association_proxy_extensions.rb +31 -0
- data/hobo_files/plugin/lib/hobo/scopes/automatic_scopes.rb +282 -0
- data/hobo_files/plugin/lib/hobo/scopes/defined_scope_proxy_extender.rb +88 -0
- data/hobo_files/plugin/lib/hobo/scopes/scope_reflection.rb +18 -0
- data/hobo_files/plugin/lib/hobo/scopes/scoped_proxy.rb +59 -0
- data/hobo_files/plugin/lib/hobo/undefined.rb +2 -0
- data/hobo_files/plugin/lib/hobo/user.rb +31 -14
- data/hobo_files/plugin/lib/hobo/user_controller.rb +41 -27
- data/hobo_files/plugin/taglibs/core.dryml +9 -11
- data/hobo_files/plugin/taglibs/rapid.dryml +51 -108
- data/hobo_files/plugin/taglibs/rapid_editing.dryml +25 -25
- data/hobo_files/plugin/taglibs/rapid_forms.dryml +111 -79
- data/hobo_files/plugin/taglibs/rapid_generics.dryml +74 -0
- data/hobo_files/plugin/taglibs/rapid_navigation.dryml +23 -21
- data/hobo_files/plugin/taglibs/rapid_pages.dryml +83 -169
- data/hobo_files/plugin/taglibs/rapid_plus.dryml +16 -2
- data/hobo_files/plugin/taglibs/rapid_support.dryml +3 -3
- data/hobo_files/plugin/taglibs/rapid_user_pages.dryml +104 -0
- metadata +60 -55
- data/hobo_files/plugin/generators/hobo_migration/hobo_migration_generator.rb +0 -276
- data/hobo_files/plugin/generators/hobo_migration/templates/migration.rb +0 -9
- data/hobo_files/plugin/lib/active_record/table_definition.rb +0 -34
- data/hobo_files/plugin/lib/extensions.rb +0 -375
- data/hobo_files/plugin/lib/hobo/email_address.rb +0 -12
- data/hobo_files/plugin/lib/hobo/enum_string.rb +0 -50
- data/hobo_files/plugin/lib/hobo/field_declaration_dsl.rb +0 -43
- data/hobo_files/plugin/lib/hobo/field_spec.rb +0 -68
- data/hobo_files/plugin/lib/hobo/html_string.rb +0 -7
- data/hobo_files/plugin/lib/hobo/lazy_hash.rb +0 -40
- data/hobo_files/plugin/lib/hobo/markdown_string.rb +0 -11
- data/hobo_files/plugin/lib/hobo/migrations.rb +0 -12
- data/hobo_files/plugin/lib/hobo/model_queries.rb +0 -117
- data/hobo_files/plugin/lib/hobo/password_string.rb +0 -7
- data/hobo_files/plugin/lib/hobo/percentage.rb +0 -14
- data/hobo_files/plugin/lib/hobo/predicate_dispatch.rb +0 -78
- data/hobo_files/plugin/lib/hobo/proc_binding.rb +0 -32
- data/hobo_files/plugin/lib/hobo/text.rb +0 -3
- data/hobo_files/plugin/lib/hobo/textile_string.rb +0 -25
- data/hobo_files/plugin/lib/hobo/where_fragment.rb +0 -28
|
@@ -52,12 +52,45 @@ module Hobo::Dryml
|
|
|
52
52
|
attr_accessor
|
|
53
53
|
|
|
54
54
|
for attr in [:erb_binding, :part_contexts, :view_name,
|
|
55
|
-
:this, :this_parent, :this_field,
|
|
55
|
+
:this, :this_parent, :this_field,
|
|
56
56
|
:form_field_path, :form_this, :form_field_names]
|
|
57
57
|
class_eval "def #{attr}; @_#{attr}; end"
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
# The type of this, or when this is nil, the type that would be expected in the current field
|
|
62
|
+
def this_type
|
|
63
|
+
@_this_type ||= if this == false || this == true
|
|
64
|
+
Hobo::Boolean
|
|
65
|
+
elsif this
|
|
66
|
+
this.class
|
|
67
|
+
elsif this_parent && this_field && (parent_class = this_parent.class).respond_to?(:attr_type)
|
|
68
|
+
type = parent_class.attr_type(this_field)
|
|
69
|
+
if type.is_a?(ActiveRecord::Reflection::AssociationReflection)
|
|
70
|
+
reflection = type
|
|
71
|
+
if reflection.macro == :has_many
|
|
72
|
+
Array
|
|
73
|
+
elsif reflection.options[:polymorphic]
|
|
74
|
+
# All we know is that it will be some active-record type
|
|
75
|
+
ActiveRecord::Base
|
|
76
|
+
else
|
|
77
|
+
reflection.klass
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
type
|
|
81
|
+
end
|
|
82
|
+
else
|
|
83
|
+
# Nothing to go on at all
|
|
84
|
+
Object
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def this_field_reflection
|
|
90
|
+
this_parent && this_field && this_parent.class.respond_to?(:reflections) && this_parent.class.reflections[this_field.to_sym]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
61
94
|
def attrs_for(name)
|
|
62
95
|
self.class.tag_attrs[name.to_sym]
|
|
63
96
|
end
|
|
@@ -95,51 +128,50 @@ module Hobo::Dryml
|
|
|
95
128
|
end
|
|
96
129
|
|
|
97
130
|
|
|
98
|
-
def
|
|
99
|
-
if
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
131
|
+
def dom_id(object=nil, attribute=nil)
|
|
132
|
+
if object.nil?
|
|
133
|
+
# nothing passed -- use context
|
|
134
|
+
if this_parent && this_field
|
|
135
|
+
object, attribute = this_parent, this_field
|
|
136
|
+
else
|
|
137
|
+
object = this
|
|
138
|
+
end
|
|
103
139
|
end
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if this_parent and this_parent.is_a?(ActiveRecord::Base) and this_field
|
|
109
|
-
this_field_dom_id
|
|
110
|
-
elsif this.respond_to?(:typed_id)
|
|
111
|
-
this.typed_id
|
|
112
|
-
elsif this.is_a?(Array) and !this.respond_to?(:proxy_reflection)
|
|
113
|
-
"nil"
|
|
140
|
+
|
|
141
|
+
id = object.try.typed_id
|
|
142
|
+
if id
|
|
143
|
+
attribute ? "#{id}_#{attribute}" : id
|
|
114
144
|
else
|
|
115
|
-
|
|
145
|
+
"nil"
|
|
116
146
|
end
|
|
117
147
|
end
|
|
118
|
-
|
|
119
148
|
|
|
120
|
-
|
|
149
|
+
|
|
150
|
+
def call_part(part_node_id, part_name, part_this=nil, *locals)
|
|
121
151
|
res = ''
|
|
122
152
|
if part_this
|
|
123
153
|
new_object_context(part_this) do
|
|
124
|
-
@_part_contexts[
|
|
154
|
+
@_part_contexts[part_node_id] = PartContext.new(part_name, dom_id, locals)
|
|
125
155
|
res = send("#{part_name}_part", *locals)
|
|
126
156
|
end
|
|
127
157
|
else
|
|
128
158
|
new_context do
|
|
129
|
-
@_part_contexts[
|
|
159
|
+
@_part_contexts[part_node_id] = PartContext.new(part_name, dom_id, locals)
|
|
130
160
|
res = send("#{part_name}_part", *locals)
|
|
131
161
|
end
|
|
132
162
|
end
|
|
133
163
|
res
|
|
134
164
|
end
|
|
165
|
+
|
|
135
166
|
|
|
136
167
|
def call_polymorphic_tag(name, *args)
|
|
168
|
+
name = name.to_s.gsub('-', '_')
|
|
137
169
|
type = args.first.is_a?(Class) ? args.shift : nil
|
|
138
170
|
attributes, parameters = args
|
|
139
171
|
|
|
140
172
|
tag = find_polymorphic_tag(name, type)
|
|
141
173
|
if tag != name
|
|
142
|
-
send(tag, attributes, parameters || {})
|
|
174
|
+
send(tag, attributes || {}, parameters || {})
|
|
143
175
|
else
|
|
144
176
|
nil
|
|
145
177
|
end
|
|
@@ -147,18 +179,7 @@ module Hobo::Dryml
|
|
|
147
179
|
|
|
148
180
|
|
|
149
181
|
def find_polymorphic_tag(name, call_type=nil)
|
|
150
|
-
call_type ||=
|
|
151
|
-
when ActiveRecord::Reflection::AssociationReflection
|
|
152
|
-
# Don't blow up with non-existent polymorphic types
|
|
153
|
-
return name if this_type.options[:polymorphic] && !Object.const_defined?(this_type.class_name)
|
|
154
|
-
this_type.klass
|
|
155
|
-
when Array
|
|
156
|
-
this.member_class
|
|
157
|
-
else
|
|
158
|
-
this_type
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
call_type = TrueClass if call_type == FalseClass
|
|
182
|
+
call_type ||= (this.is_a?(Array) && this.respond_to?(:member_class) && this.try.member_class) || this_type
|
|
162
183
|
|
|
163
184
|
while true
|
|
164
185
|
if call_type == ActiveRecord::Base || call_type == Object
|
|
@@ -192,8 +213,9 @@ module Hobo::Dryml
|
|
|
192
213
|
def new_context
|
|
193
214
|
ctx = [ @_erb_output,
|
|
194
215
|
@_this, @_this_parent, @_this_field, @_this_type,
|
|
195
|
-
@_form_field_path]
|
|
216
|
+
@_form_field_path ]
|
|
196
217
|
@_erb_output = ""
|
|
218
|
+
@_this_type = nil
|
|
197
219
|
res = yield
|
|
198
220
|
@_erb_output, @_this, @_this_parent, @_this_field, @_this_type, @_form_field_path = ctx
|
|
199
221
|
res.to_s
|
|
@@ -202,14 +224,7 @@ module Hobo::Dryml
|
|
|
202
224
|
|
|
203
225
|
def new_object_context(new_this)
|
|
204
226
|
new_context do
|
|
205
|
-
@_this_parent
|
|
206
|
-
refl = new_this.proxy_reflection
|
|
207
|
-
[new_this.proxy_owner, refl.name, refl]
|
|
208
|
-
else
|
|
209
|
-
# In dryml, TrueClass is the 'boolean' class
|
|
210
|
-
t = new_this.class == FalseClass ? TrueClass : new_this.class
|
|
211
|
-
[nil, nil, t]
|
|
212
|
-
end
|
|
227
|
+
@_this_parent, @_this_field = [new_this.origin, new_this.origin_attribute] if new_this.respond_to?(:origin)
|
|
213
228
|
@_this = new_this
|
|
214
229
|
yield
|
|
215
230
|
end
|
|
@@ -226,17 +241,7 @@ module Hobo::Dryml
|
|
|
226
241
|
[field_path]
|
|
227
242
|
end
|
|
228
243
|
parent, field, obj = Hobo.get_field_path(tag_this || this, path)
|
|
229
|
-
|
|
230
|
-
type = if parent.class.respond_to?(:field_type) && field_type = parent.class.field_type(field)
|
|
231
|
-
field_type
|
|
232
|
-
elsif obj == false
|
|
233
|
-
# In dryml, TrueClass is the 'boolean' class
|
|
234
|
-
TrueClass
|
|
235
|
-
else
|
|
236
|
-
obj.class
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
@_this, @_this_parent, @_this_field, @_this_type = obj, parent, field, type
|
|
244
|
+
@_this, @_this_parent, @_this_field = obj, parent, field
|
|
240
245
|
@_form_field_path += path if @_form_field_path
|
|
241
246
|
yield
|
|
242
247
|
end
|
|
@@ -432,7 +437,14 @@ module Hobo::Dryml
|
|
|
432
437
|
def render_tag(tag_name, attributes)
|
|
433
438
|
method_name = tag_name.gsub('-', '_')
|
|
434
439
|
if respond_to?(method_name)
|
|
435
|
-
(send(method_name, attributes) + part_contexts_storage_tag).strip
|
|
440
|
+
res = (send(method_name, attributes) + part_contexts_storage_tag).strip
|
|
441
|
+
|
|
442
|
+
# TODO: Temporary hack to get the dryml metadata comments in the right place
|
|
443
|
+
if RAILS_ENV == "development"
|
|
444
|
+
res.gsub(/^(.*?)(<!DOCTYPE.*?>).*?(<html.*?>)/m, "\\2\\3\\1")
|
|
445
|
+
else
|
|
446
|
+
res
|
|
447
|
+
end
|
|
436
448
|
else
|
|
437
449
|
false
|
|
438
450
|
end
|
|
@@ -8,12 +8,62 @@ module Hobo::Dryml
|
|
|
8
8
|
|
|
9
9
|
def render(src, local_assigns)
|
|
10
10
|
renderer = Hobo::Dryml.page_renderer(@view, local_assigns.keys)
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
this = @view.instance_variable_set("@this", @view.controller.send(:dryml_context) || local_assigns[:this])
|
|
12
|
+
s = renderer.render_page(this, local_assigns)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
# Important to strip whitespace, or the browser hangs around for ages (FF2)
|
|
15
|
+
s = s.strip
|
|
16
|
+
|
|
17
|
+
# TODO: Temporary hack to get the dryml metadata comments in the right place
|
|
18
|
+
if RAILS_ENV == "development"
|
|
19
|
+
s.gsub(/^(.*?)(<!DOCTYPE.*?>).*?(<html.*?>)/m, "\\2\\3\\1")
|
|
20
|
+
else
|
|
21
|
+
s
|
|
22
|
+
end
|
|
15
23
|
end
|
|
16
24
|
|
|
17
25
|
end
|
|
18
26
|
|
|
19
27
|
end
|
|
28
|
+
|
|
29
|
+
module ActionController
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Base
|
|
33
|
+
|
|
34
|
+
def dryml_context
|
|
35
|
+
@this
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def dryml_fallback_tag(tag_name)
|
|
39
|
+
@dryml_fallback_tag = tag_name
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def render_tag(tag, options={}, render_options={})
|
|
43
|
+
add_variables_to_assigns
|
|
44
|
+
|
|
45
|
+
if options[:with]
|
|
46
|
+
@this = options[:with] unless options[:field]
|
|
47
|
+
else
|
|
48
|
+
options[:with] = dryml_context
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
text = Hobo::Dryml.render_tag(@template, tag, options)
|
|
52
|
+
text && render({:text => text, :layout => false }.merge(render_options))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def render_for_file_with_dryml(template_path, *args)
|
|
56
|
+
if template_path !~ /^\// && # not an absolute path (e.g. an exception ERB template)
|
|
57
|
+
!template_exists?(template_path) && # no template available in app/views
|
|
58
|
+
tag_name = @dryml_fallback_tag || "#{File.basename(template_path).dasherize}-page"
|
|
59
|
+
|
|
60
|
+
# The template was missing, try to use a DRYML <page> tag instead
|
|
61
|
+
render_tag(tag_name) or raise ActionController::MissingTemplate, "Missing template #{template_path}.html.erb in view path #{RAILS_ROOT}/app/views"
|
|
62
|
+
else
|
|
63
|
+
render_for_file_without_dryml(template_path, *args)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
alias_method_chain :render_for_file, :dryml
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -40,66 +40,51 @@ module Hobo
|
|
|
40
40
|
def subsite
|
|
41
41
|
params[:controller].match(/([^\/]+)\//)._?[1]
|
|
42
42
|
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
IMPLICIT_ACTIONS = [:index, :show, :create, :update, :destroy]
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
def object_url(*args)
|
|
47
|
+
def object_url(obj, *args)
|
|
46
48
|
params = args.extract_options!
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
controller_name = controller_for(obj)
|
|
51
|
-
|
|
52
|
-
subsite = params[:subsite] || self.subsite
|
|
49
|
+
action = args.first._?.to_sym
|
|
50
|
+
options, params = params.partition_hash([:subsite, :method, :format])
|
|
51
|
+
options[:subsite] ||= self.subsite
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
else
|
|
72
|
-
raise HoboError.new("invalid object url: new for existing object") if action == "new"
|
|
73
|
-
|
|
74
|
-
klass = obj.class
|
|
75
|
-
id = if klass.id_name?
|
|
76
|
-
obj.id_name(true)
|
|
77
|
-
else
|
|
78
|
-
obj.to_param
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
[base, controller_name, id]
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
elsif obj.is_a? Array # warning - this breaks if we use `case/when Array`
|
|
85
|
-
owner = obj.proxy_owner
|
|
86
|
-
new_model = obj.proxy_reflection.klass
|
|
87
|
-
[object_url(owner), obj.proxy_reflection.name]
|
|
88
|
-
|
|
89
|
-
else
|
|
90
|
-
raise HoboError.new("cannot create url for #{obj.inspect} (#{obj.class})")
|
|
91
|
-
end
|
|
92
|
-
url = parts.join("/")
|
|
53
|
+
if obj.respond_to?(:origin)
|
|
54
|
+
# Asking for URL of a collection, e.g. category/1/adverts or category/1/adverts/new
|
|
55
|
+
if action == :new
|
|
56
|
+
action_path = "#{obj.origin_attribute}/new"
|
|
57
|
+
action = "new_#{obj.origin_attribute.to_s.singularize}"
|
|
58
|
+
elsif action.nil?
|
|
59
|
+
action = obj.origin_attribute
|
|
60
|
+
end
|
|
61
|
+
obj = obj.origin
|
|
62
|
+
|
|
63
|
+
else
|
|
64
|
+
action ||= case options[:method].to_s
|
|
65
|
+
when 'put'; :update
|
|
66
|
+
when 'post'; :create
|
|
67
|
+
when 'delete'; :destroy
|
|
68
|
+
else; obj.is_a?(Class) ? :index : :show
|
|
69
|
+
end
|
|
93
70
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
else url += "/#{action}"
|
|
71
|
+
if action == :create && obj.try.new_record?
|
|
72
|
+
# Asking for url to post new record to
|
|
73
|
+
obj = obj.class
|
|
74
|
+
end
|
|
99
75
|
end
|
|
76
|
+
|
|
77
|
+
klass = obj.is_a?(Class) ? obj : obj.class
|
|
78
|
+
if Hobo::ModelRouter.linkable?(klass, action, options)
|
|
79
|
+
|
|
80
|
+
path = obj.to_url_path or HoboError.new("cannot create url for #{obj.inspect} (#{obj.class})")
|
|
81
|
+
url = "#{base_url}#{'/' + subsite unless subsite.blank?}/#{path}"
|
|
100
82
|
|
|
101
|
-
|
|
102
|
-
|
|
83
|
+
url += "/#{action_path || action}" unless action.in?(IMPLICIT_ACTIONS)
|
|
84
|
+
|
|
85
|
+
params = make_params(params)
|
|
86
|
+
params.blank? ? url : "#{url}?#{params}"
|
|
87
|
+
end
|
|
103
88
|
end
|
|
104
89
|
|
|
105
90
|
|
|
@@ -127,31 +112,16 @@ module Hobo
|
|
|
127
112
|
hash.map {|k,v| _as_params(k, v)}.join("&")
|
|
128
113
|
end
|
|
129
114
|
|
|
130
|
-
|
|
131
|
-
def dom_id(*args)
|
|
132
|
-
if args.length == 0
|
|
133
|
-
Hobo.dom_id(this)
|
|
134
|
-
else
|
|
135
|
-
Hobo.dom_id(*args)
|
|
136
|
-
end
|
|
137
|
-
rescue ArgumentError
|
|
138
|
-
""
|
|
139
|
-
end
|
|
140
|
-
|
|
141
115
|
|
|
142
116
|
def type_id(type=nil)
|
|
143
|
-
type ||= this.is_a?(Class)
|
|
144
|
-
|
|
117
|
+
type ||= (this.is_a?(Class) && this) || this_type || this.class
|
|
118
|
+
HoboFields.to_name(type) || type.name.underscore.gsub("/", "__")
|
|
145
119
|
end
|
|
146
|
-
|
|
120
|
+
|
|
147
121
|
|
|
148
122
|
def type_and_field(*args)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
else
|
|
152
|
-
type, field = args
|
|
153
|
-
"#{Hobo.type_id(type)}_#{field}"
|
|
154
|
-
end
|
|
123
|
+
type, field = args.empty? ? [this_parent.class, this_field] : args
|
|
124
|
+
"#{type.typed_id}_#{field}" if type.respond_to?(:typed_id)
|
|
155
125
|
end
|
|
156
126
|
|
|
157
127
|
|
|
@@ -203,8 +173,8 @@ module Hobo
|
|
|
203
173
|
else
|
|
204
174
|
object, field = args.length == 2 ? args : [this, args.first]
|
|
205
175
|
|
|
206
|
-
if !field
|
|
207
|
-
Hobo.can_edit?(current_user, object.
|
|
176
|
+
if !field && object.respond_to?(:origin)
|
|
177
|
+
Hobo.can_edit?(current_user, object.origin, object.origin_attribute)
|
|
208
178
|
else
|
|
209
179
|
Hobo.can_edit?(current_user, object, field)
|
|
210
180
|
end
|
|
@@ -225,12 +195,14 @@ module Hobo
|
|
|
225
195
|
object = this
|
|
226
196
|
end
|
|
227
197
|
end
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
198
|
+
|
|
199
|
+
@can_view_cache ||= {}
|
|
200
|
+
@can_view_cache[ [object, field] ] ||=
|
|
201
|
+
if !field && object.respond_to?(:origin)
|
|
202
|
+
Hobo.can_view?(current_user, object.origin, object.origin_attribute)
|
|
203
|
+
else
|
|
204
|
+
Hobo.can_view?(current_user, object, field)
|
|
205
|
+
end
|
|
234
206
|
end
|
|
235
207
|
|
|
236
208
|
|
|
@@ -272,8 +244,8 @@ module Hobo
|
|
|
272
244
|
|
|
273
245
|
def param_name_for_this(foreign_key=false)
|
|
274
246
|
return "" unless form_this
|
|
275
|
-
name = if foreign_key
|
|
276
|
-
param_name_for(form_this, form_field_path[0..-2] + [
|
|
247
|
+
name = if foreign_key && (refl = this_field_reflection) && refl.macro == :belongs_to
|
|
248
|
+
param_name_for(form_this, form_field_path[0..-2] + [refl.primary_key_name])
|
|
277
249
|
else
|
|
278
250
|
param_name_for(form_this, form_field_path)
|
|
279
251
|
end
|
|
@@ -282,21 +254,10 @@ module Hobo
|
|
|
282
254
|
end
|
|
283
255
|
|
|
284
256
|
|
|
285
|
-
def selector_type
|
|
286
|
-
if this.is_a? ActiveRecord::Base
|
|
287
|
-
this.class
|
|
288
|
-
elsif this.respond_to? :member_class
|
|
289
|
-
this.member_class
|
|
290
|
-
elsif this == @this
|
|
291
|
-
@model
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
|
|
296
257
|
def transpose_with_field(field, collection=nil)
|
|
297
258
|
collection ||= this
|
|
298
259
|
matrix = collection.map {|obj| obj.send(field) }
|
|
299
|
-
max_length = matrix
|
|
260
|
+
max_length = matrix.*.length.max
|
|
300
261
|
matrix = matrix.map do |a|
|
|
301
262
|
a + [nil] * (max_length - a.length)
|
|
302
263
|
end
|
|
@@ -306,9 +267,7 @@ module Hobo
|
|
|
306
267
|
|
|
307
268
|
def new_for_current_user(model_or_assoc=nil)
|
|
308
269
|
model_or_assoc ||= this
|
|
309
|
-
|
|
310
|
-
record.set_creator(current_user)
|
|
311
|
-
record
|
|
270
|
+
model_or_assoc.user_new(current_user)
|
|
312
271
|
end
|
|
313
272
|
|
|
314
273
|
|
|
@@ -338,8 +297,12 @@ module Hobo
|
|
|
338
297
|
|
|
339
298
|
|
|
340
299
|
# Sign-up url for a given user record or user class
|
|
341
|
-
def signup_url(user_or_class)
|
|
342
|
-
c =
|
|
300
|
+
def signup_url(user_or_class=nil)
|
|
301
|
+
c = case user_or_class
|
|
302
|
+
when Class; user_or_class
|
|
303
|
+
when nil; Hobo::User.default_user_model
|
|
304
|
+
else user_or_class
|
|
305
|
+
end
|
|
343
306
|
send("#{c.name.underscore}_signup_url") rescue nil
|
|
344
307
|
end
|
|
345
308
|
|
|
@@ -366,23 +329,28 @@ module Hobo
|
|
|
366
329
|
target = args.empty? || args.first.is_a?(Symbol) ? this : args.shift
|
|
367
330
|
action = args.first
|
|
368
331
|
|
|
369
|
-
if target.
|
|
332
|
+
if (origin = target.try.origin)
|
|
333
|
+
klass = origin.class
|
|
334
|
+
action = if action == :new
|
|
335
|
+
"new_#{target.origin_attribute.to_s.singularize}"
|
|
336
|
+
elsif action.nil?
|
|
337
|
+
target.origin_attribute
|
|
338
|
+
end
|
|
339
|
+
elsif target.is_a?(Class)
|
|
370
340
|
klass = target
|
|
371
341
|
action ||= :index
|
|
372
|
-
elsif target.respond_to?(:member_class)
|
|
373
|
-
klass = target.member_class
|
|
374
|
-
action ||= :show
|
|
375
342
|
else
|
|
376
343
|
klass = target.class
|
|
377
344
|
action ||= :show
|
|
378
345
|
end
|
|
379
346
|
|
|
380
|
-
Hobo::ModelRouter.linkable?(
|
|
347
|
+
Hobo::ModelRouter.linkable?(klass, action, options.reverse_merge(:subsite => subsite))
|
|
381
348
|
end
|
|
382
349
|
|
|
383
350
|
|
|
384
351
|
# Convenience helper for the default app
|
|
385
352
|
|
|
353
|
+
# FIXME: this should interrogate the routes to find index methods, not the models
|
|
386
354
|
def front_models
|
|
387
355
|
Hobo.models.select {|m| linkable?(m) && !(m < Hobo::User)}
|
|
388
356
|
end
|
|
@@ -398,7 +366,7 @@ module Hobo
|
|
|
398
366
|
def log_debug(*args)
|
|
399
367
|
logger.debug("\n### DRYML Debug ###")
|
|
400
368
|
logger.debug(args.map {|a| PP.pp(a, "")}.join("-------\n"))
|
|
401
|
-
logger.debug("DRYML THIS = #{
|
|
369
|
+
logger.debug("DRYML THIS = #{this.typed_id rescue this.inspect}")
|
|
402
370
|
logger.debug("###################\n")
|
|
403
371
|
args.first unless args.empty?
|
|
404
372
|
end
|