trusty-cms 7.0.2 → 7.0.4

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 (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.