caboose-cms 0.0.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.
Files changed (100) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +4 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/caboose/application.js +36 -0
  5. data/app/assets/javascripts/caboose/login.js +21 -0
  6. data/app/assets/javascripts/caboose/permissions.js +0 -0
  7. data/app/assets/javascripts/caboose/roles.js +35 -0
  8. data/app/assets/javascripts/caboose/users.js +38 -0
  9. data/app/assets/stylesheets/caboose/application.css +15 -0
  10. data/app/assets/stylesheets/caboose/caboose.css +28 -0
  11. data/app/controllers/caboose/admin_controller.rb +19 -0
  12. data/app/controllers/caboose/application_controller.rb +109 -0
  13. data/app/controllers/caboose/login_controller.rb +40 -0
  14. data/app/controllers/caboose/logout_controller.rb +9 -0
  15. data/app/controllers/caboose/pages_controller.rb +304 -0
  16. data/app/controllers/caboose/permissions_controller.rb +83 -0
  17. data/app/controllers/caboose/roles_controller.rb +109 -0
  18. data/app/controllers/caboose/users_controller.rb +117 -0
  19. data/app/helpers/caboose/application_helper.rb +4 -0
  20. data/app/helpers/caboose/permissions_helper.rb +4 -0
  21. data/app/models/caboose/approval_request.rb +13 -0
  22. data/app/models/caboose/asset.rb +23 -0
  23. data/app/models/caboose/caboose_plugin.rb +15 -0
  24. data/app/models/caboose/menu_block.rb +6 -0
  25. data/app/models/caboose/page.rb +329 -0
  26. data/app/models/caboose/page_bar_generator.rb +157 -0
  27. data/app/models/caboose/page_permission.rb +7 -0
  28. data/app/models/caboose/permission.rb +14 -0
  29. data/app/models/caboose/role.rb +50 -0
  30. data/app/models/caboose/std_class.rb +8 -0
  31. data/app/models/caboose/user.rb +47 -0
  32. data/app/views/caboose/admin/index.html.erb +5 -0
  33. data/app/views/caboose/application/show.html.erb +2 -0
  34. data/app/views/caboose/extras/error.html.erb +2 -0
  35. data/app/views/caboose/extras/error404.html.erb +0 -0
  36. data/app/views/caboose/login/index.html.erb +26 -0
  37. data/app/views/caboose/pages/edit.html.erb +45 -0
  38. data/app/views/caboose/pages/index.html.erb +34 -0
  39. data/app/views/caboose/pages/new.html.erb +23 -0
  40. data/app/views/caboose/pages/show.html.erb +2 -0
  41. data/app/views/caboose/pages/update_pic.html.erb +16 -0
  42. data/app/views/caboose/pages/update_resume.html.erb +14 -0
  43. data/app/views/caboose/permissions/edit.html.erb +6 -0
  44. data/app/views/caboose/permissions/index.html.erb +25 -0
  45. data/app/views/caboose/permissions/new.html.erb +5 -0
  46. data/app/views/caboose/permissions/show.html.erb +15 -0
  47. data/app/views/caboose/roles/edit.html.erb +36 -0
  48. data/app/views/caboose/roles/index.html.erb +17 -0
  49. data/app/views/caboose/roles/new.html.erb +16 -0
  50. data/app/views/caboose/roles/show.html.erb +20 -0
  51. data/app/views/caboose/users/edit.html.erb +45 -0
  52. data/app/views/caboose/users/index.html.erb +34 -0
  53. data/app/views/caboose/users/new.html.erb +22 -0
  54. data/app/views/caboose/users/update_pic.html.erb +16 -0
  55. data/app/views/caboose/users/update_resume.html.erb +14 -0
  56. data/app/views/layouts/caboose/application.html.erb +24 -0
  57. data/app/views/layouts/caboose/caboose.html.erb +24 -0
  58. data/app/views/layouts/caboose/error404.html.erb +2 -0
  59. data/app/views/layouts/caboose/station.html.erb +28 -0
  60. data/config/routes.rb +48 -0
  61. data/db/migrate/20130421000000_drop_all_caboose.rb +16 -0
  62. data/db/migrate/20130422000000_create_caboose.rb +147 -0
  63. data/lib/caboose.rb +26 -0
  64. data/lib/caboose/engine.rb +24 -0
  65. data/lib/caboose/version.rb +3 -0
  66. data/lib/tasks/caboose_tasks.rake +4 -0
  67. data/test/caboose_test.rb +7 -0
  68. data/test/dummy/README.rdoc +261 -0
  69. data/test/dummy/Rakefile +7 -0
  70. data/test/dummy/app/assets/javascripts/application.js +15 -0
  71. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  72. data/test/dummy/app/controllers/application_controller.rb +3 -0
  73. data/test/dummy/app/helpers/application_helper.rb +2 -0
  74. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/test/dummy/config.ru +4 -0
  76. data/test/dummy/config/application.rb +59 -0
  77. data/test/dummy/config/boot.rb +10 -0
  78. data/test/dummy/config/database.yml +25 -0
  79. data/test/dummy/config/environment.rb +5 -0
  80. data/test/dummy/config/environments/development.rb +37 -0
  81. data/test/dummy/config/environments/production.rb +67 -0
  82. data/test/dummy/config/environments/test.rb +37 -0
  83. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  84. data/test/dummy/config/initializers/inflections.rb +15 -0
  85. data/test/dummy/config/initializers/mime_types.rb +5 -0
  86. data/test/dummy/config/initializers/secret_token.rb +7 -0
  87. data/test/dummy/config/initializers/session_store.rb +8 -0
  88. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  89. data/test/dummy/config/locales/en.yml +5 -0
  90. data/test/dummy/config/routes.rb +4 -0
  91. data/test/dummy/db/test.sqlite3 +0 -0
  92. data/test/dummy/log/test.log +25 -0
  93. data/test/dummy/public/404.html +26 -0
  94. data/test/dummy/public/422.html +26 -0
  95. data/test/dummy/public/500.html +25 -0
  96. data/test/dummy/public/favicon.ico +0 -0
  97. data/test/dummy/script/rails +6 -0
  98. data/test/integration/navigation_test.rb +10 -0
  99. data/test/test_helper.rb +15 -0
  100. metadata +241 -0
