trusty-cms 7.0.2 → 7.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +89 -102
  5. data/INSTALL.md +8 -6
  6. data/README.md +123 -15
  7. data/app/assets/javascripts/admin/validations/scheduled_status_validation.js +60 -0
  8. data/app/assets/stylesheets/admin/main.scss +2 -1
  9. data/app/assets/stylesheets/admin/partials/_datetime_input.scss +5 -0
  10. data/app/assets/stylesheets/admin/partials/_forms.scss +13 -0
  11. data/app/assets/stylesheets/admin/partials/_messages.scss +4 -0
  12. data/app/controllers/admin/configuration_controller.rb +1 -1
  13. data/app/controllers/admin/extensions_controller.rb +1 -0
  14. data/app/controllers/admin/layouts_controller.rb +2 -1
  15. data/app/controllers/admin/resource_controller.rb +10 -1
  16. data/app/controllers/admin/sites_controller.rb +1 -0
  17. data/app/controllers/admin/snippets_controller.rb +2 -1
  18. data/app/controllers/admin/users_controller.rb +2 -1
  19. data/app/controllers/page_status_controller.rb +61 -0
  20. data/app/controllers/site_controller.rb +0 -15
  21. data/app/helpers/admin/pages_helper.rb +0 -5
  22. data/app/helpers/admin/users_helper.rb +2 -1
  23. data/app/helpers/application_helper.rb +2 -1
  24. data/app/models/admins_site.rb +6 -0
  25. data/app/models/page.rb +3 -10
  26. data/app/models/site.rb +2 -0
  27. data/app/models/status.rb +1 -5
  28. data/app/models/trusty_cms/config.rb +2 -1
  29. data/app/models/user.rb +15 -4
  30. data/app/views/admin/layouts/_choose_site.html.haml +5 -3
  31. data/app/views/admin/layouts/_site_chooser.html.haml +2 -2
  32. data/app/views/admin/pages/_fields.html.haml +15 -6
  33. data/app/views/admin/pages/_node.html.haml +1 -1
  34. data/app/views/admin/snippets/_choose_site.html.haml +2 -1
  35. data/app/views/admin/users/_choose_site.html.haml +2 -1
  36. data/app/views/admin/users/_form.html.haml +3 -1
  37. data/bin/rails +2 -2
  38. data/config/application.rb +1 -0
  39. data/config/initializers/devise.rb +1 -1
  40. data/config/locales/en.yml +11 -9
  41. data/config/routes.rb +1 -0
  42. data/db/migrate/20241108172942_create_site_users.rb +8 -0
  43. data/lib/login_system.rb +15 -15
  44. data/lib/trusty_cms/version.rb +1 -1
  45. data/spec/dummy/config/application.rb +2 -0
  46. data/spec/dummy/db/schema.rb +8 -1
  47. data/spec/factories/snippet.rb +10 -0
  48. data/spec/factories/user.rb +11 -11
  49. data/spec/models/snippets_spec.rb +29 -0
  50. data/spec/models/user_spec.rb +46 -0
  51. data/trusty_cms.gemspec +1 -1
  52. data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_model.rb +17 -11
  53. data/vendor/extensions/multi-site-extension/lib/multi_site/site_chooser_helper.rb +10 -10
  54. metadata +16 -6
  55. data/app/users/_choose_site.html.haml +0 -4
  56. /data/app/assets/stylesheets/admin/partials/{_dateinput.scss → _date_input.scss} +0 -0
@@ -140,7 +140,7 @@ en:
140
140
  secret: 'Secret'
141
141
  skip_filetype_validation: 'Skip Filetype Validation'
142
142
  storage: 'Storage'
143
- url: 'Url'
143
+ url: 'Url'
144
144
  defaults:
145
145
  locale: 'default language'
146
146
  page:
@@ -159,17 +159,18 @@ en:
159
159
  allow_password_reset?: "allow password reset"
160
160
  content: 'Content'
161
161
  content_type: 'Content‑Type'
162
+ content_editor: 'Content Editor'
162
163
  creating_status: 'Creating %{model}…'
163
164
  date:
164
- abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
165
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
166
- day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
165
+ abbr_day_names: [ Sun, Mon, Tue, Wed, Thu, Fri, Sat ]
166
+ abbr_month_names: [ ~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec ]
167
+ day_names: [ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ]
167
168
  formats:
