caboose-cms 0.0.2

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