@@ -0,0 +1,83 @@
1
+ class PermissionsController < ApplicationController
2
+ # GET /permissions
3
+ # GET /permissions.json
4
+ def index
5
+ @permissions = Permission.all
6
+
7
+ respond_to do |format|
8
+ format.html # index.html.erb
9
+ format.json { render json: @permissions }
10
+ end
11
+ end
12
+
13
+ # GET /permissions/1
14
+ # GET /permissions/1.json
15
+ def show
16
+ @permission = Permission.find(params[:id])
17
+
18
+ respond_to do |format|
19
+ format.html # show.html.erb
20
+ format.json { render json: @permission }
21
+ end
22
+ end
23
+
24
+ # GET /permissions/new
25
+ # GET /permissions/new.json
26
+ def new
27
+ @permission = Permission.new
28
+
29
+ respond_to do |format|
30
+ format.html # new.html.erb
31
+ format.json { render json: @permission }
32
+ end
33
+ end
34
+
35
+ # GET /permissions/1/edit
36
+ def edit
37
+ @permission = Permission.find(params[:id])
38
+ end
39
+
40
+ # POST /permissions
41
+ # POST /permissions.json
42
+ def create
43
+ @permission = Permission.new(params[:permission])
44
+
45
+ respond_to do |format|
46
+ if @permission.save
47
+ format.html { redirect_to @permission, notice: 'Permission was successfully created.' }
48
+ format.json { render json: @permission, status: :created, location: @permission }
49
+ else
50
+ format.html { render action: "new" }
51
+ format.json { render json: @permission.errors, status: :unprocessable_entity }
52
+ end
53
+ end
54
+ end
55
+
56
+ # PUT /permissions/1
57
+ # PUT /permissions/1.json
58
+ def update
59
+ @permission = Permission.find(params[:id])
60
+
61
+ respond_to do |format|
62
+ if @permission.update_attributes(params[:permission])
63
+ format.html { redirect_to @permission, notice: 'Permission was successfully updated.' }
64
+ format.json { head :no_content }
65
+ else
66
+ format.html { render action: "edit" }
67
+ format.json { render json: @permission.errors, status: :unprocessable_entity }
68
+ end
69
+ end
70
+ end
71
+
72
+ # DELETE /permissions/1
73
+ # DELETE /permissions/1.json
74
+ def destroy
75
+ @permission = Permission.find(params[:id])
76
+ @permission.destroy
77
+
78
+ respond_to do |format|
79
+ format.html { redirect_to permissions_url }
80
+ format.json { head :no_content }
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,109 @@
1
+ module Caboose
2
+ class RolesController < ApplicationController
3
+
4
+ # GET /roles
5
+ def index
6
+ return if !user_is_allowed('roles', 'view')
7
+ top_roles = Role.tree
8
+ arr = []
9
+ top_roles.each { |r| arr += add_role_options(r, 0) }
10
+ @roles = arr
11
+ end
12
+
13
+ # GET /roles/new
14
+ def new
15
+ return if !user_is_allowed('roles', 'add')
16
+ @role = Role.new
17
+ end
18
+
19
+ # GET /roles/1/edit
20
+ def edit
21
+ return if !user_is_allowed('roles', 'edit')
22
+ @role = Role.find(params[:id])
23
+ @users = User.users_with_role(@role.id)
24
+ end
25
+
26
+ # POST /roles
27
+ def create
28
+ return if !user_is_allowed('roles', 'add')
29
+
30
+ resp = StdClass.new({
31
+ 'error' => nil,
32
+ 'redirect' => nil
33
+ })
34
+
35
+ role = Role.new()
36
+ role.parent_id = params[:parent_id]
37
+ role.name = params[:name]
38
+ role.save
39
+
40
+ resp.redirect = "/roles/#{role.id}/edit"
41
+ render json: resp
42
+ end
43
+
44
+ # PUT /roles/1
45
+ def update
46
+ return if !user_is_allowed('roles', 'edit')
47
+
48
+ resp = StdClass.new
49
+ role = Role.find(params[:id])
50
+ name = params[:name]
51
+ value = params[:value]
52
+
53
+ save = true
54
+ case name
55
+ when "name"
56
+ role.name = value
57
+ when "parent_id"
58
+ if (role.id == value)
59
+ resp.error = "You can't set the parent to be this role."
60
+ save = false
61
+ #elsif (role.is_parent_of(value))
62
+ # resp.error = "You can't set the parent to be one of the child roles."
63
+ # save = false
64
+ else
65
+ role.parent_id = value
66
+ end
67
+ when "users"
68
+ role.users = []
69
+ value.each { |uid| role.users << User.find(uid) } unless value.nil?
70
+ resp.attribute = { 'text' => role.users.collect{ |u| "#{u.first_name} #{u.last_name}" }.join(', ') }
71
+ end
72
+
73
+ resp.success = save && user.save
74
+ render json: resp
75
+ end
76
+
77
+ # DELETE /roles/1
78
+ def destroy
79
+ return if !user_is_allowed('roles', 'delete')
80
+ @role = Role.find(params[:id])
81
+ @role.destroy
82
+
83
+ respond_to do |format|
84
+ format.html { redirect_to roles_url }
85
+ format.json { head :no_content }
86
+ end
87
+ end
88
+
89
+ # GET /roles/options
90
+ def options
91
+ return if !user_is_allowed('roles', 'view')
92
+ @top_roles = Role.tree
93
+ arr = []
94
+ @top_roles.each { |r| arr += add_role_options(r, 0) }
95
+ render json: arr.to_json
96
+ end
97
+
98
+ def add_role_options(role, level)
99
+ arr = [{
100
+ "value" => role.id,
101
+ "text" => (" - " * level) + role.name
102
+ }]
103
+ role.children.each do |kid|
104
+ arr += add_role_options(kid, level+1)
105
+ end
106
+ return arr
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,117 @@
1
+
2
+ module Caboose
3
+ class UsersController < ApplicationController
4
+
5
+ # GET /users
6
+ def index
7
+ return if !user_is_allowed('users', 'view')
8
+
9
+ @gen = PageBarGenerator.new(params, {
10
+ 'first_name' => '',
11
+ 'last_name' => '',
12
+ 'username' => '',
13
+ 'email' => '',
14
+ },{
15
+ 'sort' => 'last_name, first_name',
16
+ 'desc' => false,
17
+ 'base_url' => '/users'
18
+ })
19
+
20
+ if (@gen.options['page'] == 0)
21
+ @gen.options['item_count'] = User.where(@gen.where).count
22
+ end
23
+ @users = User.where(@gen.where).limit(@gen.limit).offset(@gen.offset).reorder(@gen.reorder).all
24
+ end
25
+
26
+ # GET /users/new
27
+ def new
28
+ return if !user_is_allowed('users', 'add')
29
+ @user = User.new
30
+ end
31
+
32
+ # GET /users/1/edit
33
+ def edit
34
+ return if !user_is_allowed('users', 'edit')
35
+ @user = User.find(params[:id])
36
+ @all_roles = Role.tree
37
+ @roles = Role.roles_with_user(@user.id)
38
+ end
39
+
40
+ # POST /users
41
+ def create
42
+ return if !user_is_allowed('users', 'add')
43
+
44
+ resp = StdClass.new({
45
+ 'error' => nil,
46
+ 'redirect' => nil
47
+ })
48
+
49
+ user = User.new()
50
+ user.username = params[:username]
51
+
52
+ if (user.username.length == 0)
53
+ resp.error = "Your username is required."
54
+ elsif
55
+ user.save
56
+ resp.redirect = "/users/#{user.id}/edit"
57
+ end
58
+ render json: resp
59
+ end
60
+
61
+ # PUT /users/1
62
+ def update
63
+ return if !user_is_allowed('users', 'edit')
64
+
65
+ resp = StdClass.new
66
+ user = User.find(params[:id])
67
+ name = params[:name]
68
+ value = params[:value]
69
+
70
+ save = true
71
+ case name
72
+ when "first_name", "last_name", "username", "email"
73
+ user[name.to_sym] = value
74
+ when "password"
75
+ confirm = params[:confirm]
76
+ if (value != confirm)
77
+ resp.error = "Passwords do not match.";
78
+ save = false
79
+ elsif (value.length < 8)
80
+ resp.error = "Passwords must be at least 8 characters.";
81
+ save = false
82
+ else
83
+ user.password = Digest::SHA1.hexdigest(Caboose::salt + value)
84
+ end
85
+ when "roles"
86
+ user.roles = [];
87
+ value.each { |rid| user.roles << Role.find(rid) } unless value.nil?
88
+ resp.attribute = { 'text' => user.roles.collect{ |r| r.name }.join(', ') }
89
+ end
90
+
91
+ resp.success = save && user.save
92
+ render json: resp
93
+ end
94
+
95
+ def update_pic
96
+ @user = User.find(params[:id])
97
+ @new_value = "Testing"
98
+ end
99
+
100
+ def update_resume
101
+ @user = User.find(params[:id])
102
+ @new_value = "Testing"
103
+ end
104
+
105
+ # DELETE /users/1
106
+ def destroy
107
+ return if !user_is_allowed('users', 'delete')
108
+ user = User.find(params[:id])
109
+ user.destroy
110
+
111
+ resp = StdClass.new({
112
+ 'redirect' => '/users'
113
+ })
114
+ render json: resp
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,4 @@
1
+ module Caboose
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Caboose
2
+ module PermissionsHelper
3
+ end
4
+ end
@@ -0,0 +1,13 @@
1
+
2
+ class Caboose::ApprovalRequest < ActiveRecord::Base
3
+ self.table_name = "approval_reqests"
4
+ belongs_to :page
5
+ belongs_to :user
6
+ belongs_to :reviewer, :class_name => 'User', :foreign_key => 'reviewer_id'
7
+ attr_accessible :page_id, :user_id, :reviewer_id, :date_requested, :date_reviewed, :notes, :reviewer_notes, :status
8
+
9
+ #const STATUS_APPROVED = 'approved';
10
+ #const STATUS_DENIED = 'denied';
11
+ #const STATUS_PENDING = 'pending';
12
+
13
+ end
@@ -0,0 +1,23 @@
1
+
2
+ class Caboose::Asset < ActiveRecord::Base
3
+ self.table_name = "assets"
4
+ belongs_to :page
5
+ attr_accessible :page_id, :uploaded_by_id, :date_uploaded, :name, :filename, :description, :extension
6
+
7
+ def sanitize_name(str)
8
+ return str.gsub(' ', '_').downcase
9
+ end
10
+
11
+ def assets_with_uri(uri)
12
+ uri[0] = '' if uri.start_with? '/'
13
+
14
+ page = Page.page_with_uri(File.dirname(uri), false)
15
+ return false if page.nil?
16
+
17
+ asset = Asset.where(:page_id => page.id,:filename => File.basename(uri)).first
18
+ return false if asset.nil?
19
+
20
+ return asset
21
+ end
22
+
23
+ end
@@ -0,0 +1,15 @@
1
+ class Caboose::CaboosePlugin
2
+
3
+ def self.page_content_hook(str)
4
+ return str
5
+ end
6
+
7
+ def self.admin_nav_hook(arr)
8
+ return arr
9
+ end
10
+
11
+ def self.admin_subnav_hook(arr)
12
+ return arr
13
+ end
14
+
15
+ end
@@ -0,0 +1,6 @@
1
+
2
+ class Caboose::MenuBlock
3
+
4
+ attr_accessor :title, :title_id, :links
5
+
6
+ end
@@ -0,0 +1,329 @@
1
+
2
+ class Caboose::Page < ActiveRecord::Base
3
+ self.table_name = "pages"
4
+
5
+ belongs_to :parent, :class_name => "Page"
6
+ has_many :children, :class_name => "Page", :foreign_key => 'parent_id'
7
+ has_many :page_permissions
8
+ attr_accessible :parent_id,
9
+ :title,
10
+ :menu_title,
11
+ :content,
12
+ :slug,
13
+ :alias,
14
+ :uri,
15
+ :redirect_url,
16
+ :hide,
17
+ :content_format,
18
+ :custom_css,
19
+ :custom_js,
20
+ :layout,
21
+ :seo_title, # 70 chars
22
+ :meta_description, # 156 chars
23
+ :meta_robots, # Multi-select options: none, noindex, nofollow, nosnippet, noodp, noarchive
24
+ :canonical_url,
25
+ :facebook_description, # defaults to meta_description
26
+ :googleplus_description # defaults to meta_description
27
+
28
+ CONTENT_FORMAT_HTML = 1
29
+ CONTENT_FORMAT_TEXT = 2
30
+ CONTENT_FORMAT_RUBY = 3
31
+
32
+ def order_title
33
+ return "" + menu_title + title unless menu_title.nil? || title.nil?
34
+ return menu_title unless menu_title.nil?
35
+ return title unless title.nil?
36
+ return ""
37
+ end
38
+
39
+ def self.find_with_fields(page_id, fields)
40
+ return self.where(:id => page_id).select(fields).first
41
+ end
42
+
43
+ def self.index_page
44
+ return self.where(:parent_id => -1).first
45
+ end
46
+
47
+ def self.page_with_uri(uri, get_closest_parent = true)
48
+
49
+ uri = uri.to_s.gsub(/^(.*?)\?.*?$/, '\1')
50
+ uri.chop! if uri.end_with?('/')
51
+ uri[0] = '' if uri.starts_with?('/')
52
+
53
+ return self.index_page if uri.length == 0
54
+
55
+ page = false
56
+ parts = uri.split('/')
57
+
58
+ # See where to start looking
59
+ page_ids = self.where(:alias => parts[0]).limit(1).pluck(:id)
60
+ page_id = !page_ids.nil? && page_ids.count > 0 ? page_ids[0] : false
61
+
62
+ # Search for the page
63
+ if (page_id)
64
+ page_id = self.page_with_uri_helper(parts, 1, page_id)
65
+ else
66
+ parent_id = self.index_page
67
+ page_id = self.page_with_uri_helper(parts, 0, parent_id)
68
+ end
69
+
70
+ return false if page_id.nil?
71
+
72
+ page = self.find(page_id)
73
+
74
+ if (!get_closest_parent) # // Look for an exact match
75
+ return false if page.uri != uri
76
+ end
77
+ return page
78
+ end
79
+
80
+ def self.page_with_uri_helper(parts, level, parent_id)
81
+ return parent_id if level >= parts.count
82
+ slug = parts[level]
83
+ page_ids = self.where(:parent_id => parent_id, :slug => slug).limit(1).pluck(:id)
84
+ return parent_id if page_ids.nil? || page_ids.count == 0
85
+ return self.page_with_uri_helper(parts, level+1, page_ids[0])
86
+ end
87
+
88
+ def self.update_child_uris(page_id)
89
+ page = self.find(page_id)
90
+ parent = self.find(page.parent_id)
91
+ parent_uri = parent.nil? ? '/' : parent.uri
92
+ self.update_child_uris_helper(ppage, parent_uri)
93
+ end
94
+
95
+ def self.update_child_uris_helper(page, parent_uri)
96
+ return if page.redirect_url.length > 0
97
+
98
+ slug = page.slug
99
+ if (slug.trim.length == 0)
100
+ slug = self.get_slug(page.title)
101
+ self.update_detail_field(page.id, 'slug', slug)
102
+ end
103
+
104
+ slug = page.slug.trim.length > 0 ? page.slug : self.get_slug(page.title)
105
+
106
+ uri= "#{parent_uri}/#{slug}"
107
+ if (page.alias.length > 0)
108
+ uri = "/#{page.alias}"
109
+ elsif (self.is_top_level(page.parent_id))
110
+ uri = "/#{page.slug}"
111
+ end
112
+ self.update_detail_field(page.id, 'uri', uri)
113
+
114
+ page.children.each do |kid|
115
+ self.update_child_uris_helper(kid, uri)
116
+ end
117
+ end
118
+
119
+ def self.update_child_perms(page_id)
120
+ page = self.find(page_id)
121
+
122
+ viewers = Role.roles_with_page_permission(page_id, 'view')
123
+ editors = Role.roles_with_page_permission(page_id, 'edit')
124
+ approvers = Role.roles_with_page_permission(page_id, 'approve')
125
+ viewer_ids = viewers.collect {|r| r.id }
126
+ editor_ids = editors.collect {|r| r.id }
127
+ approver_id = approvers.collect {|r| r.id }
128
+
129
+ self.update_child_perms_helper(page, viewer_ids, editor_ids, approver_ids)
130
+ end
131
+
132
+ def self.update_child_perms_helper(page, viewer_ids, editor_ids, approver_ids)
133
+ self.update_authorized_for_action(page.id, 'view' , viewer_ids)
134
+ self.update_authorized_for_action(page.id, 'edit' , editor_ids)
135
+ self.update_authorized_for_action(page.id, 'approve' , approver_ids)
136
+
137
+ page.children.each do |kid|
138
+ self.update_child_perms_helper(kid, viewer_ids, editor_ids, approver_ids)
139
+ end
140
+ end
141
+
142
+ def self.update_authorized_for_action(page_id, action, roles)
143
+ Caboose::PagePermission.where(:page_id => page_id, :action => action).destroy_all
144
+ if (!roles.nil?)
145
+ roles.each do |role|
146
+ role_id = role.is_a?(Integer) ? role : role.id
147
+ Caboose::PagePermission.create({
148
+ :page_id => page_id,
149
+ :role_id => role_id,
150
+ :action => action
151
+ })
152
+ end
153
+ end
154
+ return true
155
+ end
156
+
157
+ def self.is_allowed(user, page_id, action)
158
+ user = User.find(User.LOGGED_OUT_USER_ID) if user.nil?
159
+
160
+ # Allow a user id to be sent instead of a user object
161
+ user = User.find(user) if user.is_a?(Integer)
162
+ user.role_ids = [User.LOGGED_OUT_ROLE_ID] if user.role_ids.nil?
163
+
164
+ t = PagePermission.table
165
+ reqs = nil
166
+ user.role_ids.each do |role_id|
167
+ if (reqs.nil?)
168
+ reqs = t[:role_id].eq(role_id)
169
+ else
170
+ reqs.or(t[:role_id].eq(role_id))
171
+ end
172
+ end
173
+ var params = { :page_id => page_id, :action => action }
174
+ params << reqs if !reqs.nil?
175
+ count = PagePermission.where(params).count
176
+
177
+ return true if count > 0
178
+ return false
179
+ end
180
+
181
+ def self.roles_with_permission(page_id, action)
182
+ return Role.roles_with_page_permission(page_id, action)
183
+ end
184
+
185
+ def self.permissible_actions(user, page_id)
186
+ if (user.is_a?(Integer))
187
+ user = Caboose::User.find(user)
188
+ end
189
+ actions = []
190
+ user.roles.each do |role|
191
+ actions + Caboose::PagePermission.where({
192
+ :role_id => role.id,
193
+ :page_id => page_id
194
+ }).pluck(:action)
195
+ end
196
+ return actions.uniq
197
+ end
198
+
199
+ def self.page_ids_with_permission(user, action)
200
+ if (user.is_a?(Integer))
201
+ user = Caboose::User.find(user)
202
+ end
203
+ ids = []
204
+ user.roles.each do |role|
205
+ ids + Caboose::PagePermission.where({
206
+ :role_id => role.id,
207
+ :action => action
208
+ }).pluck(:page_id)
209
+ end
210
+ return ids.uniq
211
+ end
212
+
213
+ def self.crumb_trail(page)
214
+ page_id = page.is_a?(Integer) ? page : page.id
215
+
216
+ arr = []
217
+ self.crumb_trail_helper(page_id, arr)
218
+ arr.reverse!
219
+
220
+ trail = arr.collect do |row|
221
+ Caboose::StdClass.new({
222
+ 'href' => !row.uri.nil? && row.uri.length > 0 ? row.uri : '/',
223
+ 'text' => !row.menu_title.nil? && row.menu_title.length > 0 ? row.menu_title : row.title
224
+ })
225
+ end
226
+ return trail
227
+ end
228
+
229
+ def self.crumb_trail_helper(page_id, arr)
230
+ return if page_id.nil? || page_id <= 0
231
+ p = self.find_with_fields(page_id, [:parent_id, :title, :menu_title, :uri])
232
+ return if p.nil?
233
+ arr << p
234
+ self.crumb_trail_helper(p.parent_id, arr)
235
+ end
236
+
237
+ def self.subnav(page, use_redirect_urls = true, user = false)
238
+
239
+ # Be nice and allow page ids to be sent
240
+ if (page.is_a?(Integer))
241
+ page = self.find_with_fields(page, [:title, :menu_title, :custom_sort_children])
242
+ end
243
+
244
+ block = Caboose::MenuBlock.new
245
+ block.title = !page.menu_title.nil? && page.menu_title.length > 0 ? page.menu_title : page.title
246
+ block.title_id = page.id
247
+
248
+ pages = self.select([:id, :title, :menu_title, :alias, :slug, :uri, :redirect_url, :sort_order]).where(:parent_id => page.id, :hide => 0).reorder(:sort_order).all
249
+ if (page.custom_sort_children)
250
+ pages.sort! {|x,y| x.sort_order <=> y.sort_order }
251
+ else
252
+ pages.sort! {|x,y| x.order_title <=> y.order_title }
253
+ end
254
+
255
+ if (pages.nil? || pages.count == 0) # No children, go up a level
256
+ parent = self.find_with_fields(page.parent_id, [:title, :menu_title, :custom_sort_children])
257
+ return block if parent.nil? # If we happen to be at the top page
258
+
259
+ block.title = parent.menu_title.length > 0 ? parent.menu_title : parent.title
260
+ block.title_id = parent.id
261
+
262
+ pages = self.select(
263
+ :id, :title, :menu_title, :alias, :slug, :uri, :redirect_url, :sort_order
264
+ ).where(:parent_id => page.parent_id, :hide => 0)
265
+ if (parent.custom_sort_children)
266
+ pages.sort! {|x,y| x.sort_order <=> y.sort_order }
267
+ else
268
+ pages.sort! {|x,y| x.order_title <=> y.order_title }
269
+ end
270
+ end
271
+
272
+ block.links = []
273
+ pages.each do |p|
274
+ link = Caboose::StdClass.new({
275
+ 'href' => !p.redirect_url.nil? && p.redirect_url.length > 0 ? p.redirect_url : p.uri,
276
+ 'text' => !p.menu_title.nil? && p.menu_title.length > 0 ? p.menu_title : p.title,
277
+ 'is_current' => p.id == page.id
278
+ })
279
+ if (!use_redirect_urls && self.is_allowed(user, p.id, 'edit'))
280
+ link.href = row.uri
281
+ end
282
+ block.links << link
283
+ end
284
+ return block
285
+ end
286
+
287
+ def self.url(page_id)
288
+ arr = []
289
+ self.url_helper(page_id, arr)
290
+ arr.reverse!
291
+
292
+ path = []
293
+ arr.each do |row|
294
+ if (row.alias.length > 0)
295
+ path = [row.alias]
296
+ elsif (row.slug.length > 0)
297
+ path << row.slug
298
+ end
299
+ end
300
+ return path.join('/')
301
+ end
302
+
303
+ def self.url_helper(page_id, arr)
304
+ return if page_id <= 0
305
+
306
+ p = self.find_with_fields(page_id, [:id, :parent_id, :title, :menu_title, :alias, :slug])
307
+ return if p.nil?
308
+
309
+ arr << p
310
+ self.url_helper(p.parent_id, arr)
311
+ end
312
+
313
+ def self.slug(str)
314
+ return str.downcase.gsub(' ', '-').gsub(/[^\w-]/, '')
315
+ end
316
+
317
+ def self.has_children(page_id)
318
+ count = self.where(:parent_id => page_id).count
319
+ return count > 0
320
+ end
321
+
322
+ def self.is_child(parent_id, child_id)
323
+ pid = self.where(:page_id => child_id).first.pluck(:parent_id)
324
+ return false if pid <= 0
325
+ return true if pid == parent_id
326
+ return self.is_child(parent_id, pid)
327
+ end
328
+
329
+ end