168
169
  default: "%Y-%m-%d"
169
170
  long: "%B %e, %Y"
170
171
  only_day: "%e"
171
172
  short: "%e %b"
172
- month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
173
+ month_names: [ ~, January, February, March, April, May, June, July, August, September, October, November, December ]
173
174
  order:
174
175
  - :year
175
176
  - :month
@@ -183,9 +184,10 @@ en:
183
184
  designer: 'Designer'
184
185
  draft: 'Draft'
185
186
  edit: 'Edit'
187
+ editor: 'Editor'
186
188
  edit_configuration: 'Edit Configuration'
187
189
  edit_layout: 'Edit Layout'
188
- edit_page: 'Edit Page'
190
+ edit_page: 'Edit Page'
189
191
  edit_preferences: 'Edit Preferences'
190
192
  edit_settings: 'Edit Settings'
191
193
  edit_user: 'Edit User'
@@ -241,8 +243,8 @@ en:
241
243
  preview: 'Preview'
242
244
  published: 'Published'
243
245
  published_at: 'Published at'
244
- published_on: 'Published On'
245
- reference: 'Reference'
246
+ publish_datetime: 'Publish Date & Time'
247
+ reference: 'Reference'
246
248
  remember_me: 'Remember me'
247
249
  remember_me_in_this_browser: 'Remember me in this browser'
248
250
  remove: 'Remove'
@@ -277,7 +279,7 @@ en:
277
279
  snippets: 'Snippets'
278
280
  snippet: 'Snippet'
279
281
  status: 'Status'
280
- # Warnings and info text:
282
+ # Warnings and info text:
281
283
  testing: Testing
282
284
  text:
283
285
  layouts:
data/config/routes.rb CHANGED
@@ -4,6 +4,7 @@ TrustyCms::Application.routes.draw do
4
4
  as :user do
5
5
  post 'authenticate', to: 'devise/sessions#create', as: :authenticate
6
6
  end
7
+ post '/page-status/refresh' => 'page_status#refresh'
7
8
  get '/rad_social/mail' => 'social_mailer#social_mail_form', as: :rad_social_mail_form
8
9
  post '/rad_social/mail' => 'social_mailer#create_social_mail', as: :rad_create_social_mail
9
10
  TrustyCms::Application.config.enabled_extensions.each do |ext|
@@ -0,0 +1,8 @@
1
+ class CreateSiteUsers < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :admins_sites do |t|
4
+ t.integer :admin_id, null: false, index: true
5
+ t.integer :site_id, null: false, index: true
6
+ end
7
+ end
8
+ end
data/lib/login_system.rb CHANGED
@@ -40,27 +40,27 @@ module LoginSystem
40
40
  true
41
41
  end
42
42
 
43
- def authorize
44
- # puts _process_action_callbacks.map(&:filter)
45
- # action = action_name.to_s.intern
46
- # if user_has_access_to_action?(action)
47
- # true
48
- # else
49
- # permissions = self.class.controller_permissions[action]
50
- # flash[:error] = permissions[:denied_message] || 'Access denied.'
51
- # respond_to do |format|
52
- # format.html { redirect_to(permissions[:denied_url] || { :action => :index }) }
53
- # format.any(:xml, :json) { head :forbidden }
54
- # end
55
- # false
56
- # end
57
- true
43
+ def authorize_role
44
+ action = action_name.to_s.intern
45
+ return true if user_has_access_to_action?(action)
46
+
47
+ handle_unauthorized_access(action)
48
+ false
58
49
  end
59
50
 
60
51
  def user_has_access_to_action?(action)
61
52
  self.class.user_has_access_to_action?(current_user, action, self)
62
53
  end
63
54
 
55
+ def handle_unauthorized_access(action)
56
+ permissions = self.class.controller_permissions[action]
57
+ flash[:error] = permissions[:denied_message] || 'Access denied.'
58
+ respond_to do |format|
59
+ format.html { redirect_to(permissions[:denied_url] || { action: :index }) }
60
+ format.any(:xml, :json) { head :forbidden }
61
+ end
62
+ end
63
+
64
64
  def login_from_session
65
65
  User.unscoped.find(session['user_id'])
66
66
  rescue StandardError
@@ -1,4 +1,4 @@
1
1
  module TrustyCms
