hobo 1.3.0.pre31 → 1.3.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/CHANGES-1.1.txt +5253 -0
- data/CHANGES.txt +255 -5095
- data/VERSION +1 -1
- data/hobo.gemspec +1 -2
- data/lib/generators/hobo/admin_subsite/USAGE +25 -0
- data/lib/generators/hobo/admin_subsite/admin_subsite_generator.rb +2 -1
- data/lib/generators/hobo/assets/USAGE +5 -0
- data/lib/generators/hobo/assets/templates/application.dryml.erb +1 -1
- data/lib/generators/hobo/controller/USAGE +3 -0
- data/lib/generators/hobo/i18n/USAGE +3 -0
- data/lib/generators/hobo/i18n/templates/app.fr.yml +26 -0
- data/lib/generators/hobo/i18n/templates/app.nb.yml +25 -0
- data/lib/generators/hobo/i18n/templates/hobo.de.yml +1 -0
- data/lib/generators/hobo/i18n/templates/hobo.en.yml +3 -2
- data/lib/generators/hobo/i18n/templates/hobo.es.yml +1 -0
- data/lib/generators/hobo/i18n/templates/hobo.fr.yml +195 -0
- data/lib/generators/hobo/i18n/templates/hobo.it.yml +1 -0
- data/lib/generators/hobo/i18n/templates/hobo.nb.yml +198 -0
- data/lib/generators/hobo/i18n/templates/hobo.pt-PT.yml +1 -0
- data/lib/generators/hobo/i18n/templates/hobo.ru.yml +1 -0
- data/lib/generators/hobo/model/USAGE +2 -2
- data/lib/generators/hobo/rapid/templates/hobo-rapid.js +15 -30
- data/lib/generators/hobo/rapid/templates/themes/clean/public/stylesheets/clean.css +1 -0
- data/lib/generators/hobo/resource/USAGE +39 -0
- data/lib/generators/hobo/routes/router.rb +2 -2
- data/lib/generators/hobo/setup_wizard/setup_wizard_generator.rb +23 -9
- data/lib/generators/hobo/subsite.rb +13 -2
- data/lib/generators/hobo/subsite/USAGE +24 -0
- data/lib/generators/hobo/subsite_taglib/USAGE +4 -0
- data/lib/generators/hobo/subsite_taglib/templates/taglib.dryml.erb +1 -1
- data/lib/generators/hobo/test_framework/USAGE +2 -0
- data/lib/generators/hobo/user_controller/USAGE +3 -0
- data/lib/generators/hobo/user_controller/templates/controller.rb.erb +3 -0
- data/lib/generators/hobo/user_mailer/USAGE +2 -0
- data/lib/generators/hobo/user_model/USAGE +2 -9
- data/lib/generators/hobo/user_resource/USAGE +10 -0
- data/lib/hobo.rb +1 -1
- data/lib/hobo/controller/authentication_support.rb +0 -22
- data/lib/hobo/controller/model.rb +15 -13
- data/lib/hobo/controller/{user.rb → user_base.rb} +43 -32
- data/lib/hobo/extensions/action_controller/hobo_methods.rb +25 -1
- data/lib/hobo/extensions/active_record/associations/collection.rb +12 -3
- data/lib/hobo/extensions/active_record/associations/reflection.rb +1 -1
- data/lib/hobo/extensions/active_record/relation_with_origin.rb +4 -0
- data/lib/hobo/helper.rb +6 -1
- data/lib/hobo/helper/translations.rb +1 -1
- data/lib/hobo/model.rb +55 -19
- data/lib/hobo/model/lifecycles.rb +3 -3
- data/lib/hobo/model/lifecycles/lifecycle.rb +7 -3
- data/lib/hobo/model/permissions.rb +1 -0
- data/lib/hobo/model/scopes/automatic_scopes.rb +0 -2
- data/lib/hobo/model/view_hints.rb +1 -0
- data/lib/hobo/rapid/generators/rapid/forms.dryml.erb +2 -1
- data/lib/hobo/rapid/generators/rapid/pages.dryml.erb +10 -11
- data/lib/hobo/rapid/helper.rb +4 -3
- data/lib/hobo/rapid/taglibs/rapid_core.dryml +92 -67
- data/lib/hobo/rapid/taglibs/rapid_editing.dryml +35 -15
- data/lib/hobo/rapid/taglibs/rapid_forms.dryml +46 -22
- data/lib/hobo/rapid/taglibs/rapid_i18n.dryml +103 -37
- data/lib/hobo/rapid/taglibs/rapid_lifecycles.dryml +3 -1
- data/lib/hobo/rapid/taglibs/rapid_pages.dryml +3 -3
- data/lib/hobo/rapid/taglibs/rapid_plus.dryml +49 -45
- data/test/irt/generators/partials/_subsite_taglib_variables.rb +1 -1
- metadata +38 -33
@@ -15,5 +15,5 @@ Examples:
|
|
15
15
|
|
16
16
|
creates a Post model with a string title, text body, and published flag.
|
17
17
|
|
18
|
-
After the model is created, and the fields are specified, use hobo:migration
|
19
|
-
to create the migrations incrementally.
|
18
|
+
After the model is created, and the fields are specified, use hobo:migration
|
19
|
+
to create the migrations incrementally.
|
@@ -34,6 +34,7 @@ var Hobo = {
|
|
34
34
|
var params = Hobo.fieldSetParam(el, val)
|
35
35
|
var p = el.getAttribute("hobo-ajax-params")
|
36
36
|
if (p) params = params + "&" + p
|
37
|
+
params = params + '&_method=PUT'
|
37
38
|
|
38
39
|
var opts = Object.merge(options || {}, { params: params, message: el.getAttribute("hobo-ajax-message")})
|
39
40
|
Hobo.ajaxRequest(Hobo.putUrl(el), updates, opts)
|
@@ -257,8 +258,9 @@ var Hobo = {
|
|
257
258
|
|
258
259
|
|
259
260
|
putUrl: function(el) {
|
261
|
+
/* we used to append _method=put here, but it doesn't work in Rails 3 */
|
260
262
|
var spec = Hobo.modelSpecForElement(el)
|
261
|
-
return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id
|
263
|
+
return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id
|
262
264
|
},
|
263
265
|
|
264
266
|
|
@@ -444,23 +446,6 @@ var Hobo = {
|
|
444
446
|
},
|
445
447
|
|
446
448
|
|
447
|
-
fixSectionGroup: function(e) {
|
448
|
-
rows = e.childElements().map(function(e, i) {
|
449
|
-
cells = e.childElements().map(function(e, i) {
|
450
|
-
return e.outerHTML.sub("<DIV", "<td valign='top'").sub(/<\/DIV>$/i, "</td>")
|
451
|
-
}).join('')
|
452
|
-
|
453
|
-
var attrs = e.outerHTML.match(/<DIV([^>]+)/)[1]
|
454
|
-
return "<tr" + attrs + ">" + cells + "</tr>"
|
455
|
-
}).join("\n")
|
456
|
-
|
457
|
-
var attrs = e.outerHTML.match(/<DIV([^>]+)/)[1]
|
458
|
-
|
459
|
-
var table= "<table cellpadding='0' cellspacing='0' border='0' style='border-collapse: collapse; border-spacing: 0'" + attrs + ">" +
|
460
|
-
rows + "</table>"
|
461
|
-
e.outerHTML = table
|
462
|
-
},
|
463
|
-
|
464
449
|
makeHtmlEditor: function(textarea) {
|
465
450
|
// do nothing - plugins can overwrite this method
|
466
451
|
}
|
@@ -571,17 +556,21 @@ HoboInputMany = {
|
|
571
556
|
|
572
557
|
initialize: function(ev) {
|
573
558
|
/* the second clause should be sufficient, but it isn't in IE7. See bug 603 */
|
574
|
-
Element.select(ev.target, ".input-many-template
|
575
|
-
|
576
|
-
input.disabled
|
577
|
-
|
578
|
-
|
559
|
+
Element.select(ev.target, ".input-many-template").each(function (templ) {
|
560
|
+
templ.select("input:hidden,select:hidden,textarea:hidden,button:hidden").each(function(input) {
|
561
|
+
if(!input.disabled) {
|
562
|
+
input.disabled = true;
|
563
|
+
input.addClassName("input_many_template_input");
|
564
|
+
}
|
565
|
+
})
|
579
566
|
});
|
580
567
|
|
581
568
|
// disable all elements inside our template, and mark them so we can find them later.
|
582
|
-
Element.select(ev.target, ".input-many-template
|
583
|
-
input.
|
584
|
-
|
569
|
+
Element.select(ev.target, ".input-many-template").each(function (templ) {
|
570
|
+
templ.select("input:enabled,select:enabled,textarea:enabled,button:enabled").each(function(input) {
|
571
|
+
input.disabled = true;
|
572
|
+
input.addClassName("input_many_template_input");
|
573
|
+
});
|
585
574
|
});
|
586
575
|
|
587
576
|
Element.select(ev.target, ".sortable-input-many").each(function(el) {
|
@@ -909,10 +898,6 @@ AutocompleteBehavior = Behavior.create({
|
|
909
898
|
Event.addBehavior.reassignAfterAjax = true;
|
910
899
|
Event.addBehavior({
|
911
900
|
|
912
|
-
'div.section-group' : function() {
|
913
|
-
if (Prototype.Browser.IE) Hobo.fixSectionGroup(this);
|
914
|
-
},
|
915
|
-
|
916
901
|
'div.select-many.input' : SelectManyInput(),
|
917
902
|
|
918
903
|
'textarea.html' : function() {
|
@@ -14,6 +14,7 @@ body {color: #193440; background: url(../images/300-ACD3E6-fff.png) repeat-x #ff
|
|
14
14
|
.section.content {background: #FCFFF5;}
|
15
15
|
.button {color: white; background: #5B8BA0;}
|
16
16
|
.button:hover {background-color: #193440;}
|
17
|
+
.button[disabled] { background-color: #CCCCCC; }
|
17
18
|
.add-to-collection {background: #E6E7DE;}
|
18
19
|
.aside { background: #E5E5E5;}
|
19
20
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
Description:
|
2
|
+
The model generator creates stubs for a new model, corresponding
|
3
|
+
controller and it's views.
|
4
|
+
|
5
|
+
The generator takes a model name as its argument. The model name
|
6
|
+
may be given in CamelCase or under_score and should not be
|
7
|
+
suffixed with anything.
|
8
|
+
|
9
|
+
As additional parameters, the generator will take attribute pairs
|
10
|
+
described by name and type. These attributes will be used to
|
11
|
+
prepopulate the migration to create the table for the model and
|
12
|
+
give you a set of predefined fixture. You don't have to think up
|
13
|
+
all attributes up front, but it's a good idea to add just the
|
14
|
+
baseline of what's needed to start really working with the
|
15
|
+
resource.
|
16
|
+
|
17
|
+
The generator creates a model class in app/models, a test suite in
|
18
|
+
test/unit and test fixtures in test/fixtures/singular_name.yml.
|
19
|
+
The generator creates a controller class in app/controllers with
|
20
|
+
view templates in app/views/controller_name, a helper class in
|
21
|
+
app/helpers, and a functional test suite in test/functional.
|
22
|
+
|
23
|
+
Examples:
|
24
|
+
rails generate hobo:resource account
|
25
|
+
|
26
|
+
This will create an Account model:
|
27
|
+
Model: app/models/account.rb
|
28
|
+
Controller: app/controllers/accounts_controller.rb
|
29
|
+
Helper: app/helpers/accounts_helper.rb
|
30
|
+
Views: app/views/accounts
|
31
|
+
Test: test/unit/account_test.rb
|
32
|
+
Test: test/functions/accounts_controller_test.rb
|
33
|
+
Fixtures: test/fixtures/accounts.yml
|
34
|
+
|
35
|
+
(files generated may vary depending on test suite & fixture configuration)
|
36
|
+
|
37
|
+
rails generate hobo:resource post title:string created_on:date body:text published:boolean
|
38
|
+
|
39
|
+
Creates post model, controller & views with predefined attributes.
|
@@ -34,7 +34,7 @@ module Generators
|
|
34
34
|
routes << link("put '#{records}/:id/#{transition}(.:format)' => '#{records}#do_#{transition}', :as => 'do_#{record}_#{transition}'", transition, :put)
|
35
35
|
routes << link("get '#{records}/:id/#{transition}(.:format)' => '#{records}##{transition}', :as => '#{record}_#{transition}'", transition)
|
36
36
|
end
|
37
|
-
routes.compact
|
37
|
+
routes.compact.uniq
|
38
38
|
end
|
39
39
|
|
40
40
|
def resource_routes
|
@@ -92,7 +92,7 @@ module Generators
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def user_routes
|
95
|
-
return [] unless controller < ::Hobo::Controller::
|
95
|
+
return [] unless controller < ::Hobo::Controller::UserBase
|
96
96
|
prefix = records == "users" ? "" : "#{record}_"
|
97
97
|
[
|
98
98
|
link("match '#{prefix}login(.:format)' => '#{records}#login', :as => '#{record}_login'", 'login'),
|
@@ -23,9 +23,15 @@ module Hobo
|
|
23
23
|
class_option :front_controller_name, :type => :string,
|
24
24
|
:desc => "Front Controller Name", :default => 'front'
|
25
25
|
|
26
|
+
class_option :add_admin_subsite, :type => :boolean,
|
27
|
+
:desc => "Add an Admin Subsite"
|
28
|
+
|
26
29
|
class_option :admin_subsite_name, :type => :string,
|
27
30
|
:desc => "Admin Subsite Name", :default => 'admin'
|
28
31
|
|
32
|
+
class_option :make_front_site, :type => :boolean,
|
33
|
+
:desc => "Rename application.dryml to front_site.dryml", :default => 'true'
|
34
|
+
|
29
35
|
class_option :private_site, :type => :boolean,
|
30
36
|
:desc => "Make the site unaccessible to non-members"
|
31
37
|
|
@@ -113,7 +119,8 @@ NOTE: You might want to sign up as the administrator before adding this!
|
|
113
119
|
end
|
114
120
|
inject_into_file 'app/controllers/application_controller.rb', <<EOI, :after => "protect_from_forgery\n" if private_site
|
115
121
|
include Hobo::Controller::AuthenticationSupport
|
116
|
-
before_filter :except => [:login, :forgot_password, :accept_invitation, :do_accept_invitation, :reset_password
|
122
|
+
before_filter :except => [:login, :forgot_password, :accept_invitation, :do_accept_invitation, :reset_password,
|
123
|
+
:do_reset_password] do
|
117
124
|
login_required unless #{@user_resource_name.camelize}.count == 0
|
118
125
|
end
|
119
126
|
EOI
|
@@ -153,12 +160,17 @@ EOI
|
|
153
160
|
end
|
154
161
|
|
155
162
|
def admin_subsite
|
156
|
-
return unless @invite_only
|
157
163
|
if wizard?
|
158
164
|
say_title 'Admin Subsite'
|
159
|
-
@
|
165
|
+
if @invite_only || (@add_admin_subsite = yes_no?("Do you want an admin subsite?"))
|
166
|
+
@admin_subsite_name = ask("Choose a name for the admin subsite: [<enter>=admin|<custom_name>]", 'admin')
|
167
|
+
@make_front_site = yes_no?("Do you want to use a separate front_site.dryml?")
|
168
|
+
end
|
160
169
|
else
|
161
|
-
@
|
170
|
+
if @invite_only || (@add_admin_subsite = options[:add_admin_subsite])
|
171
|
+
@admin_subsite_name = options[:admin_subsite_name]
|
172
|
+
@make_front_site = options[:make_front_site]
|
173
|
+
end
|
162
174
|
end
|
163
175
|
end
|
164
176
|
|
@@ -168,11 +180,13 @@ EOI
|
|
168
180
|
:invite_only => @invite_only,
|
169
181
|
:activation_email => @activation_email,
|
170
182
|
:admin_subsite_name => @admin_subsite_name
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
183
|
+
if @invite_only || @add_admin_subsite
|
184
|
+
say "Installing admin subsite..."
|
185
|
+
invoke 'hobo:admin_subsite', [@admin_subsite_name],
|
186
|
+
:user_resource_name => @user_resource_name,
|
187
|
+
:invite_only => @invite_only,
|
188
|
+
:make_front_site => @make_front_site
|
189
|
+
end
|
176
190
|
end
|
177
191
|
|
178
192
|
def generate_migration
|
@@ -1,4 +1,14 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'thor/parser/option'
|
3
|
+
|
4
|
+
# we want the option :make_front_site required even if it is boolean
|
5
|
+
# Thor does not allow it, so we patch it
|
6
|
+
class Thor
|
7
|
+
class Option
|
8
|
+
def validate!; end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
2
12
|
module Generators
|
3
13
|
module Hobo
|
4
14
|
Subsite = classy_module do
|
@@ -7,8 +17,9 @@ module Generators
|
|
7
17
|
include Generators::Hobo::Taglib
|
8
18
|
|
9
19
|
class_option :make_front_site,
|
10
|
-
|
11
|
-
|
20
|
+
:type => :boolean,
|
21
|
+
:required => true,
|
22
|
+
:desc => "Rename application.dryml to front_site.dryml"
|
12
23
|
|
13
24
|
# check_class_collision :suffix => 'SiteController'
|
14
25
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Description:
|
2
|
+
|
3
|
+
Creates a subsite, a namespaced section of your application.
|
4
|
+
|
5
|
+
Controllers for the subsite are created in
|
6
|
+
app/controllers/<subsite_name>/ and views are also in their own
|
7
|
+
subdirectory. This allows you to have two different controllers
|
8
|
+
and two different sets of views for the same model.
|
9
|
+
|
10
|
+
The subsite will use app/views/taglibs/<subsite_name>_site.dryml
|
11
|
+
as well as app/views/taglibs/application.dryml. This allows you
|
12
|
+
to customize the look and feel of a portion of your site. The
|
13
|
+
remaining views of your application that are not under a subsite
|
14
|
+
load both application.dryml and front_site.dryml.
|
15
|
+
|
16
|
+
It is thus recommended that you ensure that
|
17
|
+
<subsite_name>_site.dryml and application.dryml do not repeat
|
18
|
+
code, such as the inclusion of rapid or the setting of the theme.
|
19
|
+
One easy way of ensuring this is to use the --make-front-site
|
20
|
+
option. If you have already accounted for this, use
|
21
|
+
--make-front-site=false.
|
22
|
+
|
23
|
+
The difference between hobo:admin_site and hobo:subsite is that
|
24
|
+
hobo:admin_site limits the subsite to use by administrators only.
|
@@ -4,6 +4,9 @@ class <%= class_name %>Controller < ApplicationController
|
|
4
4
|
|
5
5
|
auto_actions :all, :except => [ :index, :new, :create ]
|
6
6
|
|
7
|
+
# Normally, users should be created via the user lifecycle, except
|
8
|
+
# for the initial user created via the form on the front screen on
|
9
|
+
# first run. This method creates the initial user.
|
7
10
|
def create
|
8
11
|
hobo_create do
|
9
12
|
if valid?
|
@@ -1,12 +1,5 @@
|
|
1
1
|
Description:
|
2
|
-
The model generator creates stubs for a new user model.
|
3
2
|
|
4
|
-
|
5
|
-
model
|
6
|
-
should not be suffixed with 'Model'.
|
3
|
+
This generator is used by the user_resource generator to generate a
|
4
|
+
user model file into app/models.
|
7
5
|
|
8
|
-
The generator creates a model class in app/models, invokes
|
9
|
-
the hobo:user_mailer andgenerator the test framework.
|
10
|
-
|
11
|
-
Examples:
|
12
|
-
$ rails generate hobo:user_model User
|
data/lib/hobo.rb
CHANGED
@@ -50,28 +50,6 @@ module Hobo
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
# Redirect as appropriate when an access request fails.
|
54
|
-
#
|
55
|
-
# The default action is to redirect to the login screen.
|
56
|
-
#
|
57
|
-
# Override this method in your controllers if you want to have special
|
58
|
-
# behavior in case the user is not authorized
|
59
|
-
# to access the requested action. For example, a popup window might
|
60
|
-
# simply close itself.
|
61
|
-
def access_denied(user_model)
|
62
|
-
respond_to do |accepts|
|
63
|
-
accepts.html do
|
64
|
-
store_location
|
65
|
-
redirect_to(login_url(user_model))
|
66
|
-
end
|
67
|
-
accepts.xml do
|
68
|
-
headers["Status"] = "Unauthorized"
|
69
|
-
headers["WWW-Authenticate"] = %(Basic realm="Web Password")
|
70
|
-
render :text => t("hobo.messages.unauthenticated", :default=>["Couldn't authenticate you"]), :status => '401 Unauthorized'
|
71
|
-
end
|
72
|
-
end
|
73
|
-
false
|
74
|
-
end
|
75
53
|
|
76
54
|
# Store the URI of the current request in the session.
|
77
55
|
#
|
@@ -129,13 +129,15 @@ module Hobo
|
|
129
129
|
def auto_actions(*args)
|
130
130
|
options = args.extract_options!
|
131
131
|
|
132
|
-
@auto_actions =
|
132
|
+
@auto_actions = args.map do |arg|
|
133
|
+
case arg
|
133
134
|
when :all then available_auto_actions
|
134
|
-
when :write_only then available_auto_write_actions
|
135
|
-
when :read_only then available_auto_read_actions
|
136
|
-
when :lifecycle then available_auto_lifecycle_actions
|
137
|
-
else
|
138
|
-
|
135
|
+
when :write_only then available_auto_write_actions
|
136
|
+
when :read_only then available_auto_read_actions
|
137
|
+
when :lifecycle then available_auto_lifecycle_actions
|
138
|
+
else arg
|
139
|
+
end
|
140
|
+
end.flatten.uniq
|
139
141
|
|
140
142
|
except = Array(options[:except])
|
141
143
|
except_actions = except.map do |arg|
|
@@ -143,9 +145,9 @@ module Hobo
|
|
143
145
|
when :lifecycle then available_auto_lifecycle_actions
|
144
146
|
else arg
|
145
147
|
end
|
146
|
-
end
|
148
|
+
end.flatten.uniq
|
147
149
|
|
148
|
-
@auto_actions -= except_actions
|
150
|
+
@auto_actions -= except_actions
|
149
151
|
|
150
152
|
def_auto_actions
|
151
153
|
end
|
@@ -785,16 +787,16 @@ module Hobo
|
|
785
787
|
|
786
788
|
|
787
789
|
def this
|
788
|
-
@this ||= (instance_variable_get("@#{model.name.underscore}") ||
|
789
|
-
instance_variable_get("@#{model.name.underscore.pluralize}"))
|
790
|
+
@this ||= (instance_variable_get("@#{model.name.demodulize.underscore}") ||
|
791
|
+
instance_variable_get("@#{model.name.demodulize.underscore.pluralize}"))
|
790
792
|
end
|
791
793
|
|
792
794
|
|
793
795
|
def this=(object)
|
794
|
-
ivar = if object.is_a?(Array)
|
795
|
-
(object.try.member_class || model).name.underscore.pluralize
|
796
|
+
ivar = if object.is_a?(Array) || object.respond_to?(:member_class)
|
797
|
+
(object.try.member_class || model).name.demodulize.underscore.pluralize
|
796
798
|
else
|
797
|
-
object.class.name.underscore
|
799
|
+
object.class.name.demodulize.underscore
|
798
800
|
end
|
799
801
|
@this = instance_variable_set("@#{ivar}", object)
|
800
802
|
end
|