goldberg_generator 0.2.2
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/USAGE +34 -0
- data/goldberg_generator.rb +463 -0
- data/templates/README_GOLDBERG +22 -0
- data/templates/app/views/layouts/application.rhtml +80 -0
- data/templates/layouts/ewnf/README +8 -0
- data/templates/layouts/ewnf/app/views/layouts/application.rhtml +74 -0
- data/templates/layouts/ewnf/public/images/bg.gif +0 -0
- data/templates/layouts/ewnf/public/images/daddy_rightarrow.gif +0 -0
- data/templates/layouts/ewnf/public/images/sample.jpg +0 -0
- data/templates/layouts/ewnf/public/images/title_img.jpg +0 -0
- data/templates/layouts/ewnf/public/stylesheets/layout.css +223 -0
- data/templates/layouts/snooker/app/views/layouts/application.rhtml +74 -0
- data/templates/layouts/snooker/public/images/column_200.png +0 -0
- data/templates/layouts/snooker/public/images/daddy_rightarrow.gif +0 -0
- data/templates/layouts/snooker/public/images/footer_bg.png +0 -0
- data/templates/layouts/snooker/public/images/logo.jpg +0 -0
- data/templates/layouts/snooker/public/stylesheets/layout.css +183 -0
- data/templates/layouts/spoiled_brat/LICENSE.txt +211 -0
- data/templates/layouts/spoiled_brat/README +8 -0
- data/templates/layouts/spoiled_brat/app/views/layouts/application.rhtml +71 -0
- data/templates/layouts/spoiled_brat/public/images/blockquote-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/body-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/centerColumn-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/daddy_leftarrow.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/h2-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/h3-bg.gif +0 -0
- data/templates/layouts/spoiled_brat/public/images/header-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/hr-bg.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/images/logo.jpg +0 -0
- data/templates/layouts/spoiled_brat/public/stylesheets/layout.css +379 -0
- data/templates/public/goldberg/images/action.png +0 -0
- data/templates/public/goldberg/images/add.png +0 -0
- data/templates/public/goldberg/images/bodybg.jpg +0 -0
- data/templates/public/goldberg/images/delete.png +0 -0
- data/templates/public/goldberg/images/down.png +0 -0
- data/templates/public/goldberg/images/footerbg.jpg +0 -0
- data/templates/public/goldberg/images/logo_right.jpg +0 -0
- data/templates/public/goldberg/images/menuhover.jpg +0 -0
- data/templates/public/goldberg/images/page.png +0 -0
- data/templates/public/goldberg/images/permission.png +0 -0
- data/templates/public/goldberg/images/role.png +0 -0
- data/templates/public/goldberg/images/up.png +0 -0
- data/templates/public/goldberg/javascripts/suckerfish.js +12 -0
- data/templates/public/goldberg/stylesheets/goldberg.css +142 -0
- data/templates/public/goldberg/stylesheets/layout.css +321 -0
- data/templates/public/goldberg/stylesheets/suckerfish.css +124 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/auth_controller.rb +104 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/content_pages_controller.rb +197 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/controller_actions_controller.rb +134 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/menu_items_controller.rb +184 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/permissions_controller.rb +60 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_controller.rb +85 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/roles_permissions_controller.rb +65 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/site_controllers_controller.rb +157 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/system_settings_controller.rb +75 -0
- data/templates/vendor/plugins/goldberg/app/controllers/goldberg/users_controller.rb +293 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/auth_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/content_pages_helper.rb +23 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/controller_actions_helper.rb +5 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/menu_items_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/permissions_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/roles_permissions_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/site_controllers_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/system_settings_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/helpers/goldberg/users_helper.rb +4 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/content_page.rb +134 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/controller_action.rb +86 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/credentials.rb +128 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/menu.rb +198 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/menu_item.rb +127 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/permission.rb +37 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/role.rb +68 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/roles_permission.rb +18 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/site_controller.rb +59 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/system_settings.rb +112 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/user.rb +69 -0
- data/templates/vendor/plugins/goldberg/app/models/goldberg/user_mailer.rb +43 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/_login.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/login.rhtml +22 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/auth/logout.rhtml +2 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_create_folder.rxml +6 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_fck_files.rxml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/_form.rhtml +32 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/edit.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/fck_speller_pages.rhtml +58 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/list.rhtml +22 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/show.rhtml +57 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view.rhtml +1 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/content_pages/view_default.rhtml +1 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/_form.rhtml +53 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/list.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/new.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/controller_actions/show.rhtml +13 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_js.rhtml +52 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/layouts/_tabpanel_list.rhtml +7 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_breadcrumbs.rhtml +5 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_form.rhtml +42 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_list.rhtml +52 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_item_parent_list.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_menubar.rhtml +21 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/_suckerfish.rhtml +14 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/edit.rhtml +10 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list-original.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/list.rhtml +16 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/new.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/menu_items/show.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/_form.rhtml +7 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/list.rhtml +14 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/permissions/show.rhtml +38 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/_form.rhtml +18 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/list.rhtml +21 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles/show.rhtml +79 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/_form.rhtml +13 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/list.rhtml +24 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/new_permission_for_role.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/roles_permissions/show.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_form.rhtml +15 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/_list.rhtml +26 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/list.rhtml +107 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/site_controllers/show.rhtml +38 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/_form.rhtml +71 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/edit.rhtml +9 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/list.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/new.rhtml +8 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/system_settings/show.rhtml +189 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/confirmation_request.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password.rhtml +17 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/user_mailer/reset_password_request.rhtml +23 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/_form.rhtml +53 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration.rhtml +26 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/confirm_registration_submit.rhtml +4 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/create.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/edit.rhtml +11 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password.rhtml +27 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/forgot_password_submit.rhtml +4 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/list.rhtml +18 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/new.rhtml +19 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password.rhtml +11 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/reset_password_submit.rhtml +3 -0
- data/templates/vendor/plugins/goldberg/app/views/goldberg/users/show.rhtml +33 -0
- data/templates/vendor/plugins/goldberg/db/ContentPage.yml +466 -0
- data/templates/vendor/plugins/goldberg/db/ControllerAction.yml +162 -0
- data/templates/vendor/plugins/goldberg/db/MenuItem.yml +109 -0
- data/templates/vendor/plugins/goldberg/db/Permission.yml +21 -0
- data/templates/vendor/plugins/goldberg/db/Role.yml +493 -0
- data/templates/vendor/plugins/goldberg/db/RolesPermission.yml +26 -0
- data/templates/vendor/plugins/goldberg/db/SiteController.yml +61 -0
- data/templates/vendor/plugins/goldberg/db/SystemSettings.yml +21 -0
- data/templates/vendor/plugins/goldberg/db/User.yml +15 -0
- data/templates/vendor/plugins/goldberg/db/migrate/001_initial_setup.rb +128 -0
- data/templates/vendor/plugins/goldberg/db/migrate/002_menu_rest_items_users_cached_content_pages.rb +26 -0
- data/templates/vendor/plugins/goldberg/db/migrate/003_self_registration.rb +54 -0
- data/templates/vendor/plugins/goldberg/db/migrate/004_column_fixes.rb +119 -0
- data/templates/vendor/plugins/goldberg/init.rb +13 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg.rb +37 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/controller.rb +11 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/filters.rb +197 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/helper.rb +66 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/migration.rb +113 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/migrator.rb +128 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/model.rb +110 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/routes.rb +49 -0
- data/templates/vendor/plugins/goldberg/lib/goldberg/test_helper.rb +82 -0
- data/templates/vendor/plugins/goldberg/tasks/goldberg_tasks.rake +47 -0
- data/templates/vendor/plugins/goldberg/test/functional/content_pages_controller_test.rb +31 -0
- data/templates/vendor/plugins/goldberg/test/integration/security_test.rb +134 -0
- data/templates/vendor/plugins/goldberg/test/test_helper.rb +40 -0
- data/templates/vendor/plugins/goldberg/test/unit/content_page_test.rb +87 -0
- data/templates/vendor/plugins/goldberg/test/unit/controller_action_test.rb +85 -0
- data/templates/vendor/plugins/goldberg/test/unit/menu_item_test.rb +46 -0
- data/templates/vendor/plugins/goldberg/test/unit/permission_test.rb +35 -0
- data/templates/vendor/plugins/goldberg/test/unit/site_controller_test.rb +53 -0
- data/templates/vendor/plugins/goldberg/test/unit/system_settings_test.rb +71 -0
- data/templates/vendor/plugins/goldberg/test/unit/user_test.rb +104 -0
- metadata +310 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
module Goldberg
|
|
2
|
+
class MenuItem < ActiveRecord::Base
|
|
3
|
+
include Goldberg::Model
|
|
4
|
+
|
|
5
|
+
validates_presence_of :name, :label
|
|
6
|
+
validates_uniqueness_of :name
|
|
7
|
+
|
|
8
|
+
attr_accessor :controller_action, :content_page
|
|
9
|
+
|
|
10
|
+
def above
|
|
11
|
+
if self.parent_id
|
|
12
|
+
conditions =
|
|
13
|
+
["parent_id = ? and seq = ?", self.parent_id, self.seq - 1]
|
|
14
|
+
else
|
|
15
|
+
conditions =
|
|
16
|
+
["parent_id is null and seq = ?", self.seq - 1]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
return MenuItem.find(:first,
|
|
20
|
+
:conditions => conditions)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def below
|
|
25
|
+
if self.parent_id
|
|
26
|
+
conditions =
|
|
27
|
+
["parent_id = ? and seq = ?", self.parent_id, self.seq + 1]
|
|
28
|
+
else
|
|
29
|
+
conditions =
|
|
30
|
+
["parent_id is null and seq = ?", self.seq + 1]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return MenuItem.find(:first,
|
|
34
|
+
:conditions => conditions)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def MenuItem.repack(repack_id)
|
|
39
|
+
if repack_id
|
|
40
|
+
items = MenuItem.find(:all,
|
|
41
|
+
:conditions => "parent_id = #{repack_id}",
|
|
42
|
+
:order => 'seq')
|
|
43
|
+
else
|
|
44
|
+
items = MenuItem.find(:all,
|
|
45
|
+
:conditions => "parent_id is null",
|
|
46
|
+
:order => 'seq')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
seq = 1
|
|
50
|
+
for item in items do
|
|
51
|
+
item.seq = seq
|
|
52
|
+
item.save!
|
|
53
|
+
seq += 1
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def MenuItem.next_seq(parent_id)
|
|
59
|
+
if parent_id and parent_id.to_i > 0
|
|
60
|
+
next_seq = MenuItem.find_by_sql("select coalesce(max(seq) + 1, 1) as seq from #{prefix}menu_items where parent_id = #{parent_id}")
|
|
61
|
+
else
|
|
62
|
+
next_seq = MenuItem.find_by_sql("select coalesce(max(seq) + 1, 1) as seq from #{prefix}menu_items where parent_id is null")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if next_seq
|
|
66
|
+
return next_seq[0].seq
|
|
67
|
+
else
|
|
68
|
+
return 1
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def MenuItem.items_for_permissions(permission_ids = nil)
|
|
74
|
+
# Hash for faster & easier lookups
|
|
75
|
+
if permission_ids
|
|
76
|
+
perms = {}
|
|
77
|
+
for id in permission_ids do
|
|
78
|
+
perms[id] = true
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# List of items to return
|
|
83
|
+
items = []
|
|
84
|
+
|
|
85
|
+
menu_items = self.find(:all,
|
|
86
|
+
:order => 'parent_id, seq, id')
|
|
87
|
+
for item in menu_items do
|
|
88
|
+
if item.controller_action_id.to_i > 0
|
|
89
|
+
item.controller_action =
|
|
90
|
+
ControllerAction.find(item.controller_action_id)
|
|
91
|
+
if perms
|
|
92
|
+
if perms.has_key?(item.controller_action.effective_permission.id)
|
|
93
|
+
items << item
|
|
94
|
+
end
|
|
95
|
+
else
|
|
96
|
+
items << item
|
|
97
|
+
end
|
|
98
|
+
elsif item.content_page_id.to_i > 0
|
|
99
|
+
item.content_page =
|
|
100
|
+
ContentPage.find(item.content_page_id)
|
|
101
|
+
if perms
|
|
102
|
+
if perms.has_key?(item.content_page.permission_id)
|
|
103
|
+
items << item
|
|
104
|
+
end
|
|
105
|
+
else
|
|
106
|
+
items << item
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
return items
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
protected
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def validate
|
|
119
|
+
unless self.content_page_id.to_i != 0 || controller_action_id.to_i != 0
|
|
120
|
+
errors.add(:content_page_id, 'A menu item must be attached to either a content page or a controller / action')
|
|
121
|
+
errors.add(:controller_action_id, 'A menu item must be attached to either a content page or a controller / action')
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Goldberg
|
|
2
|
+
class Permission < ActiveRecord::Base
|
|
3
|
+
include Goldberg::Model
|
|
4
|
+
|
|
5
|
+
has_many :content_pages
|
|
6
|
+
has_many :site_controllers
|
|
7
|
+
has_many :controller_actions
|
|
8
|
+
|
|
9
|
+
validates_presence_of :name
|
|
10
|
+
validates_uniqueness_of :name
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
# Find Permissions for a Role ID or an array of Role IDs.
|
|
14
|
+
def find_for_role(role_ids)
|
|
15
|
+
return find_by_sql( ["select p.* from #{prefix}permissions p inner join #{prefix}roles_permissions rp on p.id = rp.permission_id where role_id in (?) order by p.name", role_ids] )
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Find all Permissions for a Role. This method gets the hierarchy
|
|
20
|
+
# for the given Role and uses that to get all the Permissions for
|
|
21
|
+
# the Role and its ancestors.
|
|
22
|
+
def find_all_for_role(role)
|
|
23
|
+
roles = role.get_parents
|
|
24
|
+
roles << role
|
|
25
|
+
return find_for_role(roles.collect(&:id))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Find Permissions that are not already associated with the given
|
|
30
|
+
# Role ID.
|
|
31
|
+
def find_not_for_role(role_id)
|
|
32
|
+
return find_by_sql( ["select p.* from #{prefix}permissions p where id not in (select permission_id from #{prefix}roles_permissions rp where role_id in (?)) order by name", role_id] )
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end # class << self
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require "goldberg/credentials"
|
|
2
|
+
require "goldberg/menu"
|
|
3
|
+
|
|
4
|
+
module Goldberg
|
|
5
|
+
class Role < ActiveRecord::Base
|
|
6
|
+
include Goldberg::Model
|
|
7
|
+
|
|
8
|
+
has_many :users
|
|
9
|
+
|
|
10
|
+
validates_presence_of :name
|
|
11
|
+
validates_uniqueness_of :name
|
|
12
|
+
|
|
13
|
+
serialize :cache
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
def Role.rebuild_cache
|
|
17
|
+
roles = Role.find(:all)
|
|
18
|
+
|
|
19
|
+
for role in roles do
|
|
20
|
+
role.cache = nil ; role.save # we have to do this to clear it
|
|
21
|
+
|
|
22
|
+
role.cache = Hash.new
|
|
23
|
+
role.rebuild_credentials
|
|
24
|
+
role.rebuild_menu
|
|
25
|
+
role.save
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end # class << self
|
|
29
|
+
|
|
30
|
+
def rebuild_credentials
|
|
31
|
+
self.cache[:credentials] = Credentials.new(self.id)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def rebuild_menu
|
|
35
|
+
menu = Menu.new(self)
|
|
36
|
+
self.cache[:menu] = menu
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get_parents
|
|
40
|
+
parents = Array.new
|
|
41
|
+
seen = Hash.new
|
|
42
|
+
|
|
43
|
+
current = self.id
|
|
44
|
+
|
|
45
|
+
while current
|
|
46
|
+
role = Role.find(current)
|
|
47
|
+
if role
|
|
48
|
+
if not seen.has_key?(role.id)
|
|
49
|
+
parents << role
|
|
50
|
+
seen[role.id] = true
|
|
51
|
+
current = role.parent_id
|
|
52
|
+
else
|
|
53
|
+
current = nil
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
current = nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
return parents
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def get_start_path
|
|
64
|
+
self.start_path || Goldberg.settings.get_start_path
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Goldberg
|
|
2
|
+
class RolesPermission < ActiveRecord::Base
|
|
3
|
+
include Goldberg::Model
|
|
4
|
+
|
|
5
|
+
validates_presence_of :role_id, :permission_id
|
|
6
|
+
|
|
7
|
+
def RolesPermission.find_for_role(role_ids)
|
|
8
|
+
querystr = <<-END
|
|
9
|
+
select rp.*, p.name
|
|
10
|
+
from #{prefix}roles_permissions rp inner join #{prefix}permissions p
|
|
11
|
+
on rp.permission_id = p.id
|
|
12
|
+
where role_id in (?) order by p.name
|
|
13
|
+
END
|
|
14
|
+
return find_by_sql([querystr, role_ids])
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Goldberg
|
|
2
|
+
class SiteController < ActiveRecord::Base
|
|
3
|
+
include Goldberg::Model
|
|
4
|
+
|
|
5
|
+
belongs_to :permission
|
|
6
|
+
has_many :controller_actions, :order => 'name', :dependent => :destroy
|
|
7
|
+
|
|
8
|
+
validates_presence_of :name, :permission_id
|
|
9
|
+
validates_uniqueness_of :name
|
|
10
|
+
|
|
11
|
+
def self.classes
|
|
12
|
+
for path in ActionController::Routing.controller_paths do
|
|
13
|
+
self.load_class_files(path)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
classes = Hash.new
|
|
17
|
+
|
|
18
|
+
ObjectSpace.each_object(Class) do |klass|
|
|
19
|
+
if klass.respond_to? :controller_path
|
|
20
|
+
if (klass.to_s != ApplicationController.to_s and
|
|
21
|
+
klass.ancestors.map{|c|c.to_s}.include?(ApplicationController.to_s))
|
|
22
|
+
classes[klass.controller_path] = klass
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
return classes
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def self.load_class_files(path)
|
|
32
|
+
prereqs = []
|
|
33
|
+
files = []
|
|
34
|
+
dirs = []
|
|
35
|
+
for file in Dir.glob("#{path}/*").sort do
|
|
36
|
+
if file.match /_controller\.rb$/
|
|
37
|
+
files << file
|
|
38
|
+
elsif file.match /\.rb$/
|
|
39
|
+
prereqs << file
|
|
40
|
+
elsif File.directory? file
|
|
41
|
+
dirs << file
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
(prereqs + files).each do |file|
|
|
46
|
+
begin
|
|
47
|
+
load file
|
|
48
|
+
rescue
|
|
49
|
+
logger.info "Couldn't load file '#{file}' (already loaded?)"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
dirs.each do |dir|
|
|
54
|
+
self.load_class_files(dir)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module Goldberg
|
|
2
|
+
class SystemSettings < ActiveRecord::Base
|
|
3
|
+
set_table_name 'system_settings'
|
|
4
|
+
include Goldberg::Model
|
|
5
|
+
|
|
6
|
+
attr_accessor :public_role, :default_markup_style
|
|
7
|
+
attr_accessor :site_default_page, :not_found_page, :permission_denied_page,
|
|
8
|
+
:session_expired_page
|
|
9
|
+
|
|
10
|
+
# Make sure that all the standard pages have been set.
|
|
11
|
+
validates_presence_of :public_role_id, :site_default_page_id, :not_found_page_id,
|
|
12
|
+
:permission_denied_page_id, :session_expired_page_id
|
|
13
|
+
|
|
14
|
+
# If self-reg is enabled, ensure there is a self-reg role set.
|
|
15
|
+
validates_each :self_reg_enabled do |record, attr, value|
|
|
16
|
+
result = true
|
|
17
|
+
if value and not (record.self_reg_role_id and record.self_reg_role_id > 0)
|
|
18
|
+
record.errors.add attr, <<-END
|
|
19
|
+
If self-registration is enabled, you must specify the default Role to
|
|
20
|
+
assign to self-registered users.
|
|
21
|
+
END
|
|
22
|
+
result = false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if value and not (record.self_reg_confirmation_error_page_id and
|
|
26
|
+
record.self_reg_confirmation_error_page_id > 0)
|
|
27
|
+
record.errors.add attr, <<-END
|
|
28
|
+
If self-registration is enabled, you must specify an error page to be
|
|
29
|
+
displayed to any users who try to access the site, but who are not yet
|
|
30
|
+
confirmed.
|
|
31
|
+
END
|
|
32
|
+
result = false
|
|
33
|
+
end
|
|
34
|
+
result
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def public_role
|
|
38
|
+
@public_role ||= Role.find(self.public_role_id)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def site_default_page
|
|
42
|
+
@site_default_page ||= ContentPage.find(self.site_default_page_id)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def not_found_page
|
|
46
|
+
@not_found_page ||= ContentPage.find(self.not_found_page_id)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def permission_denied_page
|
|
50
|
+
@permission_denied_page ||= ContentPage.find(self.permission_denied_page_id)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def session_expired_page
|
|
54
|
+
@session_expired_page ||= ContentPage.find(self.session_expired_page_id)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self_reg_confirmation_error_page
|
|
58
|
+
@self_reg_confirmation_error_page ||=
|
|
59
|
+
ContentPage.find(self.self_reg_confirmation_error_page_id)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Returns an array of system page settings for a given page,
|
|
63
|
+
# or nil if the page is not a system page.
|
|
64
|
+
def system_pages(pageid)
|
|
65
|
+
pages = Array.new
|
|
66
|
+
|
|
67
|
+
if self.site_default_page_id == pageid
|
|
68
|
+
pages << "Site default page"
|
|
69
|
+
end
|
|
70
|
+
if self.not_found_page_id == pageid
|
|
71
|
+
pages << "Not found page"
|
|
72
|
+
end
|
|
73
|
+
if self.permission_denied_page_id == pageid
|
|
74
|
+
pages << "Permission denied page"
|
|
75
|
+
end
|
|
76
|
+
if self.session_expired_page_id == pageid
|
|
77
|
+
pages << "Session expired page"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if self.self_reg_confirmation_error_page_id == pageid
|
|
81
|
+
pages << "Self-registration confirmation error page"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
if pages.length > 0
|
|
85
|
+
return pages
|
|
86
|
+
else
|
|
87
|
+
return nil
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def get_start_path
|
|
92
|
+
if self.start_path and self.start_path.length > 0
|
|
93
|
+
self.start_path
|
|
94
|
+
else
|
|
95
|
+
"/"
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self_reg_role
|
|
100
|
+
@self_reg_role ||= self.self_reg_role_id ? Role.find(self.self_reg_role_id) :
|
|
101
|
+
Role.new(:id => nil, :name => '(none)')
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self_reg_confirmation_error_page
|
|
105
|
+
@self_reg_confirmation_error_page ||= (self.self_reg_confirmation_error_page_id ?
|
|
106
|
+
ContentPage.find(self.self_reg_confirmation_error_page_id) :
|
|
107
|
+
ContentPage.new(:id => nil, :name => '(none)')
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'digest/sha1'
|
|
2
|
+
|
|
3
|
+
module Goldberg
|
|
4
|
+
class User < ActiveRecord::Base
|
|
5
|
+
include Goldberg::Model
|
|
6
|
+
|
|
7
|
+
belongs_to :role
|
|
8
|
+
|
|
9
|
+
validates_presence_of :name, :role_id, :password
|
|
10
|
+
validates_uniqueness_of :name
|
|
11
|
+
|
|
12
|
+
attr_accessor :clear_password
|
|
13
|
+
attr_accessor :confirm_password
|
|
14
|
+
|
|
15
|
+
def before_validation
|
|
16
|
+
if self.clear_password # Only update password if changed
|
|
17
|
+
self.password_salt = self.object_id.to_s + rand.to_s
|
|
18
|
+
self.password = Digest::SHA1.hexdigest(self.password_salt +
|
|
19
|
+
self.clear_password)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def before_save
|
|
24
|
+
if self.self_reg_confirmation_required
|
|
25
|
+
self.set_confirmation_key
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def after_save
|
|
30
|
+
self.clear_password = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def check_password(clear_password)
|
|
34
|
+
self.password == Digest::SHA1.hexdigest(self.password_salt.to_s +
|
|
35
|
+
clear_password)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def set_confirmation_key
|
|
39
|
+
self.confirmation_key = Digest::SHA1.hexdigest(self.object_id.to_s +
|
|
40
|
+
rand.to_s)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def email_valid?
|
|
44
|
+
self.email &&
|
|
45
|
+
self.email.length > 0 &&
|
|
46
|
+
# http://regexlib.com/DisplayPatterns.aspx
|
|
47
|
+
self.email =~ /\A.+@[^\.].*\.[a-z]{2,}\z/
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def get_start_path
|
|
51
|
+
if self.start_path and self.start_path.length > 0
|
|
52
|
+
self.start_path
|
|
53
|
+
else
|
|
54
|
+
self.role.get_start_path
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
class << self
|
|
59
|
+
def random_password
|
|
60
|
+
letters = ('A' .. 'Z').to_a + ('a' .. 'z').to_a
|
|
61
|
+
password = (1 .. 6).collect do
|
|
62
|
+
letters[ (rand * letters.length).to_i ]
|
|
63
|
+
end
|
|
64
|
+
password.to_s
|
|
65
|
+
end
|
|
66
|
+
end # class methods
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|