2
- VERSION = '7.0.2'.freeze
2
+ VERSION = '7.0.4'.freeze
3
3
  end
4
4
 
@@ -31,6 +31,8 @@ module TrustyCms
31
31
 
32
32
  # Initialize extension paths
33
33
  config.initialize_extension_paths
34
+ config.active_record.legacy_connection_handling = false
35
+
34
36
  extension_loader = ExtensionLoader.instance { |l| l.initializer = self }
35
37
  extension_loader.paths(:load).reverse_each do |path, value|
36
38
  config.autoload_paths.unshift path
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema[7.0].define(version: 2023_10_19_192097) do
13
+ ActiveRecord::Schema[7.0].define(version: 2024_11_08_172942) do
14
14
  create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
15
15
  t.string "name", null: false
16
16
  t.string "record_type", null: false
@@ -69,6 +69,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_19_192097) do
69
69
  t.datetime "updated_at", precision: nil, null: false
70
70
  end
71
71
 
72
+ create_table "admins_sites", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
73
+ t.integer "admin_id", null: false
74
+ t.integer "site_id", null: false
75
+ t.index ["admin_id"], name: "index_admins_sites_on_admin_id"
76
+ t.index ["site_id"], name: "index_admins_sites_on_site_id"
77
+ end
78
+
72
79
  create_table "assets", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
73
80
  t.string "caption"
74
81
  t.string "title"
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+
3
+ factory :snippet do
4
+ name { 'test_snippet' }
5
+ content { <<-CONTENT }
6
+ <p>Snippet Stuff</p>
7
+ CONTENT
8
+ end
9
+
10
+ end
@@ -1,34 +1,34 @@
1
1
  FactoryBot.define do
2
2
  factory :user do
3
- name { 'User' }
3
+ first_name { 'FirstName' }
4
+ last_name { 'LastName' }
4
5
  email { 'email@test.com' }
5
- login { 'user' }
6
- password { 'password' }
6
+ password { 'ComplexPass1!' }
7
7
  password_confirmation { password }
8
8
 
9
9
  factory :admin do
10
- name { 'Admin' }
11
- login { 'admin' }
10
+ first_name { 'FirstName' }
11
+ last_name { 'LastName' }
12
12
  email { 'admin@example.com' }
13
13
  admin { true }
14
14
  end
15
15
 
16
16
  factory :existing do
17
- name { 'Existing' }
18
- login { 'existing' }
17
+ first_name { 'FirstName' }
18
+ last_name { 'LastName' }
19
19
  email { 'existing@example.com' }
20
20
  end
21
21
 
22
22
  factory :designer do
23
- name { 'Designer' }
24
- login { 'designer' }
23
+ first_name { 'FirstName' }
24
+ last_name { 'LastName' }
25
25
  email { '' }
26
26
  designer { true }
27
27
  end
28
28
 
29
29
  factory :non_admin do
30
- name { 'Non Admin' }
31
- login { 'non_admin' }
30
+ first_name { 'FirstName' }
31
+ last_name { 'LastName' }
32
32
  admin { false }
33
33
  end
