hobo 1.3.0.pre31 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|