34
34
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Snippet do
4
+
5
+ let(:snippet) { FactoryBot.build(:snippet) }
6
+
7
+ describe 'name' do
8
+ it 'is invalid when blank' do
9
+ snippet = FactoryBot.build(:snippet, name: '')
10
+ snippet.valid?
11
+ expect(snippet.errors[:name]).to include("This field is required.")
12
+ end
13
+
14
+ it 'should validate uniqueness of' do
15
+ snippet = FactoryBot.build(:snippet, name: 'test_snippet', content: "Content!")
16
+ snippet.save!
17
+ other = FactoryBot.build(:snippet, name: 'test_snippet', content: "Content!")
18
+ expect { other.save! }.to raise_error(ActiveRecord::RecordInvalid)
19
+ end
20
+
21
+ it 'should validate length of' do
22
+ snippet = FactoryBot.build(:snippet, name: 'x' * 100)
23
+ expect(snippet.errors[:name]).to be_blank
24
+ snippet = FactoryBot.build(:snippet, name: 'x' * 101)
25
+ expect { snippet.save! }.to raise_error(ActiveRecord::RecordInvalid)
26
+ expect(snippet.errors[:name]).to include("This must not be longer than 100 characters")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe User do
4
+ describe '#role?' do
5
+ let(:user) { create(:user) }
6
+
7
+ it 'returns true for admin role' do
8
+ user.admin = true
9
+ expect(user.role?(:admin)).to be true
10
+ end
11
+
12
+ it 'returns false for non-admin role' do
13
+ user.admin = false
14
+ expect(user.role?(:admin)).to be false
15
+ end
16
+ end
17
+
18
+ describe '#password_complexity' do
19
+ let(:user) { build(:user) }
20
+
21
+ it 'is valid with a complex password' do
22
+ user.password = 'ComplexPass1!'
23
+ expect(user).to be_valid
24
+ end
25
+
26
+ it 'is invalid with a simple password' do
27
+ user.password = 'simple'
28
+ user.valid?
29
+ expect(user.errors[:password]).to include('Complexity requirement not met. Length should be 12 characters and include: 1 uppercase, 1 lowercase, 1 digit and 1 special character.')
30
+ end
31
+ end
32
+
33
+ describe '#password_required?' do
34
+ let(:user) { build(:user) }
35
+
36
+ it 'returns false if skip_password_validation is true' do
37
+ user.skip_password_validation = true
38
+ expect(user.password_required?).to be false
39
+ end
40
+
41
+ it 'returns true if skip_password_validation is false' do
42
+ user.skip_password_validation = false
43
+ expect(user.password_required?).to be true
44
+ end
45
+ end
46
+ end
data/trusty_cms.gemspec CHANGED
@@ -43,7 +43,7 @@ a general purpose content management system--not merely a blogging engine.'
43
43
  s.add_dependency 'mini_racer'
44
44
  s.add_dependency 'mutex_m'
45
45
  s.add_dependency 'mysql2'
46
- s.add_dependency 'rack', '>= 2.0.1', '< 3.1.0'
46
+ s.add_dependency 'rack', '>= 2.0.1', '< 3.2.0'
47
47
  s.add_dependency 'rack-cache', '~> 1.7'
48
48
  s.add_dependency 'radius', '~> 0.7'
49
49
  s.add_dependency 'rails', '~> 7.0.0'
@@ -17,7 +17,7 @@ module MultiSite
17
17
  # that is, anything without a site is considered to be shared among all sites
18
18
  # the default is false
19
19
 
20
- def is_site_scoped(options={})
20
+ def is_site_scoped(options = {})
21
21
  return if is_site_scoped?
22
22
 
23
23
  options = {
@@ -25,7 +25,7 @@ module MultiSite
25
25
  }.merge(options)
26
26
 
27
27
  class_eval <<-EO
28
- default_scope {where(site_scope_condition)}
28
+ #{ self == User ? 'default_scope { joins(user_scope_condition) }' : 'default_scope { where(site_scope_condition) }' }
29
29
  extend MultiSite::ScopedModel::ScopedClassMethods
30
30
  include MultiSite::ScopedModel::ScopedInstanceMethods
31
31
  EO
@@ -52,8 +52,7 @@ module MultiSite
52
52
 
53
53
  module ScopedClassMethods
54
54
 
55
-
56
- def paginate_with_site(options={})
55
+ def paginate_with_site(options = {})
57
56
  return paginate_without_site(options) unless sites?
58
57
  where(site_scope_condition) do
59
58
  paginate_without_site(options)
@@ -63,7 +62,7 @@ module MultiSite
63
62
  %w{count average minimum maximum sum}.each do |getter|
64
63
  define_method("#{getter}_with_site") do |*args|
65
64
  return send("#{getter}_without_site".intern, *args) unless sites?
66
- with_scope(:find => {:conditions => site_scope_condition}) do
65
+ with_scope(:find => { :conditions => site_scope_condition }) do
67
66
  send "#{getter}_without_site".intern, *args
68
67
  end
69
68
  end
@@ -73,11 +72,11 @@ module MultiSite
73
72
  # and should only be used in odd cases like migration.
74
73
  def find_without_site(*args)
75
74
  options = args.extract_options!
76
- #set_readonly_option!(options)
75
+ # set_readonly_option!(options)
77
76
 
78
77
  case args.first
79
- when :first then find_initial_without_site(options) # defined here
80
- when :all then all_without_site(options) # already defined by the alias chain
78
+ when :first then find_initial_without_site(options) # defined here
79
+ when :all then all_without_site(options) # already defined by the alias chain
81
80
  end
82
81
  end
83
82
 
@@ -110,6 +109,12 @@ module MultiSite
110
109
  condition
111
110
  end
112
111
 
112
+ def user_scope_condition
113
+ return "" unless self.current_site
114
+
115
+ "INNER JOIN `admins_sites` ON `admins_sites`.`admin_id` = `admins`.`id` AND `admins_sites`.`site_id` = #{self.current_site.id}"
116
+ end
117
+
113
118
  def plural_symbol_for_class
114
119
  self.to_s.pluralize.underscore.intern
115
120
  end
@@ -125,9 +130,10 @@ module MultiSite
125
130
 
126
131
  module ScopedInstanceMethods
127
132
  protected
128
- def set_site
129
- self.site ||= self.class.current_site! unless self.class.is_shareable?
130
- end
133
+
134
+ def set_site
135
+ self.site ||= self.class.current_site! unless self.class.is_shareable?
136
+ end
131
137
  end
132
138
  end
133
139
  end
@@ -1,14 +1,14 @@
1
1
  module MultiSite::SiteChooserHelper
2
2
 
3
- def sites_chooser_thing
4
- return "" unless current_user.admin? && defined?(Site) && defined?(controller) && controller.sited_model? && controller.template_name == 'index' && Site.several?
5
- options = Site.all.map{ |site| "<li>" + link_to( site.name, "#{request.path}?site_id=#{site.id}", :class => site == current_site ? 'fg' : '') + "</li>" }.join("")
6
- chooser = %{<div id="site_chooser">}
7
- #chooser << link_to("sites", admin_sites_url, {:id => 'show_site_list', :class => 'expandable'})
8
- chooser << %{<ul id="nav"><li>Current Site: #{current_site.name}}
9
- chooser << %{<ul class="expansion">#{options}</ul></li></ul>}
10
- chooser << %{</div>}
11
- chooser
12
- end
3
+ def sites_chooser_thing
4
+ return "" unless current_user.admin? && defined?(Site) && defined?(controller) && controller.sited_model? && controller.template_name == 'index' && Site.several?
5
+ options = Site.all.map { |site| "<li>" + link_to(site.name, "#{request.path}?site_id=#{site.id}", :class => site == current_site ? 'fg' : '') + "</li>" }.join("")
6
+ chooser = %{<div id="site_chooser">}
7
+ # chooser << link_to("sites", admin_sites_url, {:id => 'show_site_list', :class => 'expandable'})
8
+ chooser << %{<ul id="nav"><li>Current Site: #{current_site.name}}
9
+ chooser << %{<ul class="expansion">#{options}</ul></li></ul>}
10
+ chooser << %{</div>}
11
+ chooser
12
+ end
13
13
 
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusty-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.2
4
+ version: 7.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - TrustyCms CMS dev team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-29 00:00:00.000000000 Z
11
+ date: 2025-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activestorage-validator
@@ -301,7 +301,7 @@ dependencies:
301
301
  version: 2.0.1
302
302
  - - "<"
303
303
  - !ruby/object:Gem::Version
304
- version: 3.1.0
304
+ version: 3.2.0
305
305
  type: :runtime
306
306
  prerelease: false
307
307
  version_requirements: !ruby/object:Gem::Requirement
@@ -311,7 +311,7 @@ dependencies:
311
311
  version: 2.0.1
312
312
  - - "<"
313
313
  - !ruby/object:Gem::Version
314
- version: 3.1.0
314
+ version: 3.2.0
315
315
  - !ruby/object:Gem::Dependency
316
316
  name: rack-cache
317
317
  requirement: !ruby/object:Gem::Requirement
@@ -653,6 +653,7 @@ files:
653
653
  - app/assets/javascripts/admin/treetable.js
654
654
  - app/assets/javascripts/admin/utilities.js
655
655
  - app/assets/javascripts/admin/validation.js
656
+ - app/assets/javascripts/admin/validations/scheduled_status_validation.js
656
657
  - app/assets/javascripts/admin/validations/user_validations.js
657
658
  - app/assets/javascripts/ckeditor/config.js
658
659
  - app/assets/javascripts/ckeditor/contents.css
@@ -673,7 +674,8 @@ files:
673
674
  - app/assets/stylesheets/admin/modules/_links.scss
674
675
  - app/assets/stylesheets/admin/partials/_actions.scss
675
676
  - app/assets/stylesheets/admin/partials/_content.scss
676
- - app/assets/stylesheets/admin/partials/_dateinput.scss
677
+ - app/assets/stylesheets/admin/partials/_date_input.scss
678
+ - app/assets/stylesheets/admin/partials/_datetime_input.scss
677
679
  - app/assets/stylesheets/admin/partials/_drawer.scss
678
680
  - app/assets/stylesheets/admin/partials/_dropdown.scss
679
681
  - app/assets/stylesheets/admin/partials/_footer.scss
@@ -707,6 +709,7 @@ files:
707
709
  - app/controllers/admin/snippets_controller.rb
708
710
  - app/controllers/admin/users_controller.rb
709
711
  - app/controllers/application_controller.rb
712
+ - app/controllers/page_status_controller.rb
710
713
  - app/controllers/site_controller.rb
711
714
  - app/controllers/social_mailer_controller.rb
712
715
  - app/helpers/admin/configuration_helper.rb
@@ -730,6 +733,7 @@ files:
730
733
  - app/mailers/application_mailer.rb
731
734
  - app/mailers/devise_mailer.rb
732
735
  - app/mailers/rad_social_mailer.rb
736
+ - app/models/admins_site.rb
733
737
  - app/models/asset.rb
734
738
  - app/models/asset_type.rb
735
739
  - app/models/file_not_found_page.rb
@@ -753,7 +757,6 @@ files:
753
757
  - app/models/trusty_cms/page_response_cache_director.rb
754
758
  - app/models/user.rb
755
759
  - app/models/user_action_observer.rb
756
- - app/users/_choose_site.html.haml
757
760
  - app/views/admin/assets/_asset.html.haml
758
761
  - app/views/admin/assets/_asset_table.html.haml
759
762
  - app/views/admin/assets/_errors.html.haml
@@ -908,6 +911,7 @@ files:
908
911
  - db/migrate/20161027141250_add_position_to_pages.rb
909
912
  - db/migrate/20200117141251_create_admin_users.rb
910
913
  - db/migrate/20210331134718_create_active_storage_tables.active_storage.rb
914
+ - db/migrate/20241108172942_create_site_users.rb
911
915
  - db/schema.rb
912
916
  - lib/active_record_extensions/active_record_extensions.rb
913
917
  - lib/annotatable.rb
@@ -1097,12 +1101,15 @@ files:
1097
1101
  - spec/factories/layout.rb
1098
1102
  - spec/factories/page.rb
1099
1103
  - spec/factories/page_part.rb
1104
+ - spec/factories/snippet.rb
1100
1105
  - spec/factories/user.rb
1101
1106
  - spec/features/config_spec.rb
1102
1107
  - spec/features/layouts_spec.rb
1103
1108
  - spec/features/pages_spec.rb
1104
1109
  - spec/fixtures/users.yml
1105
1110
  - spec/models/layout_spec.rb
1111
+ - spec/models/snippets_spec.rb
1112
+ - spec/models/user_spec.rb
1106
1113
  - spec/rails_helper.rb
1107
1114
  - spec/spec_helper.rb
1108
1115
  - spec/support/custom_actions.rb
@@ -1248,12 +1255,15 @@ test_files:
1248
1255
  - spec/factories/layout.rb
1249
1256
  - spec/factories/page.rb
1250
1257
  - spec/factories/page_part.rb
1258
+ - spec/factories/snippet.rb
1251
1259
  - spec/factories/user.rb
1252
1260
  - spec/features/config_spec.rb
1253
1261
  - spec/features/layouts_spec.rb
1254
1262
  - spec/features/pages_spec.rb
1255
1263
  - spec/fixtures/users.yml
1256
1264
  - spec/models/layout_spec.rb
1265
+ - spec/models/snippets_spec.rb
1266
+ - spec/models/user_spec.rb
1257
1267
  - spec/rails_helper.rb
1258
1268
  - spec/spec_helper.rb
1259
1269
  - spec/support/custom_actions.rb
@@ -1,4 +0,0 @@
1
- - unless current_user.site
2
- %label{:for=>"user_admin"} Can edit site
3
- = select :user, :site_id, [['<any>', '']] + Site.all.map { |s| [s.name, s.id] }
4
- .caption A user with no site is able to act (to whatever extent their status allows) on any site.