From 1f90c30dc3cb77b6e6308fad818f361779865e68 Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Mon, 10 Oct 2022 11:34:51 +0100 Subject: [PATCH 001/105] Add superadmin setting to users and protect site settings page --- app/controllers/admin/settings_controller.rb | 38 ++++++++++--------- .../20221005141547_add_superadmin_to_users.rb | 5 +++ db/schema.rb | 3 +- spec/factories/user.rb | 8 ++++ spec/features/managing_taxonomies_spec.rb | 2 +- spec/features/managing_users_spec.rb | 4 +- 6 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 db/migrate/20221005141547_add_superadmin_to_users.rb diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index d2c95b3e..b8838a9f 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -1,23 +1,27 @@ class Admin::SettingsController < Admin::BaseController + before_action :require_superadmin! - def edit - @admin_settings = Form::AdminSettings.new - end + def edit + @admin_settings = Form::AdminSettings.new + end - def update + def update + @admin_settings = Form::AdminSettings.new(setting_params) - @admin_settings = Form::AdminSettings.new(setting_params) + if @admin_settings.save + redirect_to edit_admin_settings_path(@admin_settings), notice: "Settings have been saved." + else + render :edit + end + end - if @admin_settings.save - redirect_to edit_admin_settings_path(@admin_settings), notice: "Settings have been saved." - else - render :edit - end + private - end - - private - def setting_params - params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS) - end -end \ No newline at end of file + def setting_params + params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS) + end + + def require_superadmin! + redirect_to root_path unless current_user.superadmin + end +end diff --git a/db/migrate/20221005141547_add_superadmin_to_users.rb b/db/migrate/20221005141547_add_superadmin_to_users.rb new file mode 100644 index 00000000..b049fe52 --- /dev/null +++ b/db/migrate/20221005141547_add_superadmin_to_users.rb @@ -0,0 +1,5 @@ +class AddSuperadminToUsers < ActiveRecord::Migration[6.0] + def change + add_column :users, :superadmin, :boolean, default: false, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 4d70f5af..9154ea68 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_06_23_112854) do +ActiveRecord::Schema.define(version: 2022_10_05_141547) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" @@ -438,6 +438,7 @@ t.string "phone" t.datetime "marked_for_deletion" t.boolean "admin_manage_ofsted_access", default: false, null: false + t.boolean "superadmin", default: false, null: false t.index ["discarded_at"], name: "index_users_on_discarded_at" t.index ["email"], name: "index_users_on_email", unique: true t.index ["organisation_id"], name: "index_users_on_organisation_id" diff --git a/spec/factories/user.rb b/spec/factories/user.rb index 73d92404..caba87ed 100644 --- a/spec/factories/user.rb +++ b/spec/factories/user.rb @@ -25,7 +25,15 @@ admin_ofsted { true } end + trait :full_admin do + admin { true } + admin_users { true } + admin_ofsted { true } + admin_manage_ofsted_access { true } + end + trait :superadmin do + superadmin { true } admin { true } admin_users { true } admin_ofsted { true } diff --git a/spec/features/managing_taxonomies_spec.rb b/spec/features/managing_taxonomies_spec.rb index 40a4599b..cf411cc4 100644 --- a/spec/features/managing_taxonomies_spec.rb +++ b/spec/features/managing_taxonomies_spec.rb @@ -2,7 +2,7 @@ RSpec.describe 'Managing taxonomies', type: :feature do before do - admin_user = FactoryBot.create :user, :superadmin + admin_user = FactoryBot.create :user, :full_admin login_as admin_user visit admin_taxonomies_path end diff --git a/spec/features/managing_users_spec.rb b/spec/features/managing_users_spec.rb index e1de92ce..96a69005 100644 --- a/spec/features/managing_users_spec.rb +++ b/spec/features/managing_users_spec.rb @@ -11,9 +11,9 @@ expect(page).to_not have_content 'Manage Ofsted' end - context 'as a superadmin' do + context 'as a full admin' do before do - admin_user = FactoryBot.create :user, :superadmin + admin_user = FactoryBot.create :user, :full_admin login_as admin_user visit admin_users_path end From 6ccd26880a4573458e6690c5fba5202d7e660a25 Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Tue, 11 Oct 2022 16:33:22 +0100 Subject: [PATCH 002/105] Tweak sample CSVs --- lib/tasks/data_import/services/services--with-sample-data.csv | 4 ++-- spec/fixtures/data_import/services_valid.csv | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/tasks/data_import/services/services--with-sample-data.csv b/lib/tasks/data_import/services/services--with-sample-data.csv index 90aec1a6..72d21e58 100644 --- a/lib/tasks/data_import/services/services--with-sample-data.csv +++ b/lib/tasks/data_import/services/services--with-sample-data.csv @@ -1,5 +1,5 @@ import_id,import_id_reference,name,description,organisation,url,approved,visible_from,visible_to,visible,needs_referral,min_age,max_age,notes,service_taxonomies,contact_name,contact_title,contact_visible,contact_email,contact_phone,location_name,location_latitude,location_longitude,location_address_1,location_city,location_postcode,location_visible,mask_exact_address,preferred_for_post,location_accessibilities,free,cost_option,cost_amount,cost_type,temporarily_closed,schedules_opens_at,schedules_closes_at,scheduled_weekday,links_label,links_url,labels,suitabilities,is_local_offer,send_needs_support,support_description,recent_send_report,outcomes,recent_send_training,parental_involvement,information_sharing,environment_accessibility,how_to_start,future_plans,custom_text_text_field,custom_checkbox_checkbox_field,custom_number_number_field,custom_select_select_field,custom_date_date_fields -1,,CSV creation service3,"We create blank CSV's showing the structure of the data to be imported. +1,,CSV creation service,"We create blank CSV's showing the structure of the data to be imported. The description allows for multiple lines. @@ -10,4 +10,4 @@ NB this field will be shortened to 30 words in some places",TPX Impact,http://ww 5,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OAP,0,per session,,,,,,,,,,,,,,,,,,,,,,,, 6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,hh:mm:ss,hh:mm:ss,tuesday,,,,,,,,,,,,,,,,,,,, 7,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Twitter,http://www.google.com,,,,,,,,,,,,,,,,,, -8,,Second example service,description,Not TPX Impact,http://www.google.com,TRUE,,,TRUE,FALSE,,,,hello; new; data,contact 1,chief biscuit sampler,TRUE,email@emails.com,34234,McVities Head Office,51.50101,-0.141563,McVities Head Office,Biscuitville,EC1N 8BA,TRUE,FALSE,FALSE,Accessible toilet facilities;Hearing loop;Car parking;Changing facilities;British sign language (bsl);Disabled car parking space;Hoist;Baby changing facilities;Parking nearby;Bus stop nearby;Building has lift;Wheelchair accessible entrance;Partial wheelchair access,TRUE,,,,,,,,,,,Autism;Learning difficulties;Mental health/acquired brain injury;Visual and / or hearing impediment;Physical disabilities;Older people;Dementia,FALSE,,,,,,,,,,,,,,, \ No newline at end of file +8,,Second example service,description,Not TPX Impact,http://www.google.com,TRUE,,,TRUE,FALSE,,,,hello; new; data,contact 1,chief biscuit sampler,TRUE,email@emails.com,34234,McVities Head Office,51.50101,-0.141563,McVities Head Office,Biscuitville,EC1N 8BA,TRUE,FALSE,FALSE,Accessible toilet facilities;Hearing loop;Car parking;Changing facilities;British sign language (bsl);Disabled car parking space;Hoist;Baby changing facilities;Parking nearby;Bus stop nearby;Building has lift;Wheelchair accessible entrance;Partial wheelchair access,TRUE,,,,,,,,,,,Autism;Learning difficulties;Mental health/acquired brain injury;Visual and / or hearing impediment;Physical disabilities;Older people;Dementia,FALSE,,,,,,,,,,,,,,, diff --git a/spec/fixtures/data_import/services_valid.csv b/spec/fixtures/data_import/services_valid.csv index cb42321d..ce1cc580 100644 --- a/spec/fixtures/data_import/services_valid.csv +++ b/spec/fixtures/data_import/services_valid.csv @@ -1,9 +1,9 @@ import_id,import_id_reference,name,description,organisation,url,approved,visible_from,visible_to,visible,needs_referral,min_age,max_age,notes,service_taxonomies,contact_name,contact_title,contact_visible,contact_email,contact_phone,location_name,location_latitude,location_longitude,location_address_1,location_city,location_postcode,location_visible,mask_exact_address,preferred_for_post,location_accessibilities,free,cost_option,cost_amount,cost_type,temporarily_closed,schedules_opens_at,schedules_closes_at,scheduled_weekday,links_label,links_url,labels,suitabilities,is_local_offer,send_needs_support,support_description,recent_send_report,outcomes,recent_send_training,parental_involvement,information_sharing,environment_accessibility,how_to_start,future_plans,custom_text_text_field,custom_checkbox_checkbox_field,custom_number_number_field,custom_select_select_field,custom_date_date_field -1,,CSV creation service3,"We create blank CSV's showing the structure of the data to be imported. +1,,CSV creation service,"We create blank CSV's showing the structure of the data to be imported. The description allows for multiple lines. -NB this field will be shortened to 30 words in some places",TPX Impact,http://www.tpximpact.com,TRUE,2022-05-17,2023-05-17,FALSE,TRUE,0,100,if you wanted to import existing notes on the service this is the place to do so - we can add extra fields for multiple notes if required,semicolon delimited values; please,public contact name,public contacts role,TRUE,email@email.com,92939293,Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,list; of accessible features (see documentation for a default set),FALSE,Who is this fee for?,1,per half day,,09:00:00,18:00:00,monday,Facebook,http://www.google.com,internal label,comma; delimited; list,TRUE,Autism;Hearing impairment;Visual impairment;Mobility;Cognitive,dfsdfs2222,,,,,,,,,i am text,TRUE,222,option;one;two;three,2022-07-05 +NB this field will be shortened to 30 words in some places",TPX Impact,http://www.tpximpact.com,TRUE,2022-05-17,2023-05-17,FALSE,TRUE,0,100,if you wanted to import existing notes on the service this is the place to do so - we can add extra fields for multiple notes if required,semicolon delimited values; please; hello,public contact name,public contacts role,TRUE,email@email.com,92939293,Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,list; of accessible features (see documentation for a default set),FALSE,Who is this fee for?,1,per half day,,09:00:00,18:00:00,monday,Facebook,http://www.google.com,internal label,comma; delimited; list,TRUE,Autism;Hearing impairment;Visual impairment;Mobility;Cognitive,dfsdfs2222,,,,,,,,,i am text,TRUE,222,option;one;two;three,2022-07-05 2,1,,,,,,,,,,,,I am an additional note for the service with import_id 1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 3,1,,,,,,,,,,,,,,private contact for service_id 1,privat contacts job role,FALSE,email2@email.com,234234,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 4,1,,,,,,,,,,,,,,,,,,,Second Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,Accessible toilet facilities; Hoist,,,,,,,,,,,,,,,,,,,,,,,,,,,, From ebc5507652a9408943e29295e3e5a78fd3f66f52 Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Tue, 11 Oct 2022 16:35:09 +0100 Subject: [PATCH 003/105] Failing test --- spec/tasks/data_import/services_spec.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/tasks/data_import/services_spec.rb b/spec/tasks/data_import/services_spec.rb index d813cdcf..d419f309 100644 --- a/spec/tasks/data_import/services_spec.rb +++ b/spec/tasks/data_import/services_spec.rb @@ -14,9 +14,11 @@ it 'works' do expect(Service.all.count).to eq 0 expect(Link.all.reload.count).to eq 0 + expect(Taxonomy.all.count).to eq 0 Rake::Task["import:services"].invoke(valid_file_path) expect(Service.all.count).to eq 2 expect(Link.all.count).to eq 2 + expect(Taxonomy.all.count).to eq 5 end context 'with the services imported already' do @@ -34,6 +36,7 @@ expect(Service.all.count).to eq 2 expect(Link.all.count).to eq 2 + expect(Taxonomy.all.count).to eq 5 expect(Suitability.all.count).to eq 10 end end From 7b35381e9ddd668a2abdb332bdb861d2d9721802 Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Tue, 11 Oct 2022 16:36:01 +0100 Subject: [PATCH 004/105] Fix for duplicate taxonomies in data import --- lib/tasks/data_import/services/import_services.rake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/tasks/data_import/services/import_services.rake b/lib/tasks/data_import/services/import_services.rake index 792dbdf1..9179a3b6 100644 --- a/lib/tasks/data_import/services/import_services.rake +++ b/lib/tasks/data_import/services/import_services.rake @@ -282,9 +282,10 @@ namespace :import do # create taxonomies def new_service_taxonomies(service, taxonomies) taxonomies&.split(';')&.collect(&:strip)&.each do |taxonomy| - taxa = service.taxonomies.find_or_initialize_by(name: taxonomy) + taxa = Taxonomy.find_or_initialize_by(name: taxonomy) + service_taxa = service.service_taxonomies.find_or_initialize_by(taxonomy: taxa) - if taxa.save + if service_taxa.save puts " 🟢 Taxonomy: \"#{taxonomy}\" created (id: #{taxa.id})." else abort(" 🔴 Taxonomy: \"#{taxonomy}\" was not created. Exiting. #{taxa.errors.messages}") From 0b832d53afa30f77723563a5e7176e1c63358e3f Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Tue, 11 Oct 2022 16:38:50 +0100 Subject: [PATCH 005/105] Update webdrivers gem --- Gemfile.lock | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d42b67df..630bc3bb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -234,10 +234,10 @@ GEM multipart-post (2.1.1) netaddr (2.0.4) nio4r (2.5.8) - nokogiri (1.13.6) + nokogiri (1.13.8) mini_portile2 (~> 2.8.0) racc (~> 1.4) - nokogiri (1.13.6-x64-mingw32) + nokogiri (1.13.8-x64-mingw32) racc (~> 1.4) notifications-ruby-client (5.3.0) jwt (>= 1.5, < 3) @@ -343,10 +343,11 @@ GEM sprockets (> 3.0) sprockets-rails tilt - selenium-webdriver (4.1.0) + selenium-webdriver (4.5.0) childprocess (>= 0.5, < 5.0) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) semantic_range (3.0.0) sentry-rails (4.3.3) railties (>= 5.0) @@ -411,7 +412,7 @@ GEM activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webdrivers (5.0.0) + webdrivers (5.2.0) nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (~> 4.0) @@ -421,6 +422,7 @@ GEM railties (>= 5.2) semantic_range (>= 2.3.0) webrick (1.7.0) + websocket (1.2.9) websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) From 9bff7b5f1cce30e8feb17a98d9f5803ec601822d Mon Sep 17 00:00:00 2001 From: Hannah Date: Fri, 19 Aug 2022 19:08:21 +0100 Subject: [PATCH 006/105] SUPPORT-25 show end date for child services register column on ofsted registration history page --- .../ofsted/_mini-table-child-services-register.html.erb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/views/admin/ofsted/_mini-table-child-services-register.html.erb b/app/views/admin/ofsted/_mini-table-child-services-register.html.erb index 32e460a5..5f4e12cd 100644 --- a/app/views/admin/ofsted/_mini-table-child-services-register.html.erb +++ b/app/views/admin/ofsted/_mini-table-child-services-register.html.erb @@ -1,9 +1,13 @@ <% if t.present? %> + <% showEndDateCol = t.find {|r| r.key?("EndDate") }.present? %> + <% if showEndDateCol %> + + <% end %> <% t.each do |r| %> @@ -17,6 +21,11 @@ + <% if showEndDateCol %> + + <% end %> <% end %> From 5e0a578c48950a1b575f5749f61bcd6acf6f81a2 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 27 Oct 2022 17:39:44 +0100 Subject: [PATCH 007/105] SUPPORT-25 Always show end date --- .../_mini-table-child-services-register.html.erb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/views/admin/ofsted/_mini-table-child-services-register.html.erb b/app/views/admin/ofsted/_mini-table-child-services-register.html.erb index 5f4e12cd..1fdb1fc1 100644 --- a/app/views/admin/ofsted/_mini-table-child-services-register.html.erb +++ b/app/views/admin/ofsted/_mini-table-child-services-register.html.erb @@ -1,13 +1,10 @@ <% if t.present? %> - <% showEndDateCol = t.find {|r| r.key?("EndDate") }.present? %>
Status Register Start dateEnd date
<%= format_if_date(r["StartDate"]) %> + <%= format_if_date(r["EndDate"]) %> +
- <% if showEndDateCol %> - - <% end %> + <% t.each do |r| %> @@ -21,11 +18,9 @@ - <% if showEndDateCol %> - - <% end %> + <% end %> From af5f2cb53dd7e409472ef08b1edfa857b9f16dbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Oct 2022 17:01:11 +0000 Subject: [PATCH 008/105] Bump nokogiri from 1.13.6 to 1.13.9 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.6 to 1.13.9. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.6...v1.13.9) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 630bc3bb..9932b3f2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -234,10 +234,10 @@ GEM multipart-post (2.1.1) netaddr (2.0.4) nio4r (2.5.8) - nokogiri (1.13.8) + nokogiri (1.13.9) mini_portile2 (~> 2.8.0) racc (~> 1.4) - nokogiri (1.13.8-x64-mingw32) + nokogiri (1.13.9-x64-mingw32) racc (~> 1.4) notifications-ruby-client (5.3.0) jwt (>= 1.5, < 3) @@ -247,7 +247,6 @@ GEM activerecord (>= 5.2) request_store (~> 1.1) pg (1.2.2) - pg (1.2.2-x64-mingw32) pg_search (2.3.2) activerecord (>= 5.2) activesupport (>= 5.2) @@ -403,7 +402,6 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.7.7) - unf_ext (0.0.7.7-x64-mingw32) uniform_notifier (1.13.0) warden (1.2.9) rack (>= 2.0.9) From fc4d89a4f92674997a68ba230384a37d0f3afa8d Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Tue, 1 Nov 2022 10:41:52 +0000 Subject: [PATCH 009/105] Fix service location import bug Fixes a bug in the service data import where locations were being created, but not saved against a service. --- .../data_import/services/import_services.rake | 2 +- spec/fixtures/data_import/services_valid.csv | 22 +++++++--------- spec/tasks/data_import/services_spec.rb | 26 ++++++++++++++----- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/lib/tasks/data_import/services/import_services.rake b/lib/tasks/data_import/services/import_services.rake index 9179a3b6..84fc0103 100644 --- a/lib/tasks/data_import/services/import_services.rake +++ b/lib/tasks/data_import/services/import_services.rake @@ -388,7 +388,7 @@ namespace :import do skip_mongo_callbacks: true ) - if new_location.save + if service.save puts " 🟢 Location: \"#{new_location.name}\" created (id: #{new_location.id})." if location_data['location_accessibilities'].present? diff --git a/spec/fixtures/data_import/services_valid.csv b/spec/fixtures/data_import/services_valid.csv index ce1cc580..434b8c5f 100644 --- a/spec/fixtures/data_import/services_valid.csv +++ b/spec/fixtures/data_import/services_valid.csv @@ -1,13 +1,9 @@ -import_id,import_id_reference,name,description,organisation,url,approved,visible_from,visible_to,visible,needs_referral,min_age,max_age,notes,service_taxonomies,contact_name,contact_title,contact_visible,contact_email,contact_phone,location_name,location_latitude,location_longitude,location_address_1,location_city,location_postcode,location_visible,mask_exact_address,preferred_for_post,location_accessibilities,free,cost_option,cost_amount,cost_type,temporarily_closed,schedules_opens_at,schedules_closes_at,scheduled_weekday,links_label,links_url,labels,suitabilities,is_local_offer,send_needs_support,support_description,recent_send_report,outcomes,recent_send_training,parental_involvement,information_sharing,environment_accessibility,how_to_start,future_plans,custom_text_text_field,custom_checkbox_checkbox_field,custom_number_number_field,custom_select_select_field,custom_date_date_field -1,,CSV creation service,"We create blank CSV's showing the structure of the data to be imported. - -The description allows for multiple lines. - -NB this field will be shortened to 30 words in some places",TPX Impact,http://www.tpximpact.com,TRUE,2022-05-17,2023-05-17,FALSE,TRUE,0,100,if you wanted to import existing notes on the service this is the place to do so - we can add extra fields for multiple notes if required,semicolon delimited values; please; hello,public contact name,public contacts role,TRUE,email@email.com,92939293,Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,list; of accessible features (see documentation for a default set),FALSE,Who is this fee for?,1,per half day,,09:00:00,18:00:00,monday,Facebook,http://www.google.com,internal label,comma; delimited; list,TRUE,Autism;Hearing impairment;Visual impairment;Mobility;Cognitive,dfsdfs2222,,,,,,,,,i am text,TRUE,222,option;one;two;three,2022-07-05 -2,1,,,,,,,,,,,,I am an additional note for the service with import_id 1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -3,1,,,,,,,,,,,,,,private contact for service_id 1,privat contacts job role,FALSE,email2@email.com,234234,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -4,1,,,,,,,,,,,,,,,,,,,Second Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,Accessible toilet facilities; Hoist,,,,,,,,,,,,,,,,,,,,,,,,,,,, -5,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OAP,0,per session,,,,,,,,,,,,,,,,,,,,,,,, -6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,hh:mm:ss,hh:mm:ss,tuesday,,,,,,,,,,,,,,,,,,,, -7,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Twitter,http://www.google.com,,,,,,,,,,,,,,,,,, -8,,Second example service,description,Not TPX Impact,http://www.google.com,TRUE,,,TRUE,FALSE,,,,hello; new; data,contact 1,chief biscuit sampler,TRUE,email@emails.com,34234,McVities Head Office,51.50101,-0.141563,McVities Head Office,Biscuitville,EC1N 8BA,TRUE,FALSE,FALSE,Accessible toilet facilities;Hearing loop;Car parking;Changing facilities;British sign language (bsl);Disabled car parking space;Hoist;Baby changing facilities;Parking nearby;Bus stop nearby;Building has lift;Wheelchair accessible entrance;Partial wheelchair access,TRUE,,,,,,,,,,,Autism;Learning difficulties;Mental health/acquired brain injury;Visual and / or hearing impediment;Physical disabilities;Older people;Dementia,FALSE,,,,,,,,,,,,,,, +import_id,import_id_reference,name,description,organisation,url,approved,visible_from,visible_to,visible,needs_referral,min_age,max_age,notes,service_taxonomies,contact_name,contact_title,contact_visible,contact_email,contact_phone,location_name,location_latitude,location_longitude,location_address_1,location_city,location_postcode,location_visible,mask_exact_address,preferred_for_post,location_accessibilities,free,cost_option,cost_amount,cost_type,temporarily_closed,schedules_opens_at,schedules_closes_at,scheduled_weekday,links_label,links_url,labels,suitabilities,is_local_offer,send_needs_support,support_description,recent_send_report,outcomes,recent_send_training,parental_involvement,information_sharing,environment_accessibility,how_to_start,future_plans,custom_text_text_field,custom_checkbox_checkbox_field,custom_number_number_field,custom_select_select_field,custom_date_date_field +1,,Example service 1,Service 1 description,Organisation 1,http://www.tpximpact.com,TRUE,2022-05-17,2023-05-17,FALSE,TRUE,0,100,Note 1,Taxonomy 1; Taxonomy 2,Public Contact,public contacts role,TRUE,email@email.com,92939293,Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,Car parking,FALSE,Who is this fee for?,1,per half day,,09:00:00,18:00:00,monday,Facebook,http://www.google.com,internal label,Autism;Learning difficulties,TRUE,Autism;Hearing impairment;Visual impairment;Mobility;Cognitive,dfsdfs2222,,,,,,,,,i am text,TRUE,222,option;one;two;three,2022-07-05 +2,1,,,,,,,,,,,,Note 2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3,1,,,,,,,,,,,,,,Private Contact,privat contacts job role,FALSE,email2@email.com,234234,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4,1,,,,,,,,,,,,,,,,,,,Second Venue or building name,51.50101,-0.141563,Street address eg Buckingham Palace,Town or area eg london,SW1A 1AA,TRUE,FALSE,FALSE,Accessible toilet facilities; Hoist,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OAP,0,per session,,,,,,,,,,,,,,,,,,,,,,,, +6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,hh:mm:ss,hh:mm:ss,tuesday,,,,,,,,,,,,,,,,,,,, +7,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Twitter,http://www.google.com,,,,,,,,,,,,,,,,,, +8,,Example service 2,Service 2 description,Organisation 2,http://www.google.com,TRUE,,,TRUE,FALSE,,,,Taxonomy 1; Taxonomy 3,Public Contact 2,chief biscuit sampler,TRUE,email3@email.com,34234,McVities Head Office,51.50101,-0.141563,McVities Head Office,Biscuitville,EC1N 8BA,TRUE,FALSE,FALSE,Accessible toilet facilities;Hearing loop;Car parking;Changing facilities;British sign language (bsl);Disabled car parking space;Hoist;Baby changing facilities;Parking nearby;Bus stop nearby;Building has lift;Wheelchair accessible entrance;Partial wheelchair access,TRUE,,,,,,,,,,,Older people;Dementia,FALSE,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/spec/tasks/data_import/services_spec.rb b/spec/tasks/data_import/services_spec.rb index d419f309..eb888116 100644 --- a/spec/tasks/data_import/services_spec.rb +++ b/spec/tasks/data_import/services_spec.rb @@ -15,10 +15,25 @@ expect(Service.all.count).to eq 0 expect(Link.all.reload.count).to eq 0 expect(Taxonomy.all.count).to eq 0 + expect(ServiceTaxonomy.all.count).to eq 0 + Rake::Task["import:services"].invoke(valid_file_path) + expect(Service.all.count).to eq 2 expect(Link.all.count).to eq 2 - expect(Taxonomy.all.count).to eq 5 + expect(Taxonomy.all.count).to eq 3 + + service_1 = Service.all.first + service_2 = Service.all.last + + expect(service_1.taxonomies.count).to eq 2 + expect(service_1.locations.count).to eq 2 + expect(service_1.locations.first.accessibilities.count).to eq 1 + expect(service_1.locations.last.accessibilities.count).to eq 2 + expect(service_1.contacts.count).to eq 2 + expect(service_2.taxonomies.count).to eq 2 + expect(service_2.locations.count).to eq 1 + expect(service_2.contacts.count).to eq 1 end context 'with the services imported already' do @@ -30,21 +45,20 @@ it 'does not duplicate any services or other data' do expect(Service.all.count).to eq 2 expect(Link.all.count).to eq 2 - expect(Suitability.all.count).to eq 10 + expect(Suitability.all.count).to eq 4 Rake::Task["import:services"].invoke(valid_file_path) expect(Service.all.count).to eq 2 expect(Link.all.count).to eq 2 - expect(Taxonomy.all.count).to eq 5 - expect(Suitability.all.count).to eq 10 + expect(Taxonomy.all.count).to eq 3 + expect(Suitability.all.count).to eq 4 end end context 'with custom fields in the DB' do - let!(:custom_text_field) { FactoryBot.create :custom_field, key: 'text field' } - before do + FactoryBot.create :custom_field, key: 'text field' FactoryBot.create :custom_field, :number, key: 'number field' FactoryBot.create :custom_field, :checkbox, key: 'checkbox field' FactoryBot.create :custom_field, :date, key: 'date field' From db12581cdada591ff378696bc1eef2ccd02457ab Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Wed, 2 Nov 2022 13:54:44 +0000 Subject: [PATCH 010/105] Test that only superadmins can view site settings --- spec/features/editing_site_settings_spec.rb | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 spec/features/editing_site_settings_spec.rb diff --git a/spec/features/editing_site_settings_spec.rb b/spec/features/editing_site_settings_spec.rb new file mode 100644 index 00000000..78333620 --- /dev/null +++ b/spec/features/editing_site_settings_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' + +feature 'Editing site settings' do + + context 'as a regular admin' do + let(:admin) { FactoryBot.create :user, :services_admin } + + before { login_as admin } + + it 'cannot view or update site settings' do + visit edit_admin_settings_path + expect(page).to_not have_current_path edit_admin_settings_path + expect(page).to_not have_content 'Outpost title' + end + end + + context 'as a super admin' do + let(:admin) { FactoryBot.create :user, :superadmin } + + before { login_as admin } + + it 'can view and edit site settings' do + visit edit_admin_settings_path + expect(page).to have_current_path edit_admin_settings_path + expect(page).to have_content 'Outpost title' + end + end +end From 7cef1a24281012b379bbe2e782ac2cd0ce147bba Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Wed, 2 Nov 2022 14:30:15 +0000 Subject: [PATCH 011/105] Add test for updating site settings --- spec/features/editing_site_settings_spec.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spec/features/editing_site_settings_spec.rb b/spec/features/editing_site_settings_spec.rb index 78333620..4d8e7c61 100644 --- a/spec/features/editing_site_settings_spec.rb +++ b/spec/features/editing_site_settings_spec.rb @@ -19,10 +19,20 @@ before { login_as admin } - it 'can view and edit site settings' do + it 'can view site settings' do visit edit_admin_settings_path expect(page).to have_current_path edit_admin_settings_path expect(page).to have_content 'Outpost title' end + + it 'can edit site settings' do + site_name = 'My service directory' + visit edit_admin_settings_path + fill_in :form_admin_settings_outpost_title, with: site_name + click_button 'Save' + expect(page).to have_content 'Settings have been saved' + visit root_path + expect(page).to have_content site_name + end end end From e874f92de9a8eebbb024b38c405651a44d910551 Mon Sep 17 00:00:00 2001 From: lizzie cullen davison Date: Wed, 2 Nov 2022 14:57:55 +0000 Subject: [PATCH 012/105] Adds support to generate HTML version of code coverage report for viewing coverage locally --- spec/spec_helper.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2a3f8724..97bb4918 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,11 @@ require 'simplecov' -SimpleCov.start +SimpleCov.start 'rails' require 'simplecov-cobertura' -SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter +SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([ + SimpleCov::Formatter::CoberturaFormatter, + SimpleCov::Formatter::HTMLFormatter +]) # This file was generated by the `rails generate rspec:install` command. Conventionally, all # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. From 03871d35fb39f7dd6e0f8e21cf29c9bf6f55c8b8 Mon Sep 17 00:00:00 2001 From: Han Date: Fri, 10 Mar 2023 20:15:33 +0000 Subject: [PATCH 013/105] Docker environment for Outpost Minus rails 7 upgrades for now --- .dockerignore | 32 ++ .gitignore | 5 +- Dockerfile | 78 +++++ Gemfile.lock | 463 +++++++++++++------------- config/database.yml | 19 +- config/secrets.yml | 11 + db/_sample-data.yml | 51 +++ db/_seed.yml | 59 +--- db/seeds.rb | 120 ++++--- docker-compose.development.yml | 58 ++++ docker-compose.yml | 21 -- environment/docker-run-development.sh | 14 + environment/docker-run-production.sh | 5 + package.json | 2 +- .env.example => sample.env | 18 +- 15 files changed, 585 insertions(+), 371 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 config/secrets.yml create mode 100644 db/_sample-data.yml create mode 100644 docker-compose.development.yml delete mode 100644 docker-compose.yml create mode 100644 environment/docker-run-development.sh create mode 100644 environment/docker-run-production.sh rename .env.example => sample.env (59%) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..784408b0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,32 @@ +.git +.dockerignore +.env +.vscode +node_modules/ +bundle/ +tmp/ +.env* +environment/artifacts + +.bundle +.env +.env.* +.git +.gitattributes +.gitignore +.github +public/system +public/assets +public/packs +node_modules +neo4j +vendor/bundle +.DS_Store +*.swp +*~ +postgres +postgres14 +redis +elasticsearch +chart +docker-compose* \ No newline at end of file diff --git a/.gitignore b/.gitignore index fddabc3f..5d22a410 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,7 @@ yarn-debug.log* .DS_Store yarn.lock -.vscode \ No newline at end of file +.vscode + +/environment/artifacts +.env* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b755148a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,78 @@ +# using docker image layers to save waiting for things to rebuild all the time +# base_image > build_rails > build_frontend > development + +FROM ruby:3.0.5-alpine as base_image +RUN apk add --no-cache git \ + build-base \ + libpq-dev \ + tzdata \ + gcompat \ + python3 + +# gcompat is for nokogiri - alpine doesnt include glibc it needs https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library +# python2 for node-sass drama + +# install node v16 +# see here for reference https://github.com/timbru31/docker-ruby-node/blob/master/3.0/16/alpine/Dockerfile +RUN apk -U upgrade \ + && apk add --repository https://dl-cdn.alpinelinux.org/alpine/v3.16/main/ --no-cache \ + "nodejs<18" \ + && apk add --no-cache \ + npm \ + yarn + +# install various gems +FROM base_image as build_app +COPY ./Gemfile /tmp/Gemfile +COPY ./Gemfile.lock /tmp/Gemfile.lock +COPY ./package.json /tmp/package.json +COPY ./yarn.lock /tmp/yarn.lock + +RUN cd /tmp && \ + bundle install && \ + yarn install && \ + apk add --no-cache git + + + +WORKDIR /app + +FROM build_app as base_env +COPY --from=build_app /tmp . + + +# build and install all the things for the development env +FROM base_env as development +COPY ./environment/docker-run-development.sh /rdebug_ide/runner.sh +RUN gem install ruby-debug-ide && \ + chmod +x /rdebug_ide/runner.sh + +ENV RAILS_ENV="development" \ + NODE_ENV="development" \ + RAILS_SERVE_STATIC_FILES="false" +EXPOSE 3000 +# ENTRYPOINT ["tail", "-f", "/dev/null"] +CMD ["/rdebug_ide/runner.sh"] +# CMD bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -u puma -p 3000 -b '0.0.0.0'" +# ENTRYPOINT ["tail", "-f", "/dev/null"] + + +# build and install all the things for the production env +FROM base_env as production +COPY ./environment/docker-run-production.sh /runner/runner.sh +COPY . . +RUN chmod +x /runner/runner.sh +EXPOSE 3000 + +ENV RAILS_ENV="production" \ + NODE_ENV="production" \ + RAILS_SERVE_STATIC_FILES="true" + +# ENTRYPOINT ["/usr/bin/tini", "--"] +CMD ["/runner/runner.sh"] +# ENTRYPOINT ["/usr/bin/tini", "--"] +# CMD bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -u puma -p 3000 -b '0.0.0.0'" +# ENTRYPOINT ['./environment/docker-run-production.sh'] +# CMD ["rails", "s", "-p", "3000"] +# ENTRYPOINT ["tail", "-f", "/dev/null"] + diff --git a/Gemfile.lock b/Gemfile.lock index 9932b3f2..300a4c51 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,81 +1,81 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.3.6) - actionpack (= 6.0.3.6) + actioncable (6.0.6.1) + actionpack (= 6.0.6.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.3.6) - actionpack (= 6.0.3.6) - activejob (= 6.0.3.6) - activerecord (= 6.0.3.6) - activestorage (= 6.0.3.6) - activesupport (= 6.0.3.6) + actionmailbox (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) mail (>= 2.7.1) - actionmailer (6.0.3.6) - actionpack (= 6.0.3.6) - actionview (= 6.0.3.6) - activejob (= 6.0.3.6) + actionmailer (6.0.6.1) + actionpack (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.3.6) - actionview (= 6.0.3.6) - activesupport (= 6.0.3.6) + actionpack (6.0.6.1) + actionview (= 6.0.6.1) + activesupport (= 6.0.6.1) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.3.6) - actionpack (= 6.0.3.6) - activerecord (= 6.0.3.6) - activestorage (= 6.0.3.6) - activesupport (= 6.0.3.6) + actiontext (6.0.6.1) + actionpack (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) nokogiri (>= 1.8.5) - actionview (6.0.3.6) - activesupport (= 6.0.3.6) + actionview (6.0.6.1) + activesupport (= 6.0.6.1) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_model_serializers (0.10.10) - actionpack (>= 4.1, < 6.1) - activemodel (>= 4.1, < 6.1) + active_model_serializers (0.10.13) + actionpack (>= 4.1, < 7.1) + activemodel (>= 4.1, < 7.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (6.0.3.6) - activesupport (= 6.0.3.6) + activejob (6.0.6.1) + activesupport (= 6.0.6.1) globalid (>= 0.3.6) - activemodel (6.0.3.6) - activesupport (= 6.0.3.6) - activerecord (6.0.3.6) - activemodel (= 6.0.3.6) - activesupport (= 6.0.3.6) - activestorage (6.0.3.6) - actionpack (= 6.0.3.6) - activejob (= 6.0.3.6) - activerecord (= 6.0.3.6) - marcel (~> 1.0.0) - activesupport (6.0.3.6) + activemodel (6.0.6.1) + activesupport (= 6.0.6.1) + activerecord (6.0.6.1) + activemodel (= 6.0.6.1) + activesupport (= 6.0.6.1) + activestorage (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + marcel (~> 1.0) + activesupport (6.0.6.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - acts-as-taggable-on (8.1.0) - activerecord (>= 5.0, < 6.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - bcrypt (3.1.16) + acts-as-taggable-on (9.0.1) + activerecord (>= 6.0, < 7.1) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + bcrypt (3.1.18) bindex (0.8.1) - bootsnap (1.11.1) + bootsnap (1.16.0) msgpack (~> 1.2) - bson (4.9.2) + bson (4.15.0) builder (3.2.4) - bullet (6.1.0) + bullet (7.0.7) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - byebug (11.1.1) - capybara (3.36.0) + byebug (11.1.3) + capybara (3.38.0) addressable matrix mini_mime (>= 0.1.3) @@ -86,64 +86,65 @@ GEM xpath (~> 3.2) case_transform (0.2) activesupport - childprocess (4.1.0) closure_tree (7.4.0) activerecord (>= 4.2.10) with_advisory_lock (>= 4.0.0) - codecov (0.5.2) + codecov (0.6.0) simplecov (>= 0.15, < 0.22) - concurrent-ruby (1.1.9) + concurrent-ruby (1.2.2) crass (1.0.6) - database_cleaner (1.7.0) + database_cleaner (2.0.2) + database_cleaner-active_record (>= 2, < 3) + database_cleaner-active_record (2.1.0) + activerecord (>= 5.a) + database_cleaner-core (~> 2.0.0) + database_cleaner-core (2.0.1) + date (3.3.3) declarative (0.0.20) - devise (4.8.1) + devise (4.9.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-security (0.14.3) - devise (>= 4.3.0, < 5.0) - rails (>= 4.2.0, < 7.0) + devise-security (0.17.0) + devise (>= 4.3.0) devise_lastseenable (0.0.6) devise rails (>= 3.0.4) - diff-lcs (1.4.4) - diffy (3.4.1) + diff-lcs (1.5.0) + diffy (3.4.2) digest-crc (0.6.4) rake (>= 12.0.0, < 14.0.0) - discard (1.2.0) - activerecord (>= 4.2, < 7) + discard (1.2.1) + activerecord (>= 4.2, < 8) docile (1.4.0) - doorkeeper (5.4.0) + doorkeeper (5.6.5) railties (>= 5) - dotenv (2.7.4) - dotenv-rails (2.7.4) - dotenv (= 2.7.4) - railties (>= 3.2, < 6.1) - email_address (0.1.16) - netaddr (>= 2.0.4, < 3) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) + email_address (0.2.4) simpleidn - erubi (1.10.0) - factory_bot (5.1.1) - activesupport (>= 4.2.0) - factory_bot_rails (5.1.1) - factory_bot (~> 5.1.0) - railties (>= 4.2.0) - faker (2.19.0) - i18n (>= 1.6, < 2) - faraday (1.3.0) - faraday-net_http (~> 1.0) - multipart-post (>= 1.2, < 3) - ruby2_keywords - faraday-net_http (1.0.1) + erubi (1.12.0) + factory_bot (6.2.1) + activesupport (>= 5.0.0) + factory_bot_rails (6.2.0) + factory_bot (~> 6.2.0) + railties (>= 5.0.0) + faker (3.1.1) + i18n (>= 1.8.11, < 2) + faraday (2.7.4) + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) ffi (1.15.5) - ffi (1.15.5-x64-mingw32) - filterrific (5.2.1) - geocoder (1.6.2) - globalid (0.4.2) - activesupport (>= 4.2.0) - google-apis-core (0.6.0) + filterrific (5.2.5) + geocoder (1.8.1) + globalid (1.1.0) + activesupport (>= 5.0) + google-apis-core (0.11.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -152,260 +153,257 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.12.0) - google-apis-core (>= 0.6, < 2.a) - google-apis-storage_v1 (0.15.0) - google-apis-core (>= 0.5, < 2.a) + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.2.0) - google-cloud-storage (1.36.2) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.19.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.1.3) + googleauth (1.3.0) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - httparty (0.18.0) - mime-types (~> 3.0) + httparty (0.21.0) + mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) httpclient (2.8.3) - i18n (1.8.11) + i18n (1.12.0) concurrent-ruby (~> 1.0) - jbuilder (2.10.0) + jbuilder (2.11.5) + actionview (>= 5.0.0) activesupport (>= 5.0.0) jsonapi-renderer (0.2.2) - jwt (2.2.2) - kaminari (1.2.1) + jwt (2.7.0) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) - launchy (2.5.0) - addressable (~> 2.7) - listen (3.7.1) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + launchy (2.5.2) + addressable (~> 2.8) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.18.0) + loofah (2.19.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) - mail (2.7.1) + mail (2.8.1) mini_mime (>= 0.1.1) - mail-notify (1.0.4) - actionmailer (>= 5.2.4.3) - actionpack (>= 5.2.4.3) - actionview (>= 5.2.4.3) - activesupport (>= 5.2.4.3) + net-imap + net-pop + net-smtp + mail-notify (1.1.0) + actionmailer (>= 5.2.4.6) + actionpack (>= 5.2.7.1) + actionview (>= 5.2.7.1) + activesupport (>= 5.2.4.6) notifications-ruby-client (~> 5.1) - rack (>= 2.1.4) - marcel (1.0.0) + rack (>= 2.1.4.1) + marcel (1.0.2) matrix (0.4.2) memoist (0.16.2) method_source (1.0.0) - mime-types (3.4.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2021.1115) mini_mime (1.1.2) - mini_portile2 (2.8.0) - minitest (5.15.0) - mongo (2.12.1) - bson (>= 4.8.2, < 5.0.0) - msgpack (1.4.5) + minitest (5.18.0) + mongo (2.18.2) + bson (>= 4.14.1, < 5.0.0) + msgpack (1.6.1) multi_json (1.15.0) multi_xml (0.6.0) - multipart-post (2.1.1) - netaddr (2.0.4) + net-imap (0.3.4) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.3.3) + net-protocol nio4r (2.5.8) - nokogiri (1.13.9) - mini_portile2 (~> 2.8.0) + nokogiri (1.14.2-aarch64-linux) racc (~> 1.4) - nokogiri (1.13.9-x64-mingw32) - racc (~> 1.4) - notifications-ruby-client (5.3.0) + notifications-ruby-client (5.4.0) jwt (>= 1.5, < 3) orm_adapter (0.5.0) os (1.1.4) - paper_trail (11.0.0) - activerecord (>= 5.2) - request_store (~> 1.1) - pg (1.2.2) - pg_search (2.3.2) + paper_trail (14.0.0) + activerecord (>= 6.0) + request_store (~> 1.4) + pg (1.4.6) + pg_search (2.3.6) activerecord (>= 5.2) activesupport (>= 5.2) - public_suffix (4.0.6) + public_suffix (5.0.1) puma (4.3.12) nio4r (~> 2.0) - racc (1.6.0) - rack (2.2.4) - rack-attack (6.6.0) + racc (1.6.2) + rack (2.2.6.3) + rack-attack (6.6.1) rack (>= 1.0, < 3) - rack-cors (1.1.1) + rack-cors (2.0.0) rack (>= 2.0.0) - rack-mini-profiler (2.0.1) + rack-mini-profiler (3.0.0) rack (>= 1.2.0) - rack-proxy (0.7.2) + rack-proxy (0.7.6) rack - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (6.0.3.6) - actioncable (= 6.0.3.6) - actionmailbox (= 6.0.3.6) - actionmailer (= 6.0.3.6) - actionpack (= 6.0.3.6) - actiontext (= 6.0.3.6) - actionview (= 6.0.3.6) - activejob (= 6.0.3.6) - activemodel (= 6.0.3.6) - activerecord (= 6.0.3.6) - activestorage (= 6.0.3.6) - activesupport (= 6.0.3.6) + rack-test (2.0.2) + rack (>= 1.3) + rails (6.0.6.1) + actioncable (= 6.0.6.1) + actionmailbox (= 6.0.6.1) + actionmailer (= 6.0.6.1) + actionpack (= 6.0.6.1) + actiontext (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) + activemodel (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) bundler (>= 1.3.0) - railties (= 6.0.3.6) + railties (= 6.0.6.1) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.4.3) - loofah (~> 2.3) - rails-settings-cached (2.8.2) - rails (>= 5.0.0) + rails-html-sanitizer (1.5.0) + loofah (~> 2.19, >= 2.19.1) + rails-settings-cached (2.8.3) + activerecord (>= 5.0.0) + railties (>= 5.0.0) rails_email_validator (0.1.4) activemodel (>= 3.0.0) - railties (6.0.3.6) - actionpack (= 6.0.3.6) - activesupport (= 6.0.3.6) + railties (6.0.6.1) + actionpack (= 6.0.6.1) + activesupport (= 6.0.6.1) method_source rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rake (13.0.6) - rb-fsevent (0.11.1) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - regexp_parser (2.2.0) + regexp_parser (2.7.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - request_store (1.5.0) + request_store (1.5.1) rack (>= 1.4) - responders (3.0.1) - actionpack (>= 5.0) - railties (>= 5.0) + responders (3.1.0) + actionpack (>= 5.2) + railties (>= 5.2) retriable (3.1.2) rexml (3.2.5) - rspec-core (3.9.2) - rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) + rspec-core (3.12.1) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-rails (4.0.1) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) - rspec-core (~> 3.9) - rspec-expectations (~> 3.9) - rspec-mocks (~> 3.9) - rspec-support (~> 3.9) - rspec-support (3.9.3) - ruby2_keywords (0.0.4) + rspec-support (~> 3.12.0) + rspec-rails (5.1.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) + rspec-core (~> 3.10) + rspec-expectations (~> 3.10) + rspec-mocks (~> 3.10) + rspec-support (~> 3.10) + rspec-support (3.12.0) + ruby2_keywords (0.0.5) rubyzip (2.3.2) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) ffi (~> 1.9) - sassc (2.4.0-x64-mingw32) - ffi (~> 1.9) sassc-rails (2.1.2) railties (>= 4.0.0) sassc (>= 2.0) sprockets (> 3.0) sprockets-rails tilt - selenium-webdriver (4.5.0) - childprocess (>= 0.5, < 5.0) + selenium-webdriver (4.8.1) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) semantic_range (3.0.0) - sentry-rails (4.3.3) + sentry-rails (5.8.0) railties (>= 5.0) - sentry-ruby-core (~> 4.3.0) - sentry-ruby (4.3.1) + sentry-ruby (~> 5.8.0) + sentry-ruby (5.8.0) concurrent-ruby (~> 1.0, >= 1.0.2) - faraday (>= 1.0) - sentry-ruby-core (= 4.3.1) - sentry-ruby-core (4.3.1) - concurrent-ruby - faraday - shoulda-matchers (4.3.0) - activesupport (>= 4.2.0) - signet (0.16.1) + shoulda-matchers (5.3.0) + activesupport (>= 5.2.0) + signet (0.17.0) addressable (~> 2.8) - faraday (>= 0.17.5, < 3.0) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-cobertura (1.4.2) - simplecov (~> 0.8) + simplecov-cobertura (2.1.0) + rexml + simplecov (~> 0.19) simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) - simpleidn (0.1.1) + simpleidn (0.2.1) unf (~> 0.1.4) - spring (2.1.0) + spring (2.1.1) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.0.2) + sprockets (4.2.0) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - thor (1.1.0) + thor (1.2.1) thread_safe (0.3.6) - tilt (2.0.10) + tilt (2.1.0) + timeout (0.3.2) trailblazer-option (0.1.2) turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - tzinfo (1.2.10) + tzinfo (1.2.11) thread_safe (~> 0.1) - tzinfo-data (1.2020.1) - tzinfo (>= 1.0.0) uber (0.1.0) - uk_postcode (2.1.5) + uk_postcode (2.1.8) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - uniform_notifier (1.13.0) + unf_ext (0.0.8.2) + uniform_notifier (1.16.0) warden (1.2.9) rack (>= 2.0.9) - web-console (4.0.1) + web-console (4.2.0) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) @@ -414,25 +412,24 @@ GEM nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (~> 4.0) - webpacker (5.4.3) + webpacker (5.4.4) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) - webrick (1.7.0) + webrick (1.8.1) websocket (1.2.9) - websocket-driver (0.7.3) + websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) with_advisory_lock (4.6.0) activerecord (>= 4.2) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.5.1) + zeitwerk (2.6.7) PLATFORMS - ruby - x64-mingw32 + aarch64-linux-musl DEPENDENCIES active_model_serializers @@ -492,7 +489,7 @@ DEPENDENCIES webpacker (~> 5.0) RUBY VERSION - ruby 3.0.3p157 + ruby 3.0.5p211 BUNDLED WITH - 2.3.9 + 2.2.33 diff --git a/config/database.yml b/config/database.yml index 12ffb328..ab6be11d 100644 --- a/config/database.yml +++ b/config/database.yml @@ -2,19 +2,20 @@ default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + timeout: <%= ENV.fetch("RAILS_TIMEOUT") { 5000 } %> development: <<: *default - url: postgresql://localhost/outpost_development - username: outpost - password: password + url: <%= ENV["DATABASE_URL"].gsub('?', '_development?') %> + test: <<: *default - url: postgresql://localhost/outpost_test - username: outpost - password: password + url: <%= ENV["DATABASE_URL"].gsub('?', '_test?') %> + +staging: + <<: *default + url: <%= ENV["DATABASE_URL"].gsub('?', '_staging?') %> + production: <<: *default - database: outpost_production - username: outpost - password: <%= ENV['OUTPOST_DATABASE_PASSWORD'] %> + url: <%= ENV["DATABASE_URL"].gsub('?', '_production?') %> diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 00000000..1f321746 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,11 @@ +development: &default + secret_key_base: <%= ENV['SECRET_TOKEN'] %> + +test: + <<: *default + +staging: + <<: *default + +production: + <<: *default diff --git a/db/_sample-data.yml b/db/_sample-data.yml new file mode 100644 index 00000000..b4df2c13 --- /dev/null +++ b/db/_sample-data.yml @@ -0,0 +1,51 @@ +locations: + - address_1: Buckingham Palace + city: London + postal_code: SW1A 1AA + latitude: 51.501009 + longitude: -0.141588 + - address_1: Broadcasting House, Peel Wing, Portland Pl + city: London + postal_code: W1A 1AA + latitude: 51.518561 + longitude: -0.143799 + - address_1: Town Hall Pinstone Street + city: Sheffield, GB + postal_code: S1 2HH + latitude: 53.380384 + longitude: -1.470006 + - address_1: Motorpoint Arena Cardiff, Mary Ann St + city: Cardiff + postal_code: CF10 2EQ + latitude: 51.478914 + longitude: -3.171759 + - address_1: 20 St Thomas Street + city: London + postal_code: SE1 9RG + latitude: 51.504642 + longitude: -0.08899 + - address_1: Edinburgh Waverley Station + city: Edinburgh + postal_code: EH8 8DL + latitude: 55.952623 + longitude: -3.18135 + - address_1: Brindleyplace, The Water's Edge + city: Birmingham, GB + postal_code: B1 2HL + latitude: 52.478182 + longitude: -1.912008 + - address_1: The Upper Mill, Kingston Road, Ewell + city: Surrey + postal_code: KT17 2AF + latitude: 51.352525 + longitude: -0.251579 + - address_1: Alexandra Palace, Wood Green + city: London, GB + postal_code: N22 7AY + latitude: 51.594481 + longitude: -0.130527 + - address_1: 55 Norfolk Street + city: Sheffield + postal_code: S1 1DA + latitude: 53.38108 + longitude: 1.466765 diff --git a/db/_seed.yml b/db/_seed.yml index 4ec90659..9b09f9c8 100644 --- a/db/_seed.yml +++ b/db/_seed.yml @@ -1,56 +1,4 @@ -locations: - - address_1: Buckingham Palace - city: London - postal_code: SW1A 1AA - latitude: 51.501009 - longitude: -0.141588 - - address_1: Broadcasting House, Peel Wing, Portland Pl - city: London - postal_code: W1A 1AA - latitude: 51.518561 - longitude: -0.143799 - - address_1: Town Hall Pinstone Street - city: Sheffield, GB - postal_code: S1 2HH - latitude: 53.380384 - longitude: -1.470006 - - address_1: Motorpoint Arena Cardiff, Mary Ann St - city: Cardiff - postal_code: CF10 2EQ - latitude: 51.478914 - longitude: -3.171759 - - address_1: 20 St Thomas Street - city: London - postal_code: SE1 9RG - latitude: 51.504642 - longitude: -0.08899 - - address_1: Edinburgh Waverley Station - city: Edinburgh - postal_code: EH8 8DL - latitude: 55.952623 - longitude: -3.18135 - - address_1: Brindleyplace, The Water's Edge - city: Birmingham, GB - postal_code: B1 2HL - latitude: 52.478182 - longitude: -1.912008 - - address_1: The Upper Mill, Kingston Road, Ewell - city: Surrey - postal_code: KT17 2AF - latitude: 51.352525 - longitude: -0.251579 - - address_1: Alexandra Palace, Wood Green - city: London, GB - postal_code: N22 7AY - latitude: 51.594481 - longitude: -0.130527 - - address_1: 55 Norfolk Street - city: Sheffield - postal_code: S1 1DA - latitude: 53.38108 - longitude: 1.466765 - -accessibilities: +accessibilities: - Accessible toilet facilities - Hearing loop - Car parking @@ -65,8 +13,7 @@ accessibilities: - Wheelchair accessible entrance - Partial wheelchair access - -send_needs: +send_needs: - Autism - Hearing impairment - Visual impairment @@ -80,4 +27,4 @@ suitabilities: - Visual and / or hearing impediment - Physical disabilities - Older people - - Dementia \ No newline at end of file + - Dementia diff --git a/db/seeds.rb b/db/seeds.rb index 0cfca2fe..cfd8dc33 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,17 +1,12 @@ yaml = Rails.root.join('db', '_seed.yml') data = YAML::load_file(yaml) -# use our realistic sample UK data - fake data won't correctly geocode -data["locations"].each do |l| - Location.create!({ - address_1: l["address_1"], - city: l["city"], - postal_code: l["postal_code"], - latitude: l["latitude"], - longitude: l["longitude"], - skip_mongo_callbacks: true - }) -end +sample_yaml = Rails.root.join('db', '_sample-data.yml') +sample_data = YAML::load_file(sample_yaml) + + +import_sample_data = ENV["IMPORT_SAMPLE_DATA"] || false; + data["accessibilities"].each do |n| Accessibility.create!({name: n}) @@ -25,49 +20,78 @@ Suitability.create!({name: n}) end -10.times do - taxon = Taxonomy.create!({ - name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize - }) -end +#make a single admin user +User.create!({ + first_name: "Example", + last_name: "Admin", + admin: true, + admin_users: true, + admin_ofsted: true, + email: ENV["INITIAL_ADMIN_EMAIL"] || "example@example.com", + password: ENV["INITIAL_ADMIN_PASSWORD"] || "FakePassword1!" +}) -10.times do - org = Organisation.create!({ - name: Faker::Company.name, - skip_mongo_callbacks: true - }) - - rand(0...2).times do - user = User.create!({ - first_name: Faker::Name.first_name, - last_name: Faker::Name.last_name, - email: Faker::Internet.email(domain: "example.com"), - organisation: org, - password: "FakePassword1!" + +if import_sample_data + + # use our realistic sample UK data - fake data won't correctly geocode + sample_data["locations"].each do |l| + Location.create!({ + address_1: l["address_1"], + city: l["city"], + postal_code: l["postal_code"], + latitude: l["latitude"], + longitude: l["longitude"], + skip_mongo_callbacks: true }) end - rand(0...5).times do - service = Service.create!({ + 10.times do + taxon = Taxonomy.create!({ + name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize + }) + end + + # subcategories + taxonomy_ids = Taxonomy.where.not(parent_id: nil).last(10).map(&:id) + taxonomy_ids.each do | t | + rand(0...10).times do + child_taxon = Taxonomy.create!({ + name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize, + parent_id: t + }) + end + end + + 10.times do + org = Organisation.create!({ name: Faker::Company.name, - organisation: org, - description: Faker::Lorem.paragraph, skip_mongo_callbacks: true }) - # byebug - service.locations << Location.take - service.taxonomies << Taxonomy.take - service.save! + + rand(0...2).times do + user = User.create!({ + first_name: Faker::Name.first_name, + last_name: Faker::Name.last_name, + email: Faker::Internet.email(domain: "example.com"), + organisation: org, + password: "FakePassword1!" + }) + end + + rand(0...5).times do + service = Service.create!({ + name: Faker::Company.name, + organisation: org, + description: Faker::Lorem.paragraph, + skip_mongo_callbacks: true + }) + # byebug + service.locations << Location.take + service.taxonomies << Taxonomy.take + service.save! + end end -end -# make a single admin user -User.create!({ - first_name: "Example", - last_name: "Admin", - admin: true, - admin_users: true, - admin_ofsted: true, - email: "example@example.com", - password: ENV["INITIAL_ADMIN_PASSWORD"] || "FakePassword1!" -}) \ No newline at end of file + +end \ No newline at end of file diff --git a/docker-compose.development.yml b/docker-compose.development.yml new file mode 100644 index 00000000..a2358958 --- /dev/null +++ b/docker-compose.development.yml @@ -0,0 +1,58 @@ +version: "3.7" +services: + # Outpost app + + outpost: + image: "outpost:development" + container_name: outpost + init: true + depends_on: + - postgres + build: + target: development + ports: + - 3000:3000 + volumes: + - ./:/app:cached + environment: + PROJECT_NAME: ${PROJECT_NAME} + PUMA_WORKERS: 0 + RAILS_MAX_THREADS: 5 + networks: + - external_network + - internal_network + + # Databases + + postgres: + image: postgres:13.7-alpine + container_name: outpost-db-postgres + environment: + POSTGRES_USER: ${POSTGRES_DB_USER} + POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD} + ports: + - 5432:5432 + volumes: + - outpost-postgres-volume:/var/lib/postgresql/data + networks: + - internal_network + + mongo: + image: mongo:6 + container_name: outpost-db-mongo + ports: + - 27017:27017 + volumes: + - outpost-mongo-volume:/data/db + networks: + - internal_network + - external_network + +volumes: + outpost-postgres-volume: + outpost-mongo-volume: + +networks: + external_network: + internal_network: + internal: true diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 0507fb19..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: '3.1' - -services: - - db: - image: postgres - restart: always - environment: - POSTGRES_PASSWORD: password - POSTGRES_DB: outpost_development - POSTGRES_USER: outpost - ports: - - "5432:5432" - mongo: - image: mongo - restart: always - environment: - MONGO_INITDB_ROOT_USERNAME: root - MONGO_INITDB_ROOT_PASSWORD: password - ports: - - "27017:27017" \ No newline at end of file diff --git a/environment/docker-run-development.sh b/environment/docker-run-development.sh new file mode 100644 index 00000000..016d5626 --- /dev/null +++ b/environment/docker-run-development.sh @@ -0,0 +1,14 @@ +#!/bin/ash + +cd /app +rm -f /app/tmp/pids/server.pid + +#rails db:migrate RAILS_ENV=development +rails s -u puma -p 3000 -b=0.0.0.0 + +# TODO get debug version working +#bundle exec rdebug-ide --host 0.0.0.0 --dispatcher-port 33030 --port 13030 -- rails s -u puma -p 3000 -b=0.0.0.0 + + + +#cd /app && rm -f /app/tmp/pids/server.pid && rails s -u puma -p 3000 -b=0.0.0.0 \ No newline at end of file diff --git a/environment/docker-run-production.sh b/environment/docker-run-production.sh new file mode 100644 index 00000000..06458687 --- /dev/null +++ b/environment/docker-run-production.sh @@ -0,0 +1,5 @@ +#!/bin/ash + +cd /app +rm -f /app/tmp/pids/server.pid +rails s -u puma -p 3000 -b=0.0.0.0 diff --git a/package.json b/package.json index 1b8b7544..35aa0325 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "@rails/actioncable": "^6.0.0", "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.0", - "@rails/webpacker": "5.4.3", + "@rails/webpacker": "5.4.4", "@yaireo/tagify": "^3.8.0", "choices.js": "^9.0.1", "conglomerate-element-dataset": "^1.4.1", diff --git a/.env.example b/sample.env similarity index 59% rename from .env.example rename to sample.env index 2bc37848..96dd12d2 100644 --- a/.env.example +++ b/sample.env @@ -1,5 +1,19 @@ # Env vars +PROJECT_NAME=outpost_development +#IMPORT_SAMPLE_DATA=true + +# You would typically use rake secret to generate a secure token. It is +# critical that you keep this value private in production. +SECRET_TOKEN= + + +# ------------------ for docker + +POSTGRES_DB_USER=outpost_development +POSTGRES_DB_PASSWORD=outpost_development + + # ------------------ deprecated #INSTANCE= @@ -11,8 +25,8 @@ FEEDBACK_FORM_URL= # ------------------ database connections -DATABASE_URL= -DB_URI= +DATABASE_URL=postgresql://outpost_development:outpost_development@postgres:5432/outpost?timeout=5000 +DB_URI=mongodb://mongo/outpost_api_development # ------------------ emails From 6ca3b7503e22e1a1a39545304a07f2f47083c60b Mon Sep 17 00:00:00 2001 From: Han Date: Fri, 10 Mar 2023 20:23:02 +0000 Subject: [PATCH 014/105] Revert "Docker environment for Outpost" for some reason tower pushed to develop and not my feature branch This reverts commit 03871d35fb39f7dd6e0f8e21cf29c9bf6f55c8b8. --- .dockerignore | 32 -- sample.env => .env.example | 18 +- .gitignore | 5 +- Dockerfile | 78 ----- Gemfile.lock | 463 +++++++++++++------------- config/database.yml | 19 +- config/secrets.yml | 11 - db/_sample-data.yml | 51 --- db/_seed.yml | 59 +++- db/seeds.rb | 120 +++---- docker-compose.development.yml | 58 ---- docker-compose.yml | 21 ++ environment/docker-run-development.sh | 14 - environment/docker-run-production.sh | 5 - package.json | 2 +- 15 files changed, 371 insertions(+), 585 deletions(-) delete mode 100644 .dockerignore rename sample.env => .env.example (59%) delete mode 100644 Dockerfile delete mode 100644 config/secrets.yml delete mode 100644 db/_sample-data.yml delete mode 100644 docker-compose.development.yml create mode 100644 docker-compose.yml delete mode 100644 environment/docker-run-development.sh delete mode 100644 environment/docker-run-production.sh diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 784408b0..00000000 --- a/.dockerignore +++ /dev/null @@ -1,32 +0,0 @@ -.git -.dockerignore -.env -.vscode -node_modules/ -bundle/ -tmp/ -.env* -environment/artifacts - -.bundle -.env -.env.* -.git -.gitattributes -.gitignore -.github -public/system -public/assets -public/packs -node_modules -neo4j -vendor/bundle -.DS_Store -*.swp -*~ -postgres -postgres14 -redis -elasticsearch -chart -docker-compose* \ No newline at end of file diff --git a/sample.env b/.env.example similarity index 59% rename from sample.env rename to .env.example index 96dd12d2..2bc37848 100644 --- a/sample.env +++ b/.env.example @@ -1,19 +1,5 @@ # Env vars -PROJECT_NAME=outpost_development -#IMPORT_SAMPLE_DATA=true - -# You would typically use rake secret to generate a secure token. It is -# critical that you keep this value private in production. -SECRET_TOKEN= - - -# ------------------ for docker - -POSTGRES_DB_USER=outpost_development -POSTGRES_DB_PASSWORD=outpost_development - - # ------------------ deprecated #INSTANCE= @@ -25,8 +11,8 @@ FEEDBACK_FORM_URL= # ------------------ database connections -DATABASE_URL=postgresql://outpost_development:outpost_development@postgres:5432/outpost?timeout=5000 -DB_URI=mongodb://mongo/outpost_api_development +DATABASE_URL= +DB_URI= # ------------------ emails diff --git a/.gitignore b/.gitignore index 5d22a410..fddabc3f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,4 @@ yarn-debug.log* .DS_Store yarn.lock -.vscode - -/environment/artifacts -.env* +.vscode \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index b755148a..00000000 --- a/Dockerfile +++ /dev/null @@ -1,78 +0,0 @@ -# using docker image layers to save waiting for things to rebuild all the time -# base_image > build_rails > build_frontend > development - -FROM ruby:3.0.5-alpine as base_image -RUN apk add --no-cache git \ - build-base \ - libpq-dev \ - tzdata \ - gcompat \ - python3 - -# gcompat is for nokogiri - alpine doesnt include glibc it needs https://nokogiri.org/tutorials/installing_nokogiri.html#linux-musl-error-loading-shared-library -# python2 for node-sass drama - -# install node v16 -# see here for reference https://github.com/timbru31/docker-ruby-node/blob/master/3.0/16/alpine/Dockerfile -RUN apk -U upgrade \ - && apk add --repository https://dl-cdn.alpinelinux.org/alpine/v3.16/main/ --no-cache \ - "nodejs<18" \ - && apk add --no-cache \ - npm \ - yarn - -# install various gems -FROM base_image as build_app -COPY ./Gemfile /tmp/Gemfile -COPY ./Gemfile.lock /tmp/Gemfile.lock -COPY ./package.json /tmp/package.json -COPY ./yarn.lock /tmp/yarn.lock - -RUN cd /tmp && \ - bundle install && \ - yarn install && \ - apk add --no-cache git - - - -WORKDIR /app - -FROM build_app as base_env -COPY --from=build_app /tmp . - - -# build and install all the things for the development env -FROM base_env as development -COPY ./environment/docker-run-development.sh /rdebug_ide/runner.sh -RUN gem install ruby-debug-ide && \ - chmod +x /rdebug_ide/runner.sh - -ENV RAILS_ENV="development" \ - NODE_ENV="development" \ - RAILS_SERVE_STATIC_FILES="false" -EXPOSE 3000 -# ENTRYPOINT ["tail", "-f", "/dev/null"] -CMD ["/rdebug_ide/runner.sh"] -# CMD bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -u puma -p 3000 -b '0.0.0.0'" -# ENTRYPOINT ["tail", "-f", "/dev/null"] - - -# build and install all the things for the production env -FROM base_env as production -COPY ./environment/docker-run-production.sh /runner/runner.sh -COPY . . -RUN chmod +x /runner/runner.sh -EXPOSE 3000 - -ENV RAILS_ENV="production" \ - NODE_ENV="production" \ - RAILS_SERVE_STATIC_FILES="true" - -# ENTRYPOINT ["/usr/bin/tini", "--"] -CMD ["/runner/runner.sh"] -# ENTRYPOINT ["/usr/bin/tini", "--"] -# CMD bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -u puma -p 3000 -b '0.0.0.0'" -# ENTRYPOINT ['./environment/docker-run-production.sh'] -# CMD ["rails", "s", "-p", "3000"] -# ENTRYPOINT ["tail", "-f", "/dev/null"] - diff --git a/Gemfile.lock b/Gemfile.lock index 300a4c51..9932b3f2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,81 +1,81 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.6.1) - actionpack (= 6.0.6.1) + actioncable (6.0.3.6) + actionpack (= 6.0.3.6) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.6.1) - actionpack (= 6.0.6.1) - activejob (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) + actionmailbox (6.0.3.6) + actionpack (= 6.0.3.6) + activejob (= 6.0.3.6) + activerecord (= 6.0.3.6) + activestorage (= 6.0.3.6) + activesupport (= 6.0.3.6) mail (>= 2.7.1) - actionmailer (6.0.6.1) - actionpack (= 6.0.6.1) - actionview (= 6.0.6.1) - activejob (= 6.0.6.1) + actionmailer (6.0.3.6) + actionpack (= 6.0.3.6) + actionview (= 6.0.3.6) + activejob (= 6.0.3.6) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.6.1) - actionview (= 6.0.6.1) - activesupport (= 6.0.6.1) + actionpack (6.0.3.6) + actionview (= 6.0.3.6) + activesupport (= 6.0.3.6) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.6.1) - actionpack (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) + actiontext (6.0.3.6) + actionpack (= 6.0.3.6) + activerecord (= 6.0.3.6) + activestorage (= 6.0.3.6) + activesupport (= 6.0.3.6) nokogiri (>= 1.8.5) - actionview (6.0.6.1) - activesupport (= 6.0.6.1) + actionview (6.0.3.6) + activesupport (= 6.0.3.6) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_model_serializers (0.10.13) - actionpack (>= 4.1, < 7.1) - activemodel (>= 4.1, < 7.1) + active_model_serializers (0.10.10) + actionpack (>= 4.1, < 6.1) + activemodel (>= 4.1, < 6.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (6.0.6.1) - activesupport (= 6.0.6.1) + activejob (6.0.3.6) + activesupport (= 6.0.3.6) globalid (>= 0.3.6) - activemodel (6.0.6.1) - activesupport (= 6.0.6.1) - activerecord (6.0.6.1) - activemodel (= 6.0.6.1) - activesupport (= 6.0.6.1) - activestorage (6.0.6.1) - actionpack (= 6.0.6.1) - activejob (= 6.0.6.1) - activerecord (= 6.0.6.1) - marcel (~> 1.0) - activesupport (6.0.6.1) + activemodel (6.0.3.6) + activesupport (= 6.0.3.6) + activerecord (6.0.3.6) + activemodel (= 6.0.3.6) + activesupport (= 6.0.3.6) + activestorage (6.0.3.6) + actionpack (= 6.0.3.6) + activejob (= 6.0.3.6) + activerecord (= 6.0.3.6) + marcel (~> 1.0.0) + activesupport (6.0.3.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - acts-as-taggable-on (9.0.1) - activerecord (>= 6.0, < 7.1) - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) - bcrypt (3.1.18) + acts-as-taggable-on (8.1.0) + activerecord (>= 5.0, < 6.2) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + bcrypt (3.1.16) bindex (0.8.1) - bootsnap (1.16.0) + bootsnap (1.11.1) msgpack (~> 1.2) - bson (4.15.0) + bson (4.9.2) builder (3.2.4) - bullet (7.0.7) + bullet (6.1.0) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - byebug (11.1.3) - capybara (3.38.0) + byebug (11.1.1) + capybara (3.36.0) addressable matrix mini_mime (>= 0.1.3) @@ -86,65 +86,64 @@ GEM xpath (~> 3.2) case_transform (0.2) activesupport + childprocess (4.1.0) closure_tree (7.4.0) activerecord (>= 4.2.10) with_advisory_lock (>= 4.0.0) - codecov (0.6.0) + codecov (0.5.2) simplecov (>= 0.15, < 0.22) - concurrent-ruby (1.2.2) + concurrent-ruby (1.1.9) crass (1.0.6) - database_cleaner (2.0.2) - database_cleaner-active_record (>= 2, < 3) - database_cleaner-active_record (2.1.0) - activerecord (>= 5.a) - database_cleaner-core (~> 2.0.0) - database_cleaner-core (2.0.1) - date (3.3.3) + database_cleaner (1.7.0) declarative (0.0.20) - devise (4.9.0) + devise (4.8.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-security (0.17.0) - devise (>= 4.3.0) + devise-security (0.14.3) + devise (>= 4.3.0, < 5.0) + rails (>= 4.2.0, < 7.0) devise_lastseenable (0.0.6) devise rails (>= 3.0.4) - diff-lcs (1.5.0) - diffy (3.4.2) + diff-lcs (1.4.4) + diffy (3.4.1) digest-crc (0.6.4) rake (>= 12.0.0, < 14.0.0) - discard (1.2.1) - activerecord (>= 4.2, < 8) + discard (1.2.0) + activerecord (>= 4.2, < 7) docile (1.4.0) - doorkeeper (5.6.5) + doorkeeper (5.4.0) railties (>= 5) - dotenv (2.8.1) - dotenv-rails (2.8.1) - dotenv (= 2.8.1) - railties (>= 3.2) - email_address (0.2.4) + dotenv (2.7.4) + dotenv-rails (2.7.4) + dotenv (= 2.7.4) + railties (>= 3.2, < 6.1) + email_address (0.1.16) + netaddr (>= 2.0.4, < 3) simpleidn - erubi (1.12.0) - factory_bot (6.2.1) - activesupport (>= 5.0.0) - factory_bot_rails (6.2.0) - factory_bot (~> 6.2.0) - railties (>= 5.0.0) - faker (3.1.1) - i18n (>= 1.8.11, < 2) - faraday (2.7.4) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) + erubi (1.10.0) + factory_bot (5.1.1) + activesupport (>= 4.2.0) + factory_bot_rails (5.1.1) + factory_bot (~> 5.1.0) + railties (>= 4.2.0) + faker (2.19.0) + i18n (>= 1.6, < 2) + faraday (1.3.0) + faraday-net_http (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords + faraday-net_http (1.0.1) ffi (1.15.5) - filterrific (5.2.5) - geocoder (1.8.1) - globalid (1.1.0) - activesupport (>= 5.0) - google-apis-core (0.11.0) + ffi (1.15.5-x64-mingw32) + filterrific (5.2.1) + geocoder (1.6.2) + globalid (0.4.2) + activesupport (>= 4.2.0) + google-apis-core (0.6.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -153,257 +152,260 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.19.0) - google-apis-core (>= 0.9.0, < 2.a) + google-apis-iamcredentials_v1 (0.12.0) + google-apis-core (>= 0.6, < 2.a) + google-apis-storage_v1 (0.15.0) + google-apis-core (>= 0.5, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) + google-cloud-errors (1.2.0) + google-cloud-storage (1.36.2) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) + google-apis-storage_v1 (~> 0.1) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.3.0) + googleauth (1.1.3) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - httparty (0.21.0) - mini_mime (>= 1.0.0) + httparty (0.18.0) + mime-types (~> 3.0) multi_xml (>= 0.5.2) httpclient (2.8.3) - i18n (1.12.0) + i18n (1.8.11) concurrent-ruby (~> 1.0) - jbuilder (2.11.5) - actionview (>= 5.0.0) + jbuilder (2.10.0) activesupport (>= 5.0.0) jsonapi-renderer (0.2.2) - jwt (2.7.0) - kaminari (1.2.2) + jwt (2.2.2) + kaminari (1.2.1) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.2) - kaminari-activerecord (= 1.2.2) - kaminari-core (= 1.2.2) - kaminari-actionview (1.2.2) + kaminari-actionview (= 1.2.1) + kaminari-activerecord (= 1.2.1) + kaminari-core (= 1.2.1) + kaminari-actionview (1.2.1) actionview - kaminari-core (= 1.2.2) - kaminari-activerecord (1.2.2) + kaminari-core (= 1.2.1) + kaminari-activerecord (1.2.1) activerecord - kaminari-core (= 1.2.2) - kaminari-core (1.2.2) - launchy (2.5.2) - addressable (~> 2.8) - listen (3.8.0) + kaminari-core (= 1.2.1) + kaminari-core (1.2.1) + launchy (2.5.0) + addressable (~> 2.7) + listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.19.1) + loofah (2.18.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) - mail (2.8.1) + mail (2.7.1) mini_mime (>= 0.1.1) - net-imap - net-pop - net-smtp - mail-notify (1.1.0) - actionmailer (>= 5.2.4.6) - actionpack (>= 5.2.7.1) - actionview (>= 5.2.7.1) - activesupport (>= 5.2.4.6) + mail-notify (1.0.4) + actionmailer (>= 5.2.4.3) + actionpack (>= 5.2.4.3) + actionview (>= 5.2.4.3) + activesupport (>= 5.2.4.3) notifications-ruby-client (~> 5.1) - rack (>= 2.1.4.1) - marcel (1.0.2) + rack (>= 2.1.4) + marcel (1.0.0) matrix (0.4.2) memoist (0.16.2) method_source (1.0.0) + mime-types (3.4.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2021.1115) mini_mime (1.1.2) - minitest (5.18.0) - mongo (2.18.2) - bson (>= 4.14.1, < 5.0.0) - msgpack (1.6.1) + mini_portile2 (2.8.0) + minitest (5.15.0) + mongo (2.12.1) + bson (>= 4.8.2, < 5.0.0) + msgpack (1.4.5) multi_json (1.15.0) multi_xml (0.6.0) - net-imap (0.3.4) - date - net-protocol - net-pop (0.1.2) - net-protocol - net-protocol (0.2.1) - timeout - net-smtp (0.3.3) - net-protocol + multipart-post (2.1.1) + netaddr (2.0.4) nio4r (2.5.8) - nokogiri (1.14.2-aarch64-linux) + nokogiri (1.13.9) + mini_portile2 (~> 2.8.0) racc (~> 1.4) - notifications-ruby-client (5.4.0) + nokogiri (1.13.9-x64-mingw32) + racc (~> 1.4) + notifications-ruby-client (5.3.0) jwt (>= 1.5, < 3) orm_adapter (0.5.0) os (1.1.4) - paper_trail (14.0.0) - activerecord (>= 6.0) - request_store (~> 1.4) - pg (1.4.6) - pg_search (2.3.6) + paper_trail (11.0.0) + activerecord (>= 5.2) + request_store (~> 1.1) + pg (1.2.2) + pg_search (2.3.2) activerecord (>= 5.2) activesupport (>= 5.2) - public_suffix (5.0.1) + public_suffix (4.0.6) puma (4.3.12) nio4r (~> 2.0) - racc (1.6.2) - rack (2.2.6.3) - rack-attack (6.6.1) + racc (1.6.0) + rack (2.2.4) + rack-attack (6.6.0) rack (>= 1.0, < 3) - rack-cors (2.0.0) + rack-cors (1.1.1) rack (>= 2.0.0) - rack-mini-profiler (3.0.0) + rack-mini-profiler (2.0.1) rack (>= 1.2.0) - rack-proxy (0.7.6) + rack-proxy (0.7.2) rack - rack-test (2.0.2) - rack (>= 1.3) - rails (6.0.6.1) - actioncable (= 6.0.6.1) - actionmailbox (= 6.0.6.1) - actionmailer (= 6.0.6.1) - actionpack (= 6.0.6.1) - actiontext (= 6.0.6.1) - actionview (= 6.0.6.1) - activejob (= 6.0.6.1) - activemodel (= 6.0.6.1) - activerecord (= 6.0.6.1) - activestorage (= 6.0.6.1) - activesupport (= 6.0.6.1) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (6.0.3.6) + actioncable (= 6.0.3.6) + actionmailbox (= 6.0.3.6) + actionmailer (= 6.0.3.6) + actionpack (= 6.0.3.6) + actiontext (= 6.0.3.6) + actionview (= 6.0.3.6) + activejob (= 6.0.3.6) + activemodel (= 6.0.3.6) + activerecord (= 6.0.3.6) + activestorage (= 6.0.3.6) + activesupport (= 6.0.3.6) bundler (>= 1.3.0) - railties (= 6.0.6.1) + railties (= 6.0.3.6) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.5.0) - loofah (~> 2.19, >= 2.19.1) - rails-settings-cached (2.8.3) - activerecord (>= 5.0.0) - railties (>= 5.0.0) + rails-html-sanitizer (1.4.3) + loofah (~> 2.3) + rails-settings-cached (2.8.2) + rails (>= 5.0.0) rails_email_validator (0.1.4) activemodel (>= 3.0.0) - railties (6.0.6.1) - actionpack (= 6.0.6.1) - activesupport (= 6.0.6.1) + railties (6.0.3.6) + actionpack (= 6.0.3.6) + activesupport (= 6.0.3.6) method_source rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rake (13.0.6) - rb-fsevent (0.11.2) + rb-fsevent (0.11.1) rb-inotify (0.10.1) ffi (~> 1.0) - regexp_parser (2.7.0) + regexp_parser (2.2.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - request_store (1.5.1) + request_store (1.5.0) rack (>= 1.4) - responders (3.1.0) - actionpack (>= 5.2) - railties (>= 5.2) + responders (3.0.1) + actionpack (>= 5.0) + railties (>= 5.0) retriable (3.1.2) rexml (3.2.5) - rspec-core (3.12.1) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.2) + rspec-core (3.9.2) + rspec-support (~> 3.9.3) + rspec-expectations (3.9.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-mocks (3.12.3) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-rails (5.1.2) - actionpack (>= 5.2) - activesupport (>= 5.2) - railties (>= 5.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) - rspec-support (3.12.0) - ruby2_keywords (0.0.5) + rspec-support (~> 3.9.0) + rspec-rails (4.0.1) + actionpack (>= 4.2) + activesupport (>= 4.2) + railties (>= 4.2) + rspec-core (~> 3.9) + rspec-expectations (~> 3.9) + rspec-mocks (~> 3.9) + rspec-support (~> 3.9) + rspec-support (3.9.3) + ruby2_keywords (0.0.4) rubyzip (2.3.2) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) ffi (~> 1.9) + sassc (2.4.0-x64-mingw32) + ffi (~> 1.9) sassc-rails (2.1.2) railties (>= 4.0.0) sassc (>= 2.0) sprockets (> 3.0) sprockets-rails tilt - selenium-webdriver (4.8.1) + selenium-webdriver (4.5.0) + childprocess (>= 0.5, < 5.0) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) semantic_range (3.0.0) - sentry-rails (5.8.0) + sentry-rails (4.3.3) railties (>= 5.0) - sentry-ruby (~> 5.8.0) - sentry-ruby (5.8.0) + sentry-ruby-core (~> 4.3.0) + sentry-ruby (4.3.1) concurrent-ruby (~> 1.0, >= 1.0.2) - shoulda-matchers (5.3.0) - activesupport (>= 5.2.0) - signet (0.17.0) + faraday (>= 1.0) + sentry-ruby-core (= 4.3.1) + sentry-ruby-core (4.3.1) + concurrent-ruby + faraday + shoulda-matchers (4.3.0) + activesupport (>= 4.2.0) + signet (0.16.1) addressable (~> 2.8) - faraday (>= 0.17.5, < 3.a) + faraday (>= 0.17.5, < 3.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-cobertura (2.1.0) - rexml - simplecov (~> 0.19) + simplecov-cobertura (1.4.2) + simplecov (~> 0.8) simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) - simpleidn (0.2.1) + simpleidn (0.1.1) unf (~> 0.1.4) - spring (2.1.1) + spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.2.0) + sprockets (4.0.2) concurrent-ruby (~> 1.0) - rack (>= 2.2.4, < 4) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) sprockets (>= 3.0.0) - thor (1.2.1) + thor (1.1.0) thread_safe (0.3.6) - tilt (2.1.0) - timeout (0.3.2) + tilt (2.0.10) trailblazer-option (0.1.2) turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - tzinfo (1.2.11) + tzinfo (1.2.10) thread_safe (~> 0.1) + tzinfo-data (1.2020.1) + tzinfo (>= 1.0.0) uber (0.1.0) - uk_postcode (2.1.8) + uk_postcode (2.1.5) unf (0.1.4) unf_ext - unf_ext (0.0.8.2) - uniform_notifier (1.16.0) + unf_ext (0.0.7.7) + uniform_notifier (1.13.0) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.0) + web-console (4.0.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) @@ -412,24 +414,25 @@ GEM nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (~> 4.0) - webpacker (5.4.4) + webpacker (5.4.3) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) - webrick (1.8.1) + webrick (1.7.0) websocket (1.2.9) - websocket-driver (0.7.5) + websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) with_advisory_lock (4.6.0) activerecord (>= 4.2) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.7) + zeitwerk (2.5.1) PLATFORMS - aarch64-linux-musl + ruby + x64-mingw32 DEPENDENCIES active_model_serializers @@ -489,7 +492,7 @@ DEPENDENCIES webpacker (~> 5.0) RUBY VERSION - ruby 3.0.5p211 + ruby 3.0.3p157 BUNDLED WITH - 2.2.33 + 2.3.9 diff --git a/config/database.yml b/config/database.yml index ab6be11d..12ffb328 100644 --- a/config/database.yml +++ b/config/database.yml @@ -2,20 +2,19 @@ default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - timeout: <%= ENV.fetch("RAILS_TIMEOUT") { 5000 } %> development: <<: *default - url: <%= ENV["DATABASE_URL"].gsub('?', '_development?') %> - + url: postgresql://localhost/outpost_development + username: outpost + password: password test: <<: *default - url: <%= ENV["DATABASE_URL"].gsub('?', '_test?') %> - -staging: - <<: *default - url: <%= ENV["DATABASE_URL"].gsub('?', '_staging?') %> - + url: postgresql://localhost/outpost_test + username: outpost + password: password production: <<: *default - url: <%= ENV["DATABASE_URL"].gsub('?', '_production?') %> + database: outpost_production + username: outpost + password: <%= ENV['OUTPOST_DATABASE_PASSWORD'] %> diff --git a/config/secrets.yml b/config/secrets.yml deleted file mode 100644 index 1f321746..00000000 --- a/config/secrets.yml +++ /dev/null @@ -1,11 +0,0 @@ -development: &default - secret_key_base: <%= ENV['SECRET_TOKEN'] %> - -test: - <<: *default - -staging: - <<: *default - -production: - <<: *default diff --git a/db/_sample-data.yml b/db/_sample-data.yml deleted file mode 100644 index b4df2c13..00000000 --- a/db/_sample-data.yml +++ /dev/null @@ -1,51 +0,0 @@ -locations: - - address_1: Buckingham Palace - city: London - postal_code: SW1A 1AA - latitude: 51.501009 - longitude: -0.141588 - - address_1: Broadcasting House, Peel Wing, Portland Pl - city: London - postal_code: W1A 1AA - latitude: 51.518561 - longitude: -0.143799 - - address_1: Town Hall Pinstone Street - city: Sheffield, GB - postal_code: S1 2HH - latitude: 53.380384 - longitude: -1.470006 - - address_1: Motorpoint Arena Cardiff, Mary Ann St - city: Cardiff - postal_code: CF10 2EQ - latitude: 51.478914 - longitude: -3.171759 - - address_1: 20 St Thomas Street - city: London - postal_code: SE1 9RG - latitude: 51.504642 - longitude: -0.08899 - - address_1: Edinburgh Waverley Station - city: Edinburgh - postal_code: EH8 8DL - latitude: 55.952623 - longitude: -3.18135 - - address_1: Brindleyplace, The Water's Edge - city: Birmingham, GB - postal_code: B1 2HL - latitude: 52.478182 - longitude: -1.912008 - - address_1: The Upper Mill, Kingston Road, Ewell - city: Surrey - postal_code: KT17 2AF - latitude: 51.352525 - longitude: -0.251579 - - address_1: Alexandra Palace, Wood Green - city: London, GB - postal_code: N22 7AY - latitude: 51.594481 - longitude: -0.130527 - - address_1: 55 Norfolk Street - city: Sheffield - postal_code: S1 1DA - latitude: 53.38108 - longitude: 1.466765 diff --git a/db/_seed.yml b/db/_seed.yml index 9b09f9c8..4ec90659 100644 --- a/db/_seed.yml +++ b/db/_seed.yml @@ -1,4 +1,56 @@ -accessibilities: +locations: + - address_1: Buckingham Palace + city: London + postal_code: SW1A 1AA + latitude: 51.501009 + longitude: -0.141588 + - address_1: Broadcasting House, Peel Wing, Portland Pl + city: London + postal_code: W1A 1AA + latitude: 51.518561 + longitude: -0.143799 + - address_1: Town Hall Pinstone Street + city: Sheffield, GB + postal_code: S1 2HH + latitude: 53.380384 + longitude: -1.470006 + - address_1: Motorpoint Arena Cardiff, Mary Ann St + city: Cardiff + postal_code: CF10 2EQ + latitude: 51.478914 + longitude: -3.171759 + - address_1: 20 St Thomas Street + city: London + postal_code: SE1 9RG + latitude: 51.504642 + longitude: -0.08899 + - address_1: Edinburgh Waverley Station + city: Edinburgh + postal_code: EH8 8DL + latitude: 55.952623 + longitude: -3.18135 + - address_1: Brindleyplace, The Water's Edge + city: Birmingham, GB + postal_code: B1 2HL + latitude: 52.478182 + longitude: -1.912008 + - address_1: The Upper Mill, Kingston Road, Ewell + city: Surrey + postal_code: KT17 2AF + latitude: 51.352525 + longitude: -0.251579 + - address_1: Alexandra Palace, Wood Green + city: London, GB + postal_code: N22 7AY + latitude: 51.594481 + longitude: -0.130527 + - address_1: 55 Norfolk Street + city: Sheffield + postal_code: S1 1DA + latitude: 53.38108 + longitude: 1.466765 + +accessibilities: - Accessible toilet facilities - Hearing loop - Car parking @@ -13,7 +65,8 @@ accessibilities: - Wheelchair accessible entrance - Partial wheelchair access -send_needs: + +send_needs: - Autism - Hearing impairment - Visual impairment @@ -27,4 +80,4 @@ suitabilities: - Visual and / or hearing impediment - Physical disabilities - Older people - - Dementia + - Dementia \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index cfd8dc33..0cfca2fe 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,12 +1,17 @@ yaml = Rails.root.join('db', '_seed.yml') data = YAML::load_file(yaml) -sample_yaml = Rails.root.join('db', '_sample-data.yml') -sample_data = YAML::load_file(sample_yaml) - - -import_sample_data = ENV["IMPORT_SAMPLE_DATA"] || false; - +# use our realistic sample UK data - fake data won't correctly geocode +data["locations"].each do |l| + Location.create!({ + address_1: l["address_1"], + city: l["city"], + postal_code: l["postal_code"], + latitude: l["latitude"], + longitude: l["longitude"], + skip_mongo_callbacks: true + }) +end data["accessibilities"].each do |n| Accessibility.create!({name: n}) @@ -20,78 +25,49 @@ Suitability.create!({name: n}) end -#make a single admin user -User.create!({ - first_name: "Example", - last_name: "Admin", - admin: true, - admin_users: true, - admin_ofsted: true, - email: ENV["INITIAL_ADMIN_EMAIL"] || "example@example.com", - password: ENV["INITIAL_ADMIN_PASSWORD"] || "FakePassword1!" -}) - - -if import_sample_data - - # use our realistic sample UK data - fake data won't correctly geocode - sample_data["locations"].each do |l| - Location.create!({ - address_1: l["address_1"], - city: l["city"], - postal_code: l["postal_code"], - latitude: l["latitude"], - longitude: l["longitude"], - skip_mongo_callbacks: true - }) - end +10.times do + taxon = Taxonomy.create!({ + name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize + }) +end - 10.times do - taxon = Taxonomy.create!({ - name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize +10.times do + org = Organisation.create!({ + name: Faker::Company.name, + skip_mongo_callbacks: true + }) + + rand(0...2).times do + user = User.create!({ + first_name: Faker::Name.first_name, + last_name: Faker::Name.last_name, + email: Faker::Internet.email(domain: "example.com"), + organisation: org, + password: "FakePassword1!" }) end - # subcategories - taxonomy_ids = Taxonomy.where.not(parent_id: nil).last(10).map(&:id) - taxonomy_ids.each do | t | - rand(0...10).times do - child_taxon = Taxonomy.create!({ - name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize, - parent_id: t - }) - end - end - - 10.times do - org = Organisation.create!({ + rand(0...5).times do + service = Service.create!({ name: Faker::Company.name, + organisation: org, + description: Faker::Lorem.paragraph, skip_mongo_callbacks: true }) - - rand(0...2).times do - user = User.create!({ - first_name: Faker::Name.first_name, - last_name: Faker::Name.last_name, - email: Faker::Internet.email(domain: "example.com"), - organisation: org, - password: "FakePassword1!" - }) - end - - rand(0...5).times do - service = Service.create!({ - name: Faker::Company.name, - organisation: org, - description: Faker::Lorem.paragraph, - skip_mongo_callbacks: true - }) - # byebug - service.locations << Location.take - service.taxonomies << Taxonomy.take - service.save! - end + # byebug + service.locations << Location.take + service.taxonomies << Taxonomy.take + service.save! end +end - -end \ No newline at end of file +# make a single admin user +User.create!({ + first_name: "Example", + last_name: "Admin", + admin: true, + admin_users: true, + admin_ofsted: true, + email: "example@example.com", + password: ENV["INITIAL_ADMIN_PASSWORD"] || "FakePassword1!" +}) \ No newline at end of file diff --git a/docker-compose.development.yml b/docker-compose.development.yml deleted file mode 100644 index a2358958..00000000 --- a/docker-compose.development.yml +++ /dev/null @@ -1,58 +0,0 @@ -version: "3.7" -services: - # Outpost app - - outpost: - image: "outpost:development" - container_name: outpost - init: true - depends_on: - - postgres - build: - target: development - ports: - - 3000:3000 - volumes: - - ./:/app:cached - environment: - PROJECT_NAME: ${PROJECT_NAME} - PUMA_WORKERS: 0 - RAILS_MAX_THREADS: 5 - networks: - - external_network - - internal_network - - # Databases - - postgres: - image: postgres:13.7-alpine - container_name: outpost-db-postgres - environment: - POSTGRES_USER: ${POSTGRES_DB_USER} - POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD} - ports: - - 5432:5432 - volumes: - - outpost-postgres-volume:/var/lib/postgresql/data - networks: - - internal_network - - mongo: - image: mongo:6 - container_name: outpost-db-mongo - ports: - - 27017:27017 - volumes: - - outpost-mongo-volume:/data/db - networks: - - internal_network - - external_network - -volumes: - outpost-postgres-volume: - outpost-mongo-volume: - -networks: - external_network: - internal_network: - internal: true diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..0507fb19 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3.1' + +services: + + db: + image: postgres + restart: always + environment: + POSTGRES_PASSWORD: password + POSTGRES_DB: outpost_development + POSTGRES_USER: outpost + ports: + - "5432:5432" + mongo: + image: mongo + restart: always + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: password + ports: + - "27017:27017" \ No newline at end of file diff --git a/environment/docker-run-development.sh b/environment/docker-run-development.sh deleted file mode 100644 index 016d5626..00000000 --- a/environment/docker-run-development.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/ash - -cd /app -rm -f /app/tmp/pids/server.pid - -#rails db:migrate RAILS_ENV=development -rails s -u puma -p 3000 -b=0.0.0.0 - -# TODO get debug version working -#bundle exec rdebug-ide --host 0.0.0.0 --dispatcher-port 33030 --port 13030 -- rails s -u puma -p 3000 -b=0.0.0.0 - - - -#cd /app && rm -f /app/tmp/pids/server.pid && rails s -u puma -p 3000 -b=0.0.0.0 \ No newline at end of file diff --git a/environment/docker-run-production.sh b/environment/docker-run-production.sh deleted file mode 100644 index 06458687..00000000 --- a/environment/docker-run-production.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/ash - -cd /app -rm -f /app/tmp/pids/server.pid -rails s -u puma -p 3000 -b=0.0.0.0 diff --git a/package.json b/package.json index 35aa0325..1b8b7544 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "@rails/actioncable": "^6.0.0", "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.0", - "@rails/webpacker": "5.4.4", + "@rails/webpacker": "5.4.3", "@yaireo/tagify": "^3.8.0", "choices.js": "^9.0.1", "conglomerate-element-dataset": "^1.4.1", From b701cf8e1d10c494cdba893b50b459867784bbab Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 27 Apr 2023 18:52:33 +0100 Subject: [PATCH 015/105] updating images --- README.md | 51 +++++++++++++++++++---------------------- docs/examples.jpg | Bin 652293 -> 0 bytes docs/intro-outpost.png | Bin 0 -> 207814 bytes 3 files changed, 23 insertions(+), 28 deletions(-) delete mode 100644 docs/examples.jpg create mode 100644 docs/intro-outpost.png diff --git a/README.md b/README.md index a69fa444..7ae34008 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

@@ -11,7 +11,7 @@ ---

- +

@@ -22,8 +22,6 @@ [![Run tests](https://github.com/wearefuturegov/outpost/workflows/Run%20tests/badge.svg)](https://github.com/wearefuturegov/outpost/actions) -**[Staging site here](https://outpost-staging.herokuapp.com/)** - A [standards-driven](https://opencommunity.org.uk/) API and comprehensive set of admin tools for managing records about local community services, groups and activities. Outpost works alongside a [seperate API component](https://github.com/wearefuturegov/outpost-api-service/). @@ -40,7 +38,6 @@ It uses Google APIs for geocoding and map features, and Sendgrid to send emails. ## 💻 Running it locally - For more information see [getting started](https://github.com/wearefuturegov/outpost/wiki/Getting-started) You need ruby and node.js installed, plus a PostgreSQL server running. @@ -119,29 +116,27 @@ You can provide config with a `.env` file. Run `cp .env.example .env` to create It needs the following extra environment variables to be set: -| Variable | Description | Example | Required? | -| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------- | -| `GOOGLE_API_KEY` | with the geocoding API enabled, to geocode postcodes | | Yes, for geocoding features | -| `GOOGLE_CLIENT_KEY` | with the javascript and static maps APIs enabled, to add map views to admin screens | | Yes, for map features | -| `OFSTED_API_KEY` and `OFSTED_FEED_API_ENDPOINT` | to access the feed of Ofsted items | | Only if running Ofsted rake tasks | -| `NOTIFY_API_KEY` | to send emails with [Notify](https://www.notifications.service.gov.uk) | | In production only | -| `NOTIFY_TEMPLATE_ID` | ID of a notify template, as described [here](https://github.com/dxw/mail-notify#with-a-view) | | In production only | -| `MAILER_HOST` | where the app lives on the web, to correctly form urls in emails | https://example.com | In production only | -| `FEEDBACK_FORM_URL` | a form where users can submit feedback about the website | https://example.com | In production only | -| `DATABASE_URL` | the main PostgreSQL database | postgres://user:password
@example.com:5432/database | Yes, if different from default, and in production | -| `DB_URI` | the MongoDB database for the public index | mongodb://user:password
@example.com/database | Yes, if using the API service | -| `INITIAL_ADMIN_PASSWORD` | an initial admin password to log in with for local development | | Locally only | -| `SHOW_ENV_BANNER` | show a bright warning banner on non-production environments | staging | Only to warn about non-production environments | -| `GCP_PROJECT` | Name of the google cloud project | * | No | -| `GCP_BUCKET` | Name of the google cloud bucket | * | No | -| `GCP_PROJECT_ID` | Name of the google cloud project id | * | No | -| `GCP_PRIVATE_KEY_ID` | Google cloud private key id | * | No | -| `GCP_PRIVATE_KEY` | Google cloud private key | * | No | -| `GCP_CLIENT_EMAIL` | Google cloud client email | * | No | -| `GCP_CLIENT_ID` | Google cloud client id | * | No | -| `GCP_CLIENT_X509_CERT_URL` |Google cloud x509 certificate | * | No | - - +| Variable | Description | Example | Required? | +| ----------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------- | +| `GOOGLE_API_KEY` | with the geocoding API enabled, to geocode postcodes | | Yes, for geocoding features | +| `GOOGLE_CLIENT_KEY` | with the javascript and static maps APIs enabled, to add map views to admin screens | | Yes, for map features | +| `OFSTED_API_KEY` and `OFSTED_FEED_API_ENDPOINT` | to access the feed of Ofsted items | | Only if running Ofsted rake tasks | +| `NOTIFY_API_KEY` | to send emails with [Notify](https://www.notifications.service.gov.uk) | | In production only | +| `NOTIFY_TEMPLATE_ID` | ID of a notify template, as described [here](https://github.com/dxw/mail-notify#with-a-view) | | In production only | +| `MAILER_HOST` | where the app lives on the web, to correctly form urls in emails | https://example.com | In production only | +| `FEEDBACK_FORM_URL` | a form where users can submit feedback about the website | https://example.com | In production only | +| `DATABASE_URL` | the main PostgreSQL database | postgres://user:password
@example.com:5432/database | Yes, if different from default, and in production | +| `DB_URI` | the MongoDB database for the public index | mongodb://user:password
@example.com/database | Yes, if using the API service | +| `INITIAL_ADMIN_PASSWORD` | an initial admin password to log in with for local development | | Locally only | +| `SHOW_ENV_BANNER` | show a bright warning banner on non-production environments | staging | Only to warn about non-production environments | +| `GCP_PROJECT` | Name of the google cloud project | \* | No | +| `GCP_BUCKET` | Name of the google cloud bucket | \* | No | +| `GCP_PROJECT_ID` | Name of the google cloud project id | \* | No | +| `GCP_PRIVATE_KEY_ID` | Google cloud private key id | \* | No | +| `GCP_PRIVATE_KEY` | Google cloud private key | \* | No | +| `GCP_CLIENT_EMAIL` | Google cloud client email | \* | No | +| `GCP_CLIENT_ID` | Google cloud client id | \* | No | +| `GCP_CLIENT_X509_CERT_URL` | Google cloud x509 certificate | \* | No | ## 💿 Data import diff --git a/docs/examples.jpg b/docs/examples.jpg deleted file mode 100644 index 72e57c34efc75e6722493ed615ec85d79b28720d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652293 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

1X12MYzAncZ4~u8)WEZMK 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

uyj5;1^iU^xB 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

!6*zCg9S~>uUC1-igw;XVLyhD_ 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

Status Register Start dateEnd dateEnd date
<%= format_if_date(r["StartDate"]) %> - <%= format_if_date(r["EndDate"]) %> - + <%= format_if_date(r["EndDate"]) %> +
+ + + + + + + + + + <% @send_needs.each do |sn| %> + + + + + + + <% end %> + +
IDNameLast updatedCreated
<%= sn.id %><%= sn.name %><%= time_ago_in_words(sn.updated_at).humanize %> ago<%= time_ago_in_words(sn.created_at).humanize %> ago
+ + <%= paginate @send_needs %> +<% else %> +

There are currently no send needs, click here to <%= link_to "add the default send needs", create_defaults_admin_send_needs_path, method: "post" %> or create your own send needs' above.

+<% end %> + + diff --git a/app/views/admin/send_needs/new.html.erb b/app/views/admin/send_needs/new.html.erb new file mode 100644 index 00000000..bcad8cf6 --- /dev/null +++ b/app/views/admin/send_needs/new.html.erb @@ -0,0 +1,18 @@ +<% content_for :header do %> + <%= render "shared/dynamic-back-link", text: "Back to send needs", path: admin_send_needs_path %> +
+

+ Add a new send need +

+
+<% end %> + +<%= form_for [:admin, @send_need], html: {class: "one-half"}, data: {warn_unsaved_changes: true} do |f| %> + <%= render "shared/errors", model: @send_need %> +
+ <%= render "fields", f: f %> +
+
+ <%= f.submit "Create", class: "button" %> +
+<% end %> \ No newline at end of file From 4438c9ad298fe8f86cd63592f24e94d8e2465bde Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 18 Mar 2024 17:15:42 +0000 Subject: [PATCH 068/105] add send_need, accessibilty and suitability settings pages --- .../admin/accessibilities_controller.rb | 35 ++++++++++++++++ .../admin/send_needs_controller.rb | 4 +- .../admin/suitabilities_controller.rb | 35 ++++++++++++++++ app/models/accessibility.rb | 20 +++++++++ app/models/suitability.rb | 17 +++++++- .../admin/accessibilities/_fields.html.erb | 4 ++ .../admin/accessibilities/index.html.erb | 42 +++++++++++++++++++ app/views/admin/accessibilities/new.html.erb | 18 ++++++++ app/views/admin/send_needs/index.html.erb | 9 ++-- app/views/admin/send_needs/new.html.erb | 4 +- .../admin/suitabilities/_fields.html.erb | 4 ++ app/views/admin/suitabilities/index.html.erb | 42 +++++++++++++++++++ app/views/admin/suitabilities/new.html.erb | 18 ++++++++ app/views/shared/_navigation.html.erb | 12 ++++++ config/routes.rb | 10 +++++ 15 files changed, 265 insertions(+), 9 deletions(-) create mode 100644 app/controllers/admin/accessibilities_controller.rb create mode 100644 app/controllers/admin/suitabilities_controller.rb create mode 100644 app/views/admin/accessibilities/_fields.html.erb create mode 100644 app/views/admin/accessibilities/index.html.erb create mode 100644 app/views/admin/accessibilities/new.html.erb create mode 100644 app/views/admin/suitabilities/_fields.html.erb create mode 100644 app/views/admin/suitabilities/index.html.erb create mode 100644 app/views/admin/suitabilities/new.html.erb diff --git a/app/controllers/admin/accessibilities_controller.rb b/app/controllers/admin/accessibilities_controller.rb new file mode 100644 index 00000000..2693f4ea --- /dev/null +++ b/app/controllers/admin/accessibilities_controller.rb @@ -0,0 +1,35 @@ +class Admin::AccessibilitiesController < Admin::BaseController + def index + @accessibilities = Accessibility.order(:name).page(params[:page]) + end + + def new + @accessibility = Accessibility.new + end + + def create + @accessibility = Accessibility.create(accessibility_params) + if @accessibility.save + redirect_to admin_accessibilities_path, notice: "Accessibility has been created." + else + render "new" + end + end + + def create_defaults + Accessibility.defaults.each do |default| + Accessibility.find_or_create_by(name: default) + end + redirect_to admin_accessibilities_path, notice: "Default options have been added." + end + + + private + + + def accessibility_params + params.require(:accessibility).permit( + :name + ) + end +end diff --git a/app/controllers/admin/send_needs_controller.rb b/app/controllers/admin/send_needs_controller.rb index b2d782ea..984342b8 100644 --- a/app/controllers/admin/send_needs_controller.rb +++ b/app/controllers/admin/send_needs_controller.rb @@ -10,7 +10,7 @@ def new def create @send_need = SendNeed.create(send_need_params) if @send_need.save - redirect_to admin_send_needs_path, notice: "Send need has been created." + redirect_to admin_send_needs_path, notice: "SEND need has been created." else render "new" end @@ -20,7 +20,7 @@ def create_defaults SendNeed.defaults.each do |default| SendNeed.find_or_create_by(name: default) end - redirect_to admin_send_needs_path, notice: "Default Send need's have been added." + redirect_to admin_send_needs_path, notice: "Default options have been added." end diff --git a/app/controllers/admin/suitabilities_controller.rb b/app/controllers/admin/suitabilities_controller.rb new file mode 100644 index 00000000..34119d7c --- /dev/null +++ b/app/controllers/admin/suitabilities_controller.rb @@ -0,0 +1,35 @@ +class Admin::SuitabilitiesController < Admin::BaseController + def index + @suitabilities = Suitability.order(:name).page(params[:page]) + end + + def new + @suitability = Suitability.new + end + + def create + @suitability = Suitability.create(suitability_params) + if @suitability.save + redirect_to admin_suitabilities_path, notice: "Suitability has been created." + else + render "new" + end + end + + def create_defaults + Suitability.defaults.each do |default| + Suitability.find_or_create_by(name: default) + end + redirect_to admin_suitabilities_path, notice: "Default options have been added." + end + + + private + + + def suitability_params + params.require(:suitability).permit( + :name + ) + end +end diff --git a/app/models/accessibility.rb b/app/models/accessibility.rb index db12b198..2a513d46 100644 --- a/app/models/accessibility.rb +++ b/app/models/accessibility.rb @@ -3,6 +3,8 @@ class Accessibility < ApplicationRecord validates :name, presence: true, uniqueness: true + paginates_per 20 + def display_name name.humanize end @@ -11,4 +13,22 @@ def slug name.parameterize end + def self.defaults + [ + "Accessible toilet facilities", + "Hearing loop", + "Car parking", + "Changing facilities", + "British sign language (bsl)", + "Disabled car parking space", + "Hoist", + "Baby changing facilities", + "Parking nearby", + "Bus stop nearby", + "Building has lift", + "Wheelchair accessible entrance", + "Partial wheelchair access" + ] + end + end diff --git a/app/models/suitability.rb b/app/models/suitability.rb index 5003ff29..ead35354 100644 --- a/app/models/suitability.rb +++ b/app/models/suitability.rb @@ -1,7 +1,9 @@ class Suitability < ApplicationRecord has_and_belongs_to_many :services - validates_presence_of :name, uniqueness: true + validates :name, presence: true, uniqueness: true + + paginates_per 20 def display_name name.humanize @@ -10,4 +12,17 @@ def display_name def slug name.parameterize end + + def self.defaults + [ + "Autism", + "Learning difficulties", + "Mental health/acquired brain injury", + "Visual and / or hearing impediment", + "Physical disabilities", + "Older people", + "Dementia" + ] + end + end diff --git a/app/views/admin/accessibilities/_fields.html.erb b/app/views/admin/accessibilities/_fields.html.erb new file mode 100644 index 00000000..2ac8bc2e --- /dev/null +++ b/app/views/admin/accessibilities/_fields.html.erb @@ -0,0 +1,4 @@ +
+ <%= f.label :name, class: "field__label" %> + <%= f.text_field :name, required: true, value: @accessibility.name, class: "field__input" %> +
diff --git a/app/views/admin/accessibilities/index.html.erb b/app/views/admin/accessibilities/index.html.erb new file mode 100644 index 00000000..26e1dcd5 --- /dev/null +++ b/app/views/admin/accessibilities/index.html.erb @@ -0,0 +1,42 @@ +<% content_for :title do %>Accessibilities | <% end %> + +<% content_for :header do %> + <%= link_to "Back to services", admin_services_path, class: "go-back" %> +

Accessibilities

+

Accessibilities are associated with locations and should detail the types of access arrangements that are available for those with disabilities. Examples might include things such as car parking, levels of wheelchair access, public transport availability.

+<% end %> + + +
+ <%= link_to "Add new option", new_admin_accessibility_path, class: "button button--small button--add actions__pull-right" %> +
+ +<% if @accessibilities.present? %> +
+ + + + + + + + + + + <% @accessibilities.each do |sn| %> + + + + + + + <% end %> + +
IDNameLast updatedCreated
<%= sn.id %><%= sn.name %><%= time_ago_in_words(sn.updated_at).humanize %> ago<%= time_ago_in_words(sn.created_at).humanize %> ago
+
+ <%= paginate @accessibilities %> +<% else %> +

There are currently no accessibility options, click here to <%= link_to "add the default accessibilities", create_defaults_admin_accessibilities_path, method: "post" %> or create your own above.

+<% end %> + + diff --git a/app/views/admin/accessibilities/new.html.erb b/app/views/admin/accessibilities/new.html.erb new file mode 100644 index 00000000..ba44deed --- /dev/null +++ b/app/views/admin/accessibilities/new.html.erb @@ -0,0 +1,18 @@ +<% content_for :header do %> + <%= render "shared/dynamic-back-link", text: "Back to accessibilities", path: admin_accessibilities_path %> +
+

+ Add new accessibility option +

+
+<% end %> + +<%= form_for [:admin, @accessibility], html: {class: "one-half"}, data: {warn_unsaved_changes: true} do |f| %> + <%= render "shared/errors", model: @accessibility %> +
+ <%= render "fields", f: f %> +
+
+ <%= f.submit "Create", class: "button" %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/send_needs/index.html.erb b/app/views/admin/send_needs/index.html.erb index 5cf1b206..659b976e 100644 --- a/app/views/admin/send_needs/index.html.erb +++ b/app/views/admin/send_needs/index.html.erb @@ -1,13 +1,14 @@ -<% content_for :title do %>Send Needs | <% end %> +<% content_for :title do %>SEND Needs | <% end %> <% content_for :header do %> <%= link_to "Back to services", admin_services_path, class: "go-back" %> -

Send Needs

+

SEND Needs

+

SEND needs are only applied to services that are marked part of the local offer. They differ from suitabilities, though suitabilities can also be applied to a service. Examples include Autism, Hearing or Visual impairment.

<% end %>
- <%= link_to "Add send need", new_admin_send_need_path, class: "button button--small button--add actions__pull-right" %> + <%= link_to "Add SEND need", new_admin_send_need_path, class: "button button--small button--add actions__pull-right" %>
<% if @send_needs.present? %> @@ -35,7 +36,7 @@ <%= paginate @send_needs %> <% else %> -

There are currently no send needs, click here to <%= link_to "add the default send needs", create_defaults_admin_send_needs_path, method: "post" %> or create your own send needs' above.

+

There are currently no SEND needs, click here to <%= link_to "add the default SEND needs", create_defaults_admin_send_needs_path, method: "post" %> or create your own above.

<% end %> diff --git a/app/views/admin/send_needs/new.html.erb b/app/views/admin/send_needs/new.html.erb index bcad8cf6..c765ff68 100644 --- a/app/views/admin/send_needs/new.html.erb +++ b/app/views/admin/send_needs/new.html.erb @@ -1,8 +1,8 @@ <% content_for :header do %> - <%= render "shared/dynamic-back-link", text: "Back to send needs", path: admin_send_needs_path %> + <%= render "shared/dynamic-back-link", text: "Back to SEND needs", path: admin_send_needs_path %>

- Add a new send need + Add new SEND need

<% end %> diff --git a/app/views/admin/suitabilities/_fields.html.erb b/app/views/admin/suitabilities/_fields.html.erb new file mode 100644 index 00000000..c6790081 --- /dev/null +++ b/app/views/admin/suitabilities/_fields.html.erb @@ -0,0 +1,4 @@ +
+ <%= f.label :name, class: "field__label" %> + <%= f.text_field :name, required: true, value: @suitability.name, class: "field__input" %> +
diff --git a/app/views/admin/suitabilities/index.html.erb b/app/views/admin/suitabilities/index.html.erb new file mode 100644 index 00000000..061df05c --- /dev/null +++ b/app/views/admin/suitabilities/index.html.erb @@ -0,0 +1,42 @@ +<% content_for :title do %>Suitabilities | <% end %> + +<% content_for :header do %> + <%= link_to "Back to services", admin_services_path, class: "go-back" %> +

Suitabilities

+

Suitabilities are used to describe the suitability of a service for a particular group of people, examples might include people with autism or sensory needs, older people or people with physical or mental disabilities.

+<% end %> + + +
+ <%= link_to "Add new option", new_admin_suitability_path, class: "button button--small button--add actions__pull-right" %> +
+ +<% if @suitabilities.present? %> +
+ + + + + + + + + + + <% @suitabilities.each do |sn| %> + + + + + + + <% end %> + +
IDNameLast updatedCreated
<%= sn.id %><%= sn.name %><%= time_ago_in_words(sn.updated_at).humanize %> ago<%= time_ago_in_words(sn.created_at).humanize %> ago
+
+ <%= paginate @suitabilities %> +<% else %> +

There are currently no suitability options, click here to <%= link_to "add the default suitabilities", create_defaults_admin_suitabilities_path, method: "post" %> or create your own above.

+<% end %> + + diff --git a/app/views/admin/suitabilities/new.html.erb b/app/views/admin/suitabilities/new.html.erb new file mode 100644 index 00000000..6792052f --- /dev/null +++ b/app/views/admin/suitabilities/new.html.erb @@ -0,0 +1,18 @@ +<% content_for :header do %> + <%= render "shared/dynamic-back-link", text: "Back to suitabilities", path: admin_suitabilities_path %> +
+

+ Add new suitability option +

+
+<% end %> + +<%= form_for [:admin, @suitability], html: {class: "one-half"}, data: {warn_unsaved_changes: true} do |f| %> + <%= render "shared/errors", model: @suitability %> +
+ <%= render "fields", f: f %> +
+
+ <%= f.submit "Create", class: "button" %> +
+<% end %> \ No newline at end of file diff --git a/app/views/shared/_navigation.html.erb b/app/views/shared/_navigation.html.erb index af4aaecd..d6b78b23 100644 --- a/app/views/shared/_navigation.html.erb +++ b/app/views/shared/_navigation.html.erb @@ -66,6 +66,7 @@ + <% if current_user.admin_users? %> + <% end %> <% if current_user.admin_ofsted? %> diff --git a/config/routes.rb b/config/routes.rb index 4483a2b5..e5c67621 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -57,6 +57,16 @@ post 'create_defaults', to: "send_needs#create_defaults" end end + resources :accessibilities, except: [:edit, :show, :destroy, :update] do + collection do + post 'create_defaults', to: "accessibilities#create_defaults" + end + end + resources :suitabilities, except: [:edit, :show, :destroy, :update] do + collection do + post 'create_defaults', to: "suitabilities#create_defaults" + end + end end # api From 32c65d83f8ef0b7cc990dc385487bf0833365d9b Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 18 Mar 2024 17:17:13 +0000 Subject: [PATCH 069/105] Update seeds to use model defaults --- db/_default-data.yml | 30 ------------------------------ db/seeds.rb | 8 +++----- 2 files changed, 3 insertions(+), 35 deletions(-) delete mode 100644 db/_default-data.yml diff --git a/db/_default-data.yml b/db/_default-data.yml deleted file mode 100644 index 9b09f9c8..00000000 --- a/db/_default-data.yml +++ /dev/null @@ -1,30 +0,0 @@ -accessibilities: - - Accessible toilet facilities - - Hearing loop - - Car parking - - Changing facilities - - British sign language (bsl) - - Disabled car parking space - - Hoist - - Baby changing facilities - - Parking nearby - - Bus stop nearby - - Building has lift - - Wheelchair accessible entrance - - Partial wheelchair access - -send_needs: - - Autism - - Hearing impairment - - Visual impairment - - Mobility - - Cognitive - -suitabilities: - - Autism - - Learning difficulties - - Mental health/acquired brain injury - - Visual and / or hearing impediment - - Physical disabilities - - Older people - - Dementia diff --git a/db/seeds.rb b/db/seeds.rb index 7a3b3e88..6cee4e8b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,8 +1,6 @@ dummy_data_yaml = Rails.root.join('db', '_dummy-data.yml') default_data_yaml = Rails.root.join('db', '_default-data.yml') dummy_data = YAML::load_file(dummy_data_yaml) -default_data = YAML::load_file(default_data_yaml) - # This file gives us everything we need for a fresh install of the application # Setting SEED_DUMMY_DATA will also generate fake users, services, locations etc @@ -33,15 +31,15 @@ if seed_default_data - default_data["accessibilities"].each do |n| + Accessibility.defaults.each do |n| Accessibility.find_or_create_by!({name: n}) end - default_data["send_needs"].each do |n| + SendNeed.defaults.each do |n| SendNeed.find_or_create_by!({name: n}) end - default_data["suitabilities"].each do |n| + Suitability.defaults.each do |n| Suitability.find_or_create_by!({name: n}) end From c01349b10b884f902cd9ee8817f653d332ae2ac0 Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 18 Mar 2024 17:22:53 +0000 Subject: [PATCH 070/105] Change default order for send_needs, accessibilities and suitabilities --- app/controllers/api/v1/accessibilities_controller.rb | 2 +- app/controllers/api/v1/send_needs_controller.rb | 2 +- app/controllers/api/v1/suitabilities_controller.rb | 2 +- app/views/admin/accessibilities/index.html.erb | 2 +- app/views/admin/locations/show.html.erb | 2 +- app/views/admin/send_needs/index.html.erb | 2 +- app/views/admin/services/editors/_local-offer-fields.html.erb | 2 +- app/views/admin/services/editors/_location-fields.html.erb | 2 +- app/views/admin/services/editors/_suitabilities.html.erb | 2 +- app/views/admin/suitabilities/index.html.erb | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/v1/accessibilities_controller.rb b/app/controllers/api/v1/accessibilities_controller.rb index 62e6d630..89a7b7b9 100644 --- a/app/controllers/api/v1/accessibilities_controller.rb +++ b/app/controllers/api/v1/accessibilities_controller.rb @@ -2,7 +2,7 @@ class API::V1::AccessibilitiesController < ApplicationController skip_before_action :authenticate_user! def index - render json: json_tree(Accessibility.all).to_json + render json: json_tree(Accessibility.all.order(:name)).to_json end private diff --git a/app/controllers/api/v1/send_needs_controller.rb b/app/controllers/api/v1/send_needs_controller.rb index 8fb864c3..e1c9d91f 100644 --- a/app/controllers/api/v1/send_needs_controller.rb +++ b/app/controllers/api/v1/send_needs_controller.rb @@ -2,7 +2,7 @@ class API::V1::SendNeedsController < ApplicationController skip_before_action :authenticate_user! def index - render json: json_tree(SendNeed.all).to_json + render json: json_tree(SendNeed.all.order(:name)).to_json end private diff --git a/app/controllers/api/v1/suitabilities_controller.rb b/app/controllers/api/v1/suitabilities_controller.rb index a7a7b8cb..bc1e6ca5 100644 --- a/app/controllers/api/v1/suitabilities_controller.rb +++ b/app/controllers/api/v1/suitabilities_controller.rb @@ -2,7 +2,7 @@ class API::V1::SuitabilitiesController < ApplicationController skip_before_action :authenticate_user! def index - render json: json_tree(Suitability.all).to_json + render json: json_tree(Suitability.all.order(:name)).to_json end private diff --git a/app/views/admin/accessibilities/index.html.erb b/app/views/admin/accessibilities/index.html.erb index 26e1dcd5..b8fa4351 100644 --- a/app/views/admin/accessibilities/index.html.erb +++ b/app/views/admin/accessibilities/index.html.erb @@ -25,7 +25,7 @@ <% @accessibilities.each do |sn| %> - <%= sn.id %> + <%= sn.id %> <%= sn.name %> <%= time_ago_in_words(sn.updated_at).humanize %> ago <%= time_ago_in_words(sn.created_at).humanize %> ago diff --git a/app/views/admin/locations/show.html.erb b/app/views/admin/locations/show.html.erb index df23dec3..435e19f6 100644 --- a/app/views/admin/locations/show.html.erb +++ b/app/views/admin/locations/show.html.erb @@ -17,7 +17,7 @@ <%= render "shared/collapsible", name: "Accessibility", id: "location-accessibility" do %>
- <%= f.collection_check_boxes( :accessibility_ids, Accessibility.all, :id, :display_name) do |c| %> + <%= f.collection_check_boxes( :accessibility_ids, Accessibility.all.order(:name), :id, :display_name) do |c| %>
<%= c.check_box class: "checkbox__input" %> <%= c.label class: "checkbox__label" %> diff --git a/app/views/admin/send_needs/index.html.erb b/app/views/admin/send_needs/index.html.erb index 659b976e..0ec07c2d 100644 --- a/app/views/admin/send_needs/index.html.erb +++ b/app/views/admin/send_needs/index.html.erb @@ -25,7 +25,7 @@ <% @send_needs.each do |sn| %> - <%= sn.id %> + <%= sn.id %> <%= sn.name %> <%= time_ago_in_words(sn.updated_at).humanize %> ago <%= time_ago_in_words(sn.created_at).humanize %> ago diff --git a/app/views/admin/services/editors/_local-offer-fields.html.erb b/app/views/admin/services/editors/_local-offer-fields.html.erb index 5e543f64..eb0030cf 100644 --- a/app/views/admin/services/editors/_local-offer-fields.html.erb +++ b/app/views/admin/services/editors/_local-offer-fields.html.erb @@ -2,7 +2,7 @@
Which SEND needs can you support? - <%= s.collection_check_boxes( :send_need_ids, SendNeed.all, :id, :display_name) do |c| %> + <%= s.collection_check_boxes( :send_need_ids, SendNeed.all.order(:name), :id, :display_name) do |c| %>
<%= c.check_box class: "checkbox__input" %> <%= c.label class: "checkbox__label" %> diff --git a/app/views/admin/services/editors/_location-fields.html.erb b/app/views/admin/services/editors/_location-fields.html.erb index 91c960af..dfcea95f 100644 --- a/app/views/admin/services/editors/_location-fields.html.erb +++ b/app/views/admin/services/editors/_location-fields.html.erb @@ -20,7 +20,7 @@
Accessibility - <%= l.collection_check_boxes( :accessibility_ids, Accessibility.all, :id, :display_name) do |c| %> + <%= l.collection_check_boxes( :accessibility_ids, Accessibility.all.order(:name), :id, :display_name) do |c| %>
<%= c.check_box class: "checkbox__input" %> <%= c.label class: "checkbox__label" %> diff --git a/app/views/admin/services/editors/_suitabilities.html.erb b/app/views/admin/services/editors/_suitabilities.html.erb index 15d09f39..940a2a9d 100644 --- a/app/views/admin/services/editors/_suitabilities.html.erb +++ b/app/views/admin/services/editors/_suitabilities.html.erb @@ -5,7 +5,7 @@

What needs does it meet?

- <%= s.collection_check_boxes( :suitability_ids, Suitability.all, :id, :display_name) do |c| %> + <%= s.collection_check_boxes( :suitability_ids, Suitability.all.order(:name), :id, :display_name) do |c| %>
<%= c.check_box class: "checkbox__input" %> <%= c.label class: "checkbox__label" %> diff --git a/app/views/admin/suitabilities/index.html.erb b/app/views/admin/suitabilities/index.html.erb index 061df05c..c9128651 100644 --- a/app/views/admin/suitabilities/index.html.erb +++ b/app/views/admin/suitabilities/index.html.erb @@ -25,7 +25,7 @@ <% @suitabilities.each do |sn| %> - <%= sn.id %> + <%= sn.id %> <%= sn.name %> <%= time_ago_in_words(sn.updated_at).humanize %> ago <%= time_ago_in_words(sn.created_at).humanize %> ago From 61bcf64ceebc7e8968fdac2aa24c943bc283d28c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:23:42 +0000 Subject: [PATCH 071/105] Bump @yaireo/tagify from 3.25.0 to 4.9.8 Bumps [@yaireo/tagify](https://github.com/yairEO/tagify) from 3.25.0 to 4.9.8. - [Release notes](https://github.com/yairEO/tagify/releases) - [Commits](https://github.com/yairEO/tagify/compare/v3.25.0...v4.9.8) --- updated-dependencies: - dependency-name: "@yaireo/tagify" dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5099f5a3..f70f3b6f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.0", "@rails/webpacker": "5.4.4", - "@yaireo/tagify": "^3.8.0", + "@yaireo/tagify": "^4.9.8", "choices.js": "^9.0.1", "conglomerate-element-dataset": "^1.4.1", "dotenv": "^8.2.0", diff --git a/yarn.lock b/yarn.lock index e4cf8678..e52abd43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1443,10 +1443,10 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yaireo/tagify@^3.8.0": - version "3.25.0" - resolved "https://registry.yarnpkg.com/@yaireo/tagify/-/tagify-3.25.0.tgz#4a0728cf68c713ae16c25d52393a910e2dfb5875" - integrity sha512-aBRkGDkWdv6ZnRUCcA0mBIK5f3YegnxlFO9vj9zN5zSAUO90m2v5TsOPYN60sk6RNU/y556oc8jAmeSY7FUvaQ== +"@yaireo/tagify@^4.9.8": + version "4.9.8" + resolved "https://registry.yarnpkg.com/@yaireo/tagify/-/tagify-4.9.8.tgz#67082ecca81fbbec4d75bb95581280f27af22fba" + integrity sha512-JqRTN4vb5tx06PJIRIOAlriO/B6u+a3jD/VBb5x6E1MOlC4wrMfaLHmNnrMpiZCHMXox7pVmrtNuyBe4YReJ4w== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" From 03c9ea322bd93d82303572cae24858b04d8bfae3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:24:41 +0000 Subject: [PATCH 072/105] Bump puma from 4.3.12 to 5.6.8 Bumps [puma](https://github.com/puma/puma) from 4.3.12 to 5.6.8. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v4.3.12...v5.6.8) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 92987815..14f6a813 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ ruby '~> 3.0.3' gem 'rails', '~> 6.0.3', '>= 6.0.3.6' gem 'pg', '>= 0.18', '< 2.0' -gem 'puma', '~> 4.3' +gem 'puma', '~> 5.6' gem 'sass-rails', '>= 6' gem 'webpacker', '~> 5.0' gem 'turbolinks', '~> 5' diff --git a/Gemfile.lock b/Gemfile.lock index 18ab7de9..64654c28 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -235,7 +235,7 @@ GEM multi_xml (0.6.0) multipart-post (2.1.1) netaddr (2.0.4) - nio4r (2.5.8) + nio4r (2.7.1) nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -253,7 +253,7 @@ GEM activerecord (>= 5.2) activesupport (>= 5.2) public_suffix (5.0.4) - puma (4.3.12) + puma (5.6.8) nio4r (~> 2.0) racc (1.7.3) rack (2.2.8) @@ -460,7 +460,7 @@ DEPENDENCIES paper_trail pg (>= 0.18, < 2.0) pg_search - puma (~> 4.3) + puma (~> 5.6) rack-attack rack-cors rack-mini-profiler From 8d4e524e6fcafb039ffe312f953fa486c4719fdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:42:29 +0000 Subject: [PATCH 073/105] Bump globalid from 0.4.2 to 1.1.0 Bumps [globalid](https://github.com/rails/globalid) from 0.4.2 to 1.1.0. - [Release notes](https://github.com/rails/globalid/releases) - [Commits](https://github.com/rails/globalid/compare/v0.4.2...v1.1.0) --- updated-dependencies: - dependency-name: globalid dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64654c28..9ace6f6b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -90,7 +90,7 @@ GEM closure_tree (7.4.0) activerecord (>= 4.2.10) with_advisory_lock (>= 4.0.0) - concurrent-ruby (1.1.9) + concurrent-ruby (1.2.3) crass (1.0.6) database_cleaner (2.0.2) database_cleaner-active_record (>= 2, < 3) @@ -143,8 +143,8 @@ GEM ffi (1.15.5) filterrific (5.2.1) geocoder (1.6.2) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (1.1.0) + activesupport (>= 5.0) google-apis-core (0.6.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) @@ -183,7 +183,7 @@ GEM mime-types (~> 3.0) multi_xml (>= 0.5.2) httpclient (2.8.3) - i18n (1.8.11) + i18n (1.14.4) concurrent-ruby (~> 1.0) jbuilder (2.10.0) activesupport (>= 5.0.0) @@ -227,7 +227,7 @@ GEM mime-types-data (3.2021.1115) mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.15.0) + minitest (5.22.3) mongo (2.12.1) bson (>= 4.8.2, < 5.0.0) msgpack (1.4.5) @@ -393,7 +393,7 @@ GEM turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - tzinfo (1.2.10) + tzinfo (1.2.11) thread_safe (~> 0.1) uber (0.1.0) uk_postcode (2.1.5) @@ -422,7 +422,7 @@ GEM activerecord (>= 4.2) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.5.1) + zeitwerk (2.6.13) PLATFORMS aarch64-linux-musl From 743d9b2b7b5b4c7871d31cc966c4d457f68bce77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:42:32 +0000 Subject: [PATCH 074/105] Bump rack from 2.2.8 to 2.2.9 Bumps [rack](https://github.com/rack/rack) from 2.2.8 to 2.2.9. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/v2.2.8...v2.2.9) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64654c28..69cda69d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -256,7 +256,7 @@ GEM puma (5.6.8) nio4r (~> 2.0) racc (1.7.3) - rack (2.2.8) + rack (2.2.9) rack-attack (6.6.0) rack (>= 1.0, < 3) rack-cors (1.1.1) From e5fcaa8f07669dbf0407c4e9fca0cfcbe108aac3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:42:36 +0000 Subject: [PATCH 075/105] Bump rails-html-sanitizer from 1.4.3 to 1.6.0 Bumps [rails-html-sanitizer](https://github.com/rails/rails-html-sanitizer) from 1.4.3 to 1.6.0. - [Release notes](https://github.com/rails/rails-html-sanitizer/releases) - [Changelog](https://github.com/rails/rails-html-sanitizer/blob/main/CHANGELOG.md) - [Commits](https://github.com/rails/rails-html-sanitizer/compare/v1.4.3...v1.6.0) --- updated-dependencies: - dependency-name: rails-html-sanitizer dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64654c28..a28fee4e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -206,9 +206,9 @@ GEM listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.18.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.7.1) mini_mime (>= 0.1.1) mail-notify (1.0.4) @@ -236,10 +236,10 @@ GEM multipart-post (2.1.1) netaddr (2.0.4) nio4r (2.7.1) - nokogiri (1.16.2) + nokogiri (1.16.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.2-aarch64-linux) + nokogiri (1.16.3-aarch64-linux) racc (~> 1.4) notifications-ruby-client (5.3.0) jwt (>= 1.5, < 3) @@ -285,8 +285,9 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.4.3) - loofah (~> 2.3) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) rails-settings-cached (2.8.2) rails (>= 5.0.0) rails_email_validator (0.1.4) From 35123bf743e697b2252ea23bfc7ef742ce817c52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:42:41 +0000 Subject: [PATCH 076/105] Bump follow-redirects from 1.15.5 to 1.15.6 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e52abd43..1689294a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3374,9 +3374,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" From ea58b653df7b1d6beecddf83c11a4f39301804c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:42:41 +0000 Subject: [PATCH 077/105] Bump loofah from 2.18.0 to 2.22.0 Bumps [loofah](https://github.com/flavorjones/loofah) from 2.18.0 to 2.22.0. - [Release notes](https://github.com/flavorjones/loofah/releases) - [Changelog](https://github.com/flavorjones/loofah/blob/main/CHANGELOG.md) - [Commits](https://github.com/flavorjones/loofah/compare/v2.18.0...v2.22.0) --- updated-dependencies: - dependency-name: loofah dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64654c28..e23dfe09 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -206,9 +206,9 @@ GEM listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.18.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.7.1) mini_mime (>= 0.1.1) mail-notify (1.0.4) @@ -236,10 +236,10 @@ GEM multipart-post (2.1.1) netaddr (2.0.4) nio4r (2.7.1) - nokogiri (1.16.2) + nokogiri (1.16.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.16.2-aarch64-linux) + nokogiri (1.16.3-aarch64-linux) racc (~> 1.4) notifications-ruby-client (5.3.0) jwt (>= 1.5, < 3) From b0da7b2715c9bbbf993dfff2e5859aac3b15714f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:44:29 +0000 Subject: [PATCH 078/105] Bump httparty from 0.18.0 to 0.21.0 Bumps [httparty](https://github.com/jnunemaker/httparty) from 0.18.0 to 0.21.0. - [Release notes](https://github.com/jnunemaker/httparty/releases) - [Changelog](https://github.com/jnunemaker/httparty/blob/master/Changelog.md) - [Commits](https://github.com/jnunemaker/httparty/compare/v0.18.0...v0.21.0) --- updated-dependencies: - dependency-name: httparty dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64654c28..38528648 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -179,8 +179,8 @@ GEM multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - httparty (0.18.0) - mime-types (~> 3.0) + httparty (0.21.0) + mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) httpclient (2.8.3) i18n (1.8.11) @@ -222,9 +222,6 @@ GEM matrix (0.4.2) memoist (0.16.2) method_source (1.0.0) - mime-types (3.4.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2021.1115) mini_mime (1.1.5) mini_portile2 (2.8.5) minitest (5.15.0) From c513060e1c6f7627109ad996237aea5e0073fcb8 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 28 Mar 2024 23:53:09 +0000 Subject: [PATCH 079/105] seed dummy data option in makefile --- Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 195e62a9..98c14ba6 100644 --- a/Makefile +++ b/Makefile @@ -229,11 +229,14 @@ dev-seed: ## seed the local database with send_needs etc dev-seed-admin: ## seed local database with send_needs etc and an admin user docker compose exec outpost bin/rails SEED_ADMIN_USER=true db:seed -dev-seed-data: ## seed local database with send_needs etc and dummy data +dev-seed-data: ## seed local database with dummy data docker compose exec outpost bin/rails SEED_DUMMY_DATA=true db:seed +dev-seed-default-data: ## seed local database with send_needs etc + docker compose exec outpost bin/rails SEED_DEFAULT_DATA=true db:seed + dev-seed-all: ## seed local database with admin user, dummy data and send_needs etc - docker compose exec outpost bin/rails SEED_ADMIN_USER=true SEED_DUMMY_DATA=true db:seed + docker compose exec outpost bin/rails SEED_ADMIN_USER=true SEED_DUMMY_DATA=true SEED_DEFAULT_DATA=true db:seed dev-ssh: ## access outpost from cli docker compose exec outpost bash From 22593727f1b078da995472cfcbbce01cba036713 Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 22 Apr 2024 12:50:01 +0100 Subject: [PATCH 080/105] TOP-197 Update local offer to say SEND Local offer --- app/views/admin/send_needs/index.html.erb | 2 +- .../services/editors/_local-offer.html.erb | 2 +- ...ducational_needs_and_disabilities.html.erb | 2 +- lib/tasks/data_import/services/README.md | 132 +++++++++--------- .../data_import/services/import_services.rake | 6 +- .../community_user_managing_services_spec.rb | 4 +- 6 files changed, 72 insertions(+), 76 deletions(-) diff --git a/app/views/admin/send_needs/index.html.erb b/app/views/admin/send_needs/index.html.erb index 0ec07c2d..f2017bb4 100644 --- a/app/views/admin/send_needs/index.html.erb +++ b/app/views/admin/send_needs/index.html.erb @@ -3,7 +3,7 @@ <% content_for :header do %> <%= link_to "Back to services", admin_services_path, class: "go-back" %>

SEND Needs

-

SEND needs are only applied to services that are marked part of the local offer. They differ from suitabilities, though suitabilities can also be applied to a service. Examples include Autism, Hearing or Visual impairment.

+

SEND needs are only applied to services that are marked part of the SEND local offer. They differ from suitabilities, though suitabilities can also be applied to a service. Examples include Autism, Hearing or Visual impairment.

<% end %> diff --git a/app/views/admin/services/editors/_local-offer.html.erb b/app/views/admin/services/editors/_local-offer.html.erb index 169c61c8..7c2b8a02 100644 --- a/app/views/admin/services/editors/_local-offer.html.erb +++ b/app/views/admin/services/editors/_local-offer.html.erb @@ -4,7 +4,7 @@
<%= local_offer_checkbox(s, "admin/services/editors/local-offer-fields") %> - <%= label_tag "local_offer", "This service is part of the local offer", class: "checkbox__label" %> + <%= label_tag "local_offer", "This service is part of the SEND local offer", class: "checkbox__label" %>
diff --git a/app/views/services/_edit_special_educational_needs_and_disabilities.html.erb b/app/views/services/_edit_special_educational_needs_and_disabilities.html.erb index f242d8d9..a617cf8e 100644 --- a/app/views/services/_edit_special_educational_needs_and_disabilities.html.erb +++ b/app/views/services/_edit_special_educational_needs_and_disabilities.html.erb @@ -3,7 +3,7 @@ <% content_for :header do %> <%= link_to "Go back", service_path(@service), class: "go-back" %>

Special educational needs and disabilities

-

Explain how you can support people with special educational needs and disabilities. Also known as the "local offer".

+

Explain how you can support people with special educational needs and disabilities. Also known as the "SEND local offer".

Select if your service, group or activity supports children and young people aged 0-25 with SEND

<% end %> diff --git a/lib/tasks/data_import/services/README.md b/lib/tasks/data_import/services/README.md index 7fba29b5..f852404e 100644 --- a/lib/tasks/data_import/services/README.md +++ b/lib/tasks/data_import/services/README.md @@ -14,82 +14,79 @@ There are two files included in this repository, [services--with-sample-data.csv](./services--with-sample-data.csv) and [services.csv](./services.csv). These files will allow you to run an initial import of your data to Outpost. -* Each row in the document must have a unique numeric ID `import_id`. If this ID is missing the import script will not run. -* `name` - If there are duplicate service names - the script will output an error -* `organisation` - If no organisation exists by this name we will create it -* `organisation` - If this field is blank then we will create an Unnamed organisation for this service -* `visible` - If `visible_from` and `visible_to` are set then this field will be set to `FALSE` +- Each row in the document must have a unique numeric ID `import_id`. If this ID is missing the import script will not run. +- `name` - If there are duplicate service names - the script will output an error +- `organisation` - If no organisation exists by this name we will create it +- `organisation` - If this field is blank then we will create an Unnamed organisation for this service +- `visible` - If `visible_from` and `visible_to` are set then this field will be set to `FALSE` - -**Multiple Rows** +**Multiple Rows** Some services can have multiple pieces of data assigned to them. `locations`, `cost`, `schedule`, `links` and `contacts` -In order to add multiple locations to a service you would create one entry for your service with the first location in that row. In order to add the second location you would create a new row, with the `import_id_reference` equal to the service row you created. You then fill in the columns with the additional data. - +In order to add multiple locations to a service you would create one entry for your service with the first location in that row. In order to add the second location you would create a new row, with the `import_id_reference` equal to the service row you created. You then fill in the columns with the additional data. ## 🏠 Data structure -| Field title | Data format | Description | multiple rows | -|---------------------------------------------------------------------------------------------------------------------------------|---|---|---| -| `import_id` | Int **unique** | A unique number to reference this service for additional data | -| `import_id_reference` | Int | This field must correspond to the `import_id` of the service you are targetting | | -| `name` | String **unique** | The name of the service, activity or event | | -| `description` | Text | A description of your service. Note that in some places this will be truncated. | | -| `organisation` | String | Name of the organisation, if no organisation exists by this name we will create it. This field can be left blank. | | -| `url` | String beginning with http or https | The url of this service | | -| `approved` | Boolean | TRUE or FALSE value to say whether this service has been approved. If this is set to false the service is shown as pending and requires an admin to verify the data. | | -| `visible_from` | Datetime YYYY-MM-DD (2022-05-17) | Indicates the date from which this service becomes visible. Used on certain frontend applications to hide services that are not relevant at the time | | -| `visible_to` | Datetime YYYY-MM-DD (2022-05-17) | | | -| `visible` | Boolean | If true this service can be hidden on the frontend. `visible_from` and `visible_to` override this | | -| `needs_referral` | Boolean | Does this service require a referral in order to access it | | -| `min_age` | Int | Can be left blank. Minimum age this service is suitable for. | | -| `max_age` | Int | Can be left blank. Maximum age this service is suitable for. | | -| `notes` | Text | Any internal notes about this service | | -| `service_taxonomies` | semi colon (;) delimited list | A list of values you wish to use as taxonomies, hierarchy is not applied here. | | -| `contact_name` | String | Name of the contact for this service | TRUE | -| `contact_title` | String | The role of the contact you are creating | TRUE | -| `contact_visible` | Boolean | Is this contact visible through the API | TRUE | -| `contact_email` | String (email) | Contact email address | TRUE | -| `contact_phone` | String (phone) | Contact phone number | TRUE | -| `location_name` | String | Name of location | TRUE | -| `location_latitude` | Float (15.1022 or -1.20202) | Latitude for location | TRUE | -| `location_longitude` | Float (15.1022 or -1.20202) | Longitude for location | TRUE | -| `location_address_1` | String | Address line 1 | TRUE | -| `location_city` | String | City | TRUE | -| `location_postcode` | String | Postcode | TRUE | -| `location_visible` | Boolean | Is this location sent through to the api | TRUE | -| `mask_exact_address` | Boolean | If this is someones home address or a sensitive location mask the address so only the general area is found | TRUE | -| `preferred_for_post` | Boolean | Use this address as the preferred postal location for this service | TRUE | -| `location_accessibilities` | semi colon (;) delimited list | Accessibilities provided by this location | TRUE | -| `free` | Boolean | Is this service free to use | | -| `cost_option` | String | Who or what this price is for | TRUE | -| `cost_amount` | Number 1.0 = £1.0 | TRUE | | -| `cost_type` | Pre defined list | `per day`, `per half day`, `per hour,` `per hour - after school`, `per hour - before school`, `per hour - before or after school`, `per hour - full time`, `per hour - part time`, `per hour - weekend`, `per meal`, `per month`, `per session`, `per term`, `per week`, `lower rate for second sibling` | TRUE | -| `temporarily_closed` | Boolean | Is this service temporarily closed? | | -| `schedules_opens_at` | time hh:mm:ss (24hr) | On the day selected in `scheduled_weekday` what time does this service open? | TRUE | -| `schedules_closes_at` | time hh:mm:ss (24hr) | On the day selected in `scheduled_weekday` what time does this service close? | TRUE | -| `scheduled_weekday` | predefined string | `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | TRUE | -| `links_label` | String | Title for the link you are adding | TRUE | -| `links_url` | String (url) | | TRUE | -| `labels` | semi colon (;) delimited list | List of labels, you can create new ones or use existing ones in your installation | | -| `suitabilities` | semi colon (;) delimited list | List of suitabilities for this location | | -| `is_local_offer` | Boolean | Is this service part of the local offer | | -| `send_needs_support` | semi colon (;) delimited list | Which SEND needs can you support? | | -| `support_description` | Text | Description of support provided | | -| `recent_send_report` | Text (url) | Link to most recent SEND report | | -| `outcomes` | Text | What outcomes does your setting, service or activity aim to achieve for children and young people with SEND and their families? | | -| `recent_send_training` | Text | What recent SEND-specific training has been completed by your staff and/or volunteers? | | -| `parental_involvement` | Text | How do you involve parents and how can I get involved? | | -| `information_sharing` | Text | How will you share information with me about my child’s progress? What is additional for children with SEND? | | -| `environment_accessibility` | Text | How accessible is the environment (indoors and outdoors)? | | -| `how_to_start` | Text | How can children and young people with SEND and their families start to use your service or activity? | | -| `future_plans` | Text | What future plans do you have for developing your SEND provision? | | -| `custom__` | depends | Format for custom fields. The custom fields need to be imported beforehand using the custom fields import task. If there is a free-text type custom field called 'Community review', the column name would be `custom_text_community_review` for example. | | +| Field title | Data format | Description | multiple rows | +| ----------------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `import_id` | Int **unique** | A unique number to reference this service for additional data | +| `import_id_reference` | Int | This field must correspond to the `import_id` of the service you are targetting | | +| `name` | String **unique** | The name of the service, activity or event | | +| `description` | Text | A description of your service. Note that in some places this will be truncated. | | +| `organisation` | String | Name of the organisation, if no organisation exists by this name we will create it. This field can be left blank. | | +| `url` | String beginning with http or https | The url of this service | | +| `approved` | Boolean | TRUE or FALSE value to say whether this service has been approved. If this is set to false the service is shown as pending and requires an admin to verify the data. | | +| `visible_from` | Datetime YYYY-MM-DD (2022-05-17) | Indicates the date from which this service becomes visible. Used on certain frontend applications to hide services that are not relevant at the time | | +| `visible_to` | Datetime YYYY-MM-DD (2022-05-17) | | | +| `visible` | Boolean | If true this service can be hidden on the frontend. `visible_from` and `visible_to` override this | | +| `needs_referral` | Boolean | Does this service require a referral in order to access it | | +| `min_age` | Int | Can be left blank. Minimum age this service is suitable for. | | +| `max_age` | Int | Can be left blank. Maximum age this service is suitable for. | | +| `notes` | Text | Any internal notes about this service | | +| `service_taxonomies` | semi colon (;) delimited list | A list of values you wish to use as taxonomies, hierarchy is not applied here. | | +| `contact_name` | String | Name of the contact for this service | TRUE | +| `contact_title` | String | The role of the contact you are creating | TRUE | +| `contact_visible` | Boolean | Is this contact visible through the API | TRUE | +| `contact_email` | String (email) | Contact email address | TRUE | +| `contact_phone` | String (phone) | Contact phone number | TRUE | +| `location_name` | String | Name of location | TRUE | +| `location_latitude` | Float (15.1022 or -1.20202) | Latitude for location | TRUE | +| `location_longitude` | Float (15.1022 or -1.20202) | Longitude for location | TRUE | +| `location_address_1` | String | Address line 1 | TRUE | +| `location_city` | String | City | TRUE | +| `location_postcode` | String | Postcode | TRUE | +| `location_visible` | Boolean | Is this location sent through to the api | TRUE | +| `mask_exact_address` | Boolean | If this is someones home address or a sensitive location mask the address so only the general area is found | TRUE | +| `preferred_for_post` | Boolean | Use this address as the preferred postal location for this service | TRUE | +| `location_accessibilities` | semi colon (;) delimited list | Accessibilities provided by this location | TRUE | +| `free` | Boolean | Is this service free to use | | +| `cost_option` | String | Who or what this price is for | TRUE | +| `cost_amount` | Number 1.0 = £1.0 | TRUE | | +| `cost_type` | Pre defined list | `per day`, `per half day`, `per hour,` `per hour - after school`, `per hour - before school`, `per hour - before or after school`, `per hour - full time`, `per hour - part time`, `per hour - weekend`, `per meal`, `per month`, `per session`, `per term`, `per week`, `lower rate for second sibling` | TRUE | +| `temporarily_closed` | Boolean | Is this service temporarily closed? | | +| `schedules_opens_at` | time hh:mm:ss (24hr) | On the day selected in `scheduled_weekday` what time does this service open? | TRUE | +| `schedules_closes_at` | time hh:mm:ss (24hr) | On the day selected in `scheduled_weekday` what time does this service close? | TRUE | +| `scheduled_weekday` | predefined string | `monday`, `tuesday`, `wednesday`, `thursday`, `friday`, `saturday`, `sunday` | TRUE | +| `links_label` | String | Title for the link you are adding | TRUE | +| `links_url` | String (url) | | TRUE | +| `labels` | semi colon (;) delimited list | List of labels, you can create new ones or use existing ones in your installation | | +| `suitabilities` | semi colon (;) delimited list | List of suitabilities for this location | | +| `is_local_offer` | Boolean | Is this service part of the SEND local offer | | +| `send_needs_support` | semi colon (;) delimited list | Which SEND needs can you support? | | +| `support_description` | Text | Description of support provided | | +| `recent_send_report` | Text (url) | Link to most recent SEND report | | +| `outcomes` | Text | What outcomes does your setting, service or activity aim to achieve for children and young people with SEND and their families? | | +| `recent_send_training` | Text | What recent SEND-specific training has been completed by your staff and/or volunteers? | | +| `parental_involvement` | Text | How do you involve parents and how can I get involved? | | +| `information_sharing` | Text | How will you share information with me about my child’s progress? What is additional for children with SEND? | | +| `environment_accessibility` | Text | How accessible is the environment (indoors and outdoors)? | | +| `how_to_start` | Text | How can children and young people with SEND and their families start to use your service or activity? | | +| `future_plans` | Text | What future plans do you have for developing your SEND provision? | | +| `custom__` | depends | Format for custom fields. The custom fields need to be imported beforehand using the custom fields import task. If there is a free-text type custom field called 'Community review', the column name would be `custom_text_community_review` for example. | | ## Sample taxonomies In the list above we have described semi colon (;) delimited list as an input type. Here are some examples to get you started with some of those data points. - ### Suitabilities ``` @@ -136,11 +133,10 @@ Cognitive If you are using google sheets you can dynamically create lists to track data you have inputted into certain fields. This will help you track down any typos and refine your data further. -This is useful for Organisations, Taxonomies, Suitabilities, Accessibilities, Labels and SEND needs. +This is useful for Organisations, Taxonomies, Suitabilities, Accessibilities, Labels and SEND needs. This formula will take all data from the 2nd row to infinity and create a unique list based off all the semi colon (;) delimited lists you have entered. - ``` =ArrayFormula(unique(transpose(trim(split(TEXTJOIN(";",true,'Service Data'!O2:O),";"))))) ``` diff --git a/lib/tasks/data_import/services/import_services.rake b/lib/tasks/data_import/services/import_services.rake index 688e81fb..15a25068 100644 --- a/lib/tasks/data_import/services/import_services.rake +++ b/lib/tasks/data_import/services/import_services.rake @@ -214,7 +214,7 @@ namespace :import do end end - # create local offer + # create SEND local offer def new_service_local_offer(service_id, send_needs_data) survey_answer_mappings = [ @@ -247,9 +247,9 @@ namespace :import do end if new_local_offer - Rails.logger.info(" 🟢 Local offer: #{state}") + Rails.logger.info(" 🟢 SEND Local offer: #{state}") else - abort(" 🔴 Local offer: was not created. Exiting. #{new_local_offer.errors.messages}") + abort(" 🔴 SEND Local offer: was not created. Exiting. #{new_local_offer.errors.messages}") end end diff --git a/spec/features/community_user_managing_services_spec.rb b/spec/features/community_user_managing_services_spec.rb index 5c91ff1b..c0b14f9b 100644 --- a/spec/features/community_user_managing_services_spec.rb +++ b/spec/features/community_user_managing_services_spec.rb @@ -54,8 +54,8 @@ click_link_or_button('Continue') click_link_or_button('Special educational needs and disabilities') - check("This service is part of the local offer") - uncheck("This service is part of the local offer") + check("This service is part of the SEND local offer") + uncheck("This service is part of the SEND local offer") click_link_or_button('Continue') click_link_or_button('Suitable for') From 9f48754db419ce0a828cfeab6d1b209aaf5a007d Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 22 Apr 2024 14:20:28 +0100 Subject: [PATCH 081/105] Fix organisaiton name requirement bug --- app/models/organisation.rb | 4 ++-- app/views/organisations/_form.html.erb | 4 ++-- spec/models/organisation_spec.rb | 22 ++++++++++++++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/app/models/organisation.rb b/app/models/organisation.rb index f9158449..6ee5f2ab 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -2,8 +2,8 @@ class Organisation < ApplicationRecord has_many :services has_many :users - validates :name, presence: true, uniqueness: true - validates :name, length: { minimum: 2, maximum: 100 }, if: -> { name.present? } + # validates :name, presence: true, + validates :name, length: { minimum: 2, maximum: 100 }, uniqueness: true, if: -> { name.present? } attr_accessor :skip_mongo_callbacks after_commit :update_index, if: -> { skip_mongo_callbacks != true } diff --git a/app/views/organisations/_form.html.erb b/app/views/organisations/_form.html.erb index 384a04a3..a84753c8 100644 --- a/app/views/organisations/_form.html.erb +++ b/app/views/organisations/_form.html.erb @@ -3,9 +3,9 @@ <%= render "shared/errors", model: @organisation %>
-
+
<%= f.label :name, "Organisation name", class: "field__label" %> - <%= f.text_field :name, required: true, class: "field__input one-half" %> + <%= f.text_field :name, class: "field__input one-half" %>
diff --git a/spec/models/organisation_spec.rb b/spec/models/organisation_spec.rb index 4815d7f3..30c5563d 100644 --- a/spec/models/organisation_spec.rb +++ b/spec/models/organisation_spec.rb @@ -1,6 +1,24 @@ require 'rails_helper' RSpec.describe Organisation, type: :model do - it { should validate_presence_of :name } - it { should validate_uniqueness_of :name } + it { should allow_value(nil).for(:name) } + it { should allow_value('Some Name').for(:name) } + it { should validate_uniqueness_of(:name) } + it { should validate_length_of(:name).is_at_least(2).is_at_most(100).allow_nil } + + # This tests the behavior that multiple organisations can have a nil name. + it 'allows nil names' do + first = Organisation.create!(name: nil) + second = Organisation.new(name: nil) + + expect(second).to be_valid + end + + + it 'Does not allow duplicate names' do + first = Organisation.create!(name: "Organisation 1") + second = Organisation.new(name: "Organisation 1") + + expect(second).to be_invalid + end end From 23827584e9464b5cdd5b1e6d92c341af87846ad0 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 25 Apr 2024 14:04:21 +0100 Subject: [PATCH 082/105] Update to the mongo container setup to ensure roles are correct --- .docker/services/mongo/mongo.yml | 5 +++-- .docker/services/mongo/setup-mongodb.js | 4 ++-- docker-compose.yml | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.docker/services/mongo/mongo.yml b/.docker/services/mongo/mongo.yml index a746f1c0..f556e2da 100644 --- a/.docker/services/mongo/mongo.yml +++ b/.docker/services/mongo/mongo.yml @@ -2,15 +2,16 @@ version: "3.7" services: mongo: image: mongo:6 - container_name: mongo ports: - 27018:27017 volumes: - mongo-volume:/data/db - ./setup-mongodb.js:/docker-entrypoint-initdb.d/mongo-init.js:ro environment: - MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-outpost} + MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:-admin} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:-password} + MONGO_INITDB_USERNAME: ${MONGO_INITDB_USERNAME:-outpost} + MONGO_INITDB_PASSWORD: ${MONGO_INITDB_PASSWORD:-password} MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE:-outpost_api_development} networks: - internal_network diff --git a/.docker/services/mongo/setup-mongodb.js b/.docker/services/mongo/setup-mongodb.js index 2e588278..271d196d 100644 --- a/.docker/services/mongo/setup-mongodb.js +++ b/.docker/services/mongo/setup-mongodb.js @@ -3,8 +3,8 @@ db = db.getSiblingDB( ); db.createUser({ - user: process.env.MONGO_INITDB_ROOT_USERNAME || "outpost", - pwd: process.env.MONGO_INITDB_ROOT_PASSWORD || "password", + user: process.env.MONGO_INITDB_USERNAME || "outpost", + pwd: process.env.MONGO_INITDB_PASSWORD || "password", roles: [ { role: "readWrite", diff --git a/docker-compose.yml b/docker-compose.yml index fabf4dd1..9a5847d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,7 +30,7 @@ services: # RAILS_ENV: production OFSTED_FEED_API_ENDPOINT: ${OFSTED_FEED_API_ENDPOINT:-https://test-ofsted-feed.stub} # this is not a real url, we just need an env variable set for the stub to work in tests SHOW_ENV_BANNER: ${SHOW_ENV_BANNER:-outpost docker development} - DB_URI: ${DB_URI:-mongodb://mongo:27017/outpost_api_development} + DB_URI: mongodb://${MONGO_INITDB_USERNAME:-outpost}:${MONGO_INITDB_PASSWORD:-password}@mongo/${MONGO_INITDB_DATABASE:-outpost_api_development} DATABASE_URL: ${DATABASE_URL:-postgresql://outpost:password@postgres:5432/outpost?} networks: - external_network From da720ce9c3ce8c719c71d7e6daa4e7534e5f7995 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 25 Apr 2024 14:04:38 +0100 Subject: [PATCH 083/105] Update seeds to create nested taxonomies --- db/seeds.rb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 6cee4e8b..7a64e386 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -61,11 +61,27 @@ location.save end - 10.times do + + # create nested taxonomies - chance of subcategories being generated is different at each level + def create_taxonomy(level = 0, parent_id = nil) + return if level >= 4 + taxon = Taxonomy.create!({ - name: Faker::Lorem.words(number: rand(1...5)).join(' ').capitalize + name: Faker::Lorem.words(number: rand(2...5)).join(' ').capitalize, + parent_id: parent_id }) + + case level + when 0 + rand(2..10).times { create_taxonomy(level + 1, taxon.id) } if rand < 0.50 + when 1 + rand(3..15).times { create_taxonomy(level + 1, taxon.id) } if rand < 0.2 + when 2 + rand(1..3).times { create_taxonomy(level + 1, taxon.id) } if rand < 0.15 + end end + + 5.times { create_taxonomy } 10.times do org = Organisation.create!({ From b1d1ab8f7c6a0cb3ea28a768d8ac0ed88a2f38c9 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 25 Apr 2024 15:34:43 +0100 Subject: [PATCH 084/105] indent taxonomies in filters --- app/models/taxonomy.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/models/taxonomy.rb b/app/models/taxonomy.rb index 4df73913..b4c017c1 100644 --- a/app/models/taxonomy.rb +++ b/app/models/taxonomy.rb @@ -26,6 +26,15 @@ def update_index end def self.options_for_select - order("LOWER(name)").map { |e| [e.name, e.id] }.unshift(["All taxonomies", ""]) + # order("LOWER(name)").map { |e| [e.name, e.id] }.unshift(["All taxonomies", ""]) + Taxonomy.arranged_as_flat_array.map { |name, id| [name.html_safe, id] }.unshift(["All taxonomies", ""]) end + + def self.arranged_as_flat_array(taxonomies = nil, level = 0) + taxonomies ||= Taxonomy.hash_tree + + taxonomies.map do |taxonomy, sub_taxonomies| + [["#{" " * level}#{taxonomy.name}", taxonomy.id], *arranged_as_flat_array(sub_taxonomies, level + 1)] + end.flatten(1) + end end From a8782da703a6619d7401fc4d8ed03ed17161fe8b Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 1 May 2024 15:50:10 +0100 Subject: [PATCH 085/105] change targetDirectories to be directories --- app/controllers/api/v1/taxonomies_controller.rb | 8 +++++--- app/serializers/indexed_services_serializer.rb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/taxonomies_controller.rb b/app/controllers/api/v1/taxonomies_controller.rb index 68c39b08..ea7e72d5 100644 --- a/app/controllers/api/v1/taxonomies_controller.rb +++ b/app/controllers/api/v1/taxonomies_controller.rb @@ -1,10 +1,12 @@ class API::V1::TaxonomiesController < ApplicationController skip_before_action :authenticate_user! + # ?directory[]=bfis&directory[]=bod def index - directory = Directory.find_by(label: params[:directory]) - if params[:directory].present? && directory - render json: json_tree(Taxonomy.filter_by_directory(directory.name).hash_tree).to_json + directory_labels = params[:directory] + directories = Directory.where(label: directory_labels) + if directory_labels.present? && directories.present? + render json: json_tree(Taxonomy.filter_by_directory(directory_labels).hash_tree).to_json else render json: json_tree(Taxonomy.hash_tree).to_json end diff --git a/app/serializers/indexed_services_serializer.rb b/app/serializers/indexed_services_serializer.rb index 3f6a87e3..e81806c0 100644 --- a/app/serializers/indexed_services_serializer.rb +++ b/app/serializers/indexed_services_serializer.rb @@ -21,7 +21,7 @@ class IndexedServicesSerializer < ActiveModel::Serializer :created_at, :status - has_many :target_directories do + has_many :directories do object.directories.map do |directory| { name: directory.name, label: directory.label } end From c9499e267298001863b109b5b8e235bc7835fd9d Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 1 May 2024 16:18:15 +0100 Subject: [PATCH 086/105] update tests --- spec/requests/api/get_taxonomies_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/requests/api/get_taxonomies_spec.rb b/spec/requests/api/get_taxonomies_spec.rb index 62de5f2e..c3b4d046 100644 --- a/spec/requests/api/get_taxonomies_spec.rb +++ b/spec/requests/api/get_taxonomies_spec.rb @@ -35,13 +35,13 @@ end it 'can filter by directory' do - get "/api/v1/taxonomies?directory=#{directory_a.label}" + get "/api/v1/taxonomies?directory[]=#{directory_a.label}" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} expect(root_taxonomy_ids).to match_array([root_taxonomy.id]) - get "/api/v1/taxonomies?directory=#{directory_b.label}" + get "/api/v1/taxonomies?directory[]=#{directory_b.label}" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} @@ -51,7 +51,7 @@ context 'filtering by an empty directory' do let!(:directory_c) { FactoryBot.create(:directory, name: "Directory C", label: "c") } it 'returns no results' do - get "/api/v1/taxonomies?directory=#{directory_c.label}" + get "/api/v1/taxonomies?directory[]=#{directory_c.label}" response_body = JSON.parse(response.body) expect(response_body).to match_array([]) end @@ -59,7 +59,7 @@ context 'filtering by a directory that does not exist' do it 'returns all results' do - get "/api/v1/taxonomies?directory=not-a-real-directory" + get "/api/v1/taxonomies?directory[]=not-a-real-directory" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} From 524c2f5b488dbc1d47e67d00f1b2417380c338d9 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 1 May 2024 16:56:38 +0100 Subject: [PATCH 087/105] fix tests --- app/controllers/api/v1/taxonomies_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/taxonomies_controller.rb b/app/controllers/api/v1/taxonomies_controller.rb index ea7e72d5..462970ce 100644 --- a/app/controllers/api/v1/taxonomies_controller.rb +++ b/app/controllers/api/v1/taxonomies_controller.rb @@ -6,7 +6,7 @@ def index directory_labels = params[:directory] directories = Directory.where(label: directory_labels) if directory_labels.present? && directories.present? - render json: json_tree(Taxonomy.filter_by_directory(directory_labels).hash_tree).to_json + render json: json_tree(Taxonomy.filter_by_directory(directories.pluck('name')).hash_tree).to_json else render json: json_tree(Taxonomy.hash_tree).to_json end From 3b0f4927975bd4895821a252bd76ae36f588163a Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 1 May 2024 17:06:03 +0100 Subject: [PATCH 088/105] directories not directory --- app/controllers/api/v1/taxonomies_controller.rb | 4 ++-- spec/requests/api/get_taxonomies_spec.rb | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/taxonomies_controller.rb b/app/controllers/api/v1/taxonomies_controller.rb index 462970ce..d98ea26e 100644 --- a/app/controllers/api/v1/taxonomies_controller.rb +++ b/app/controllers/api/v1/taxonomies_controller.rb @@ -1,9 +1,9 @@ class API::V1::TaxonomiesController < ApplicationController skip_before_action :authenticate_user! - # ?directory[]=bfis&directory[]=bod + # ?directories[]=bfis&directories[]=bod def index - directory_labels = params[:directory] + directory_labels = params[:directories] directories = Directory.where(label: directory_labels) if directory_labels.present? && directories.present? render json: json_tree(Taxonomy.filter_by_directory(directories.pluck('name')).hash_tree).to_json diff --git a/spec/requests/api/get_taxonomies_spec.rb b/spec/requests/api/get_taxonomies_spec.rb index c3b4d046..72ec3272 100644 --- a/spec/requests/api/get_taxonomies_spec.rb +++ b/spec/requests/api/get_taxonomies_spec.rb @@ -35,13 +35,13 @@ end it 'can filter by directory' do - get "/api/v1/taxonomies?directory[]=#{directory_a.label}" + get "/api/v1/taxonomies?directories[]=#{directory_a.label}" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} expect(root_taxonomy_ids).to match_array([root_taxonomy.id]) - get "/api/v1/taxonomies?directory[]=#{directory_b.label}" + get "/api/v1/taxonomies?directories[]=#{directory_b.label}" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} @@ -51,7 +51,7 @@ context 'filtering by an empty directory' do let!(:directory_c) { FactoryBot.create(:directory, name: "Directory C", label: "c") } it 'returns no results' do - get "/api/v1/taxonomies?directory[]=#{directory_c.label}" + get "/api/v1/taxonomies?directories[]=#{directory_c.label}" response_body = JSON.parse(response.body) expect(response_body).to match_array([]) end @@ -59,7 +59,7 @@ context 'filtering by a directory that does not exist' do it 'returns all results' do - get "/api/v1/taxonomies?directory[]=not-a-real-directory" + get "/api/v1/taxonomies?directories[]=not-a-real-directory" response_body = JSON.parse(response.body) root_taxonomy_ids = response_body.map{|taxonomy| taxonomy["id"]} From 980ce1d3575c641e9e5e44d70f54d75abcb65a7f Mon Sep 17 00:00:00 2001 From: Han Date: Fri, 10 May 2024 15:03:40 +0100 Subject: [PATCH 089/105] Don't show 'extra questions' to providers if there aren't any also only show count on sections page --- .../admin/custom_field_sections_controller.rb | 2 +- app/controllers/services_controller.rb | 3 ++- app/helpers/task_list_helper.rb | 2 +- app/models/custom_field.rb | 2 +- app/views/admin/custom_field_sections/index.html.erb | 4 ++-- app/views/services/show.html.erb | 5 +++++ ...add_custom_fields_count_to_custom_field_sections.rb | 5 +++++ ...9_reset_all_custom_field_sections_cache_counters.rb | 10 ++++++++++ db/schema.rb | 5 ++--- 9 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20240510133524_add_custom_fields_count_to_custom_field_sections.rb create mode 100644 db/migrate/20240510133929_reset_all_custom_field_sections_cache_counters.rb diff --git a/app/controllers/admin/custom_field_sections_controller.rb b/app/controllers/admin/custom_field_sections_controller.rb index 1d31bd85..3f1e577d 100644 --- a/app/controllers/admin/custom_field_sections_controller.rb +++ b/app/controllers/admin/custom_field_sections_controller.rb @@ -3,7 +3,7 @@ class Admin::CustomFieldSectionsController < Admin::BaseController before_action :set_section, only: [:show, :update, :destroy] def index - @sections = CustomFieldSection.includes(:custom_fields).all + @sections = CustomFieldSection.all end def new diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb index 7bb1f895..be096a6e 100644 --- a/app/controllers/services_controller.rb +++ b/app/controllers/services_controller.rb @@ -61,9 +61,10 @@ def destroy def set_service @service = current_user.organisation.services.find(params[:id] || params[:service_id]) - @custom_field_sections = CustomFieldSection.includes(:custom_fields).visible_to(current_user) + @custom_field_sections = CustomFieldSection.visible_to(current_user).where('custom_fields_count > 0') end + def service_params result_params = params.require(:service).permit( :name, diff --git a/app/helpers/task_list_helper.rb b/app/helpers/task_list_helper.rb index 03817509..bc3a0752 100644 --- a/app/helpers/task_list_helper.rb +++ b/app/helpers/task_list_helper.rb @@ -17,7 +17,7 @@ def task_list_sections [ "Special educational needs and disabilities", "Suitable for", - "Extra questions" + # "Extra questions" ] ] end diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb index 47ed8d39..6ada0bd0 100644 --- a/app/models/custom_field.rb +++ b/app/models/custom_field.rb @@ -1,7 +1,7 @@ class CustomField < ApplicationRecord validates :key, presence: true, uniqueness: true validates_presence_of :field_type - belongs_to :custom_field_section + belongs_to :custom_field_section, counter_cache: :custom_fields_count def self.types [ diff --git a/app/views/admin/custom_field_sections/index.html.erb b/app/views/admin/custom_field_sections/index.html.erb index 084e5837..59683faa 100644 --- a/app/views/admin/custom_field_sections/index.html.erb +++ b/app/views/admin/custom_field_sections/index.html.erb @@ -13,7 +13,7 @@ - + @@ -22,7 +22,7 @@ <% @sections.each do |s| %> - +
NameFieldsNumber of fields Visible to community users Exposed in API Sort order
<%= link_to s.name, admin_custom_field_section_path(s) %><%= s.custom_fields.map{ |f| f.key }.join(", ") %><%= s.custom_fields.size %> <% if s.public %> <%= image_tag "tick-black.svg", alt: "Yes" %> diff --git a/app/views/services/show.html.erb b/app/views/services/show.html.erb index 43309968..81ebcc6c 100644 --- a/app/views/services/show.html.erb +++ b/app/views/services/show.html.erb @@ -53,6 +53,11 @@ <%= render "task_list_item", s: s %> <% end %> + <% if @custom_field_sections.length > 0 %> +
  • + <%= render "task_list_item", s: "Extra questions" %> +
  • + <% end %> diff --git a/db/migrate/20240510133524_add_custom_fields_count_to_custom_field_sections.rb b/db/migrate/20240510133524_add_custom_fields_count_to_custom_field_sections.rb new file mode 100644 index 00000000..359e79fa --- /dev/null +++ b/db/migrate/20240510133524_add_custom_fields_count_to_custom_field_sections.rb @@ -0,0 +1,5 @@ +class AddCustomFieldsCountToCustomFieldSections < ActiveRecord::Migration[6.0] + def change + add_column :custom_field_sections, :custom_fields_count, :integer + end +end diff --git a/db/migrate/20240510133929_reset_all_custom_field_sections_cache_counters.rb b/db/migrate/20240510133929_reset_all_custom_field_sections_cache_counters.rb new file mode 100644 index 00000000..b53c7370 --- /dev/null +++ b/db/migrate/20240510133929_reset_all_custom_field_sections_cache_counters.rb @@ -0,0 +1,10 @@ +class ResetAllCustomFieldSectionsCacheCounters < ActiveRecord::Migration[6.0] + def up + CustomFieldSection.all.each do |section| + CustomFieldSection.reset_counters(section.id, :custom_fields) + end + end + def down + # no rollback needed + end +end diff --git a/db/schema.rb b/db/schema.rb index 0b6d6efc..611bcd09 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,10 +10,9 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_08_24_230543) do +ActiveRecord::Schema.define(version: 2024_05_10_133929) do # These are extensions that must be enabled in order to support this database - enable_extension "pg_stat_statements" enable_extension "pg_trgm" enable_extension "plpgsql" @@ -77,6 +76,7 @@ t.boolean "public" t.integer "sort_order" t.boolean "api_public" + t.integer "custom_fields_count" end create_table "custom_fields", force: :cascade do |t| @@ -285,7 +285,6 @@ t.string "postcode" t.string "ward" t.string "family_centre" - t.string "area" end create_table "send_needs", force: :cascade do |t| From df8c821df02f50f7206df5bf561d3d467fc184b9 Mon Sep 17 00:00:00 2001 From: Han Date: Fri, 10 May 2024 15:47:08 +0100 Subject: [PATCH 090/105] Update tests and moved some logic back to task_list_sections --- app/helpers/task_list_helper.rb | 11 +- app/views/services/show.html.erb | 15 +-- .../community_user_managing_services_spec.rb | 107 +++++++++++------- 3 files changed, 76 insertions(+), 57 deletions(-) diff --git a/app/helpers/task_list_helper.rb b/app/helpers/task_list_helper.rb index bc3a0752..82a3ea48 100644 --- a/app/helpers/task_list_helper.rb +++ b/app/helpers/task_list_helper.rb @@ -1,7 +1,7 @@ module TaskListHelper - def task_list_sections - [ + def task_list_sections(custom_field_sections) + sections = [ [ "Name and description", "Website and social media", @@ -16,10 +16,13 @@ def task_list_sections ], [ "Special educational needs and disabilities", - "Suitable for", - # "Extra questions" + "Suitable for" ] ] + + sections.last << "Extra questions" if custom_field_sections.length > 0 + + sections end end \ No newline at end of file diff --git a/app/views/services/show.html.erb b/app/views/services/show.html.erb index 81ebcc6c..0e6664ab 100644 --- a/app/views/services/show.html.erb +++ b/app/views/services/show.html.erb @@ -13,9 +13,9 @@ <% if @currently_creating %>
    - <% if @completion_count < task_list_sections.flatten.count %> + <% if @completion_count < task_list_sections(@custom_field_sections).flatten.count %>

    Submission incomplete

    -

    You've completed <%= @completion_count %> of <%= task_list_sections.flatten.count %> sections.

    +

    You've completed <%= @completion_count %> of <%= task_list_sections(@custom_field_sections).flatten.count %> sections.

    <% else %>

    Ready to submit

    You can now finish and send this application.

    @@ -28,7 +28,7 @@
  • Basic information

      - <% task_list_sections[0].each do |s| %> + <% task_list_sections(@custom_field_sections)[0].each do |s| %>
    • <%= render "task_list_item", s: s %>
    • @@ -38,7 +38,7 @@
    • Help people find your service

        - <% task_list_sections[1].each do |s| %> + <% task_list_sections(@custom_field_sections)[1].each do |s| %>
      • <%= render "task_list_item", s: s %>
      • @@ -48,16 +48,11 @@
      • Extra information

          - <% task_list_sections[2].each do |s| %> + <% task_list_sections(@custom_field_sections)[2].each do |s| %>
        • <%= render "task_list_item", s: s %>
        • <% end %> - <% if @custom_field_sections.length > 0 %> -
        • - <%= render "task_list_item", s: "Extra questions" %> -
        • - <% end %>
      • diff --git a/spec/features/community_user_managing_services_spec.rb b/spec/features/community_user_managing_services_spec.rb index c0b14f9b..ab3bb6bf 100644 --- a/spec/features/community_user_managing_services_spec.rb +++ b/spec/features/community_user_managing_services_spec.rb @@ -4,6 +4,7 @@ let!(:suitabilities) { FactoryBot.create_list :suitability, 5 } let!(:taxonomies) { FactoryBot.create_list :taxonomy, 5 } + before do user = FactoryBot.create :user login_as user @@ -15,62 +16,82 @@ expect(page).to have_content("Your users") end - scenario 'I can add a service to the directory' do - click_link_or_button('Add Service, Event or Activity') + context 'With custom fields available to provider' do + let!(:custom_field_section) { FactoryBot.create :custom_field_section, public: true } + let!(:custom_field) { FactoryBot.create :custom_field, custom_field_section: custom_field_section } + + scenario 'I can add a service to the directory' do + click_link_or_button('Add Service, Event or Activity') + + fill_in('What is your service or activity called?', with: 'Example service') + fill_in('Describe your service', with: 'Example description here') + click_link_or_button('Continue') - fill_in('What is your service or activity called?', with: 'Example service') - fill_in('Describe your service', with: 'Example description here') - click_link_or_button('Continue') + expect(page).to have_content("List a new service") + expect(page).to have_content("Submission incomplete") + expect(page).to have_content("You've completed 1 of 11 sections.") + expect(page).to have_content("Extra questions") - expect(page).to have_content("List a new service") - expect(page).to have_content("Submission incomplete") + click_link_or_button('Website and social media') + fill_in('Website', with: 'http://example.com') + click_link_or_button('Continue') - click_link_or_button('Website and social media') - fill_in('Website', with: 'http://example.com') - click_link_or_button('Continue') + click_link_or_button('Visibility') + uncheck("Make this service publicly visible") + check("Make this service publicly visible") + fill_in('From', with: '01/01/2020') + fill_in('To', with: '01/01/2021') + click_link_or_button('Continue') - click_link_or_button('Visibility') - uncheck("Make this service publicly visible") - check("Make this service publicly visible") - fill_in('From', with: '01/01/2020') - fill_in('To', with: '01/01/2021') - click_link_or_button('Continue') + click_link_or_button('Opening times') + click_link_or_button('Continue') - click_link_or_button('Opening times') - click_link_or_button('Continue') + click_link_or_button('Fees') + click_link_or_button('Continue') - click_link_or_button('Fees') - click_link_or_button('Continue') + click_link_or_button('Locations') + click_link_or_button('Continue') - click_link_or_button('Locations') - click_link_or_button('Continue') + click_link_or_button('Contacts') + click_link_or_button('Continue') - click_link_or_button('Contacts') - click_link_or_button('Continue') + click_link_or_button('Ages') + fill_in('Minimum', with: '5') + fill_in('Maximum', with: '10') + click_link_or_button('Continue') - click_link_or_button('Ages') - fill_in('Minimum', with: '5') - fill_in('Maximum', with: '10') - click_link_or_button('Continue') + click_link_or_button('Special educational needs and disabilities') + check("This service is part of the SEND local offer") + uncheck("This service is part of the SEND local offer") + click_link_or_button('Continue') - click_link_or_button('Special educational needs and disabilities') - check("This service is part of the SEND local offer") - uncheck("This service is part of the SEND local offer") - click_link_or_button('Continue') + click_link_or_button('Suitable for') + check suitabilities.first.name + click_link_or_button('Continue') - click_link_or_button('Suitable for') - check suitabilities.first.name - click_link_or_button('Continue') + click_link_or_button('Extra questions') + click_link_or_button('Continue') - click_link_or_button('Extra questions') - click_link_or_button('Continue') + expect(page).to have_content("Ready to submit") + click_link_or_button('Finish and send') + expect(page).to have_content("Your service has been successfully submitted") + + click_link_or_button('Return to dashboard') + + expect(page).to have_content("Example service") + expect(page).to have_content("Pending") + end + end - expect(page).to have_content("Ready to submit") - click_link_or_button('Finish and send') - expect(page).to have_content("Your service has been successfully submitted") + context 'With no custom fields available to provider' do + scenario 'I see no option for extra questions' do + click_link_or_button('Add Service, Event or Activity') + fill_in('What is your service or activity called?', with: 'Example service') + fill_in('Describe your service', with: 'Example description here') + click_link_or_button('Continue') - click_link_or_button('Return to dashboard') - expect(page).to have_content("Example service") - expect(page).to have_content("Pending") + expect(page).to have_content("You've completed 1 of 10 sections.") + expect(page).to_not have_content("Extra questions") + end end end From ef4debd1749850381d80436f94f7d4b01dfadeba Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 22 May 2024 13:35:57 +0100 Subject: [PATCH 091/105] BSP-56 include postcode with service information --- app/controllers/api/v1/me_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/me_controller.rb b/app/controllers/api/v1/me_controller.rb index 42fc6f0a..25a46241 100644 --- a/app/controllers/api/v1/me_controller.rb +++ b/app/controllers/api/v1/me_controller.rb @@ -8,7 +8,7 @@ def show organisation: { only: [:id, :name], include: [ - services: {only: [:id, :name]} + services: {only: [:id, :name, :postcode]} ] } ]) From 4389984583f9177e01753932ae102cefb8643e07 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 13:34:50 +0100 Subject: [PATCH 092/105] postcode no longer needed --- app/controllers/api/v1/me_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/me_controller.rb b/app/controllers/api/v1/me_controller.rb index 25a46241..42fc6f0a 100644 --- a/app/controllers/api/v1/me_controller.rb +++ b/app/controllers/api/v1/me_controller.rb @@ -8,7 +8,7 @@ def show organisation: { only: [:id, :name], include: [ - services: {only: [:id, :name, :postcode]} + services: {only: [:id, :name]} ] } ]) From cdcd09a6aacc88bfbbbe9701c770fe6fbbd72bec Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 14:40:18 +0100 Subject: [PATCH 093/105] dont give postgres container a name by default --- .docker/services/postgres/postgres.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.docker/services/postgres/postgres.yml b/.docker/services/postgres/postgres.yml index 659af6d4..e79eb516 100644 --- a/.docker/services/postgres/postgres.yml +++ b/.docker/services/postgres/postgres.yml @@ -2,7 +2,6 @@ version: "3.7" services: postgres: image: postgres:13.7-alpine - container_name: postgres environment: POSTGRES_USER: ${POSTGRES_USER:-outpost} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} From e0a85937dd753663a5ccc00de7f2af597492a38a Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 15:55:39 +0100 Subject: [PATCH 094/105] Update taxonomy tree styling and add helper for listing taxonomies in order and nested --- .../outpost-design-library/_taxonomy-tree.scss | 15 +++++++-------- app/helpers/taxonomies_helper.rb | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/outpost-design-library/_taxonomy-tree.scss b/app/assets/stylesheets/outpost-design-library/_taxonomy-tree.scss index 11e5d0fb..e30742e5 100644 --- a/app/assets/stylesheets/outpost-design-library/_taxonomy-tree.scss +++ b/app/assets/stylesheets/outpost-design-library/_taxonomy-tree.scss @@ -1,10 +1,9 @@ - - -.taxonomy-tree{ - list-style: none; +.taxonomy-tree { + list-style: none; + margin: 20px 0px; } - -.panel > .taxonomy-tree{ - padding-left: 0px; -} \ No newline at end of file +.panel > .taxonomy-tree { + padding-left: 0px; + margin-left: 0px; +} diff --git a/app/helpers/taxonomies_helper.rb b/app/helpers/taxonomies_helper.rb index 988825a3..5389b48f 100644 --- a/app/helpers/taxonomies_helper.rb +++ b/app/helpers/taxonomies_helper.rb @@ -3,13 +3,13 @@ module TaxonomiesHelper def tree_view(taxonomies) content_tag(:ul, class: "taxonomy-tree") do taxonomies.map do |t, children| - + chld = children.present? ? tree_view(children) : "" if params[:directory].present? - "
      • #{link_to(t.name, admin_taxonomy_path(t))} (#{t.services.in_directory(params[:directory]).size})
      • " + tree_view(children) + "
      • #{link_to(t.name, admin_taxonomy_path(t))} (#{t.services.in_directory(params[:directory]).size})
      • " + chld else - "
      • #{link_to(t.name, admin_taxonomy_path(t))} (#{t.services.size})
      • " + tree_view(children) + "
      • #{link_to(t.name, admin_taxonomy_path(t))} (#{t.services.size})
      • " + chld end - end.join.html_safe + end.join.html_safe end end @@ -28,4 +28,14 @@ def sorted_by_selected(taxonomies, service) end end end + + + def options_for_taxonomies_dropdown(taxonomies = Taxonomy.hash_tree, options=[], disabled=['265']) + options ||= [] + taxonomies.each do |taxonomy, children| + options << ['- ' * taxonomy.depth + taxonomy.name, taxonomy.id] + options_for_taxonomies_dropdown(children, options) if children.present? + end + options + end end \ No newline at end of file From 00be7ab0df96d91528cc9bb8645e014a7d08afcb Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 15:56:01 +0100 Subject: [PATCH 095/105] Update service filters to use new taxonomies dropdown --- app/controllers/admin/services_controller.rb | 1 - app/views/admin/services/_filters.html.erb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb index 540ca0b4..b379271a 100644 --- a/app/controllers/admin/services_controller.rb +++ b/app/controllers/admin/services_controller.rb @@ -9,7 +9,6 @@ def index params[:filterrific], select_options: { sorted_by: Service.options_for_sorted_by, - in_taxonomy: Taxonomy.options_for_select, with_status: Service.options_for_status, tagged_with: Service.options_for_labels }, diff --git a/app/views/admin/services/_filters.html.erb b/app/views/admin/services/_filters.html.erb index ab3c0c2d..3eda301b 100644 --- a/app/views/admin/services/_filters.html.erb +++ b/app/views/admin/services/_filters.html.erb @@ -17,7 +17,7 @@ <%= f.select :with_status, @filterrific.select_options[:with_status], {}, { class: "filters__select", data: { autosubmit: true } } %> <%= f.label :in_taxonomy, "Taxonomy", class: "visually-hidden" %> - <%= f.select :in_taxonomy, @filterrific.select_options[:in_taxonomy], {}, { class: "filters__select", data: { autosubmit: true } } %> + <%= f.select :in_taxonomy, options_for_taxonomies_dropdown, {}, { class: "filters__select", data: { autosubmit: true } } %> <%= f.label :in_taxonomy, "Labels", class: "visually-hidden" %> <%= f.select :tagged_with, @filterrific.select_options[:tagged_with], {}, { class: "filters__select", data: { autosubmit: true } } %> From b8535798871315a64768294a92c86ad4b3799564 Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 15:56:19 +0100 Subject: [PATCH 096/105] Update taxonomies page to use new taxonomies dropdown --- app/controllers/admin/taxonomies_controller.rb | 6 ------ app/models/taxonomy.rb | 13 ------------- app/views/admin/taxonomies/_fields.html.erb | 2 +- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/app/controllers/admin/taxonomies_controller.rb b/app/controllers/admin/taxonomies_controller.rb index 6da3841e..61fb1868 100644 --- a/app/controllers/admin/taxonomies_controller.rb +++ b/app/controllers/admin/taxonomies_controller.rb @@ -3,7 +3,6 @@ class Admin::TaxonomiesController < Admin::BaseController before_action :count_taxonomies, only: [:index] before_action :set_taxonomies, only: [:index, :create] before_action :set_taxonomy, only: [:show, :update, :destroy] - before_action :set_possible_parents, only: [:show, :update, :index, :create] def index @taxonomy = Taxonomy.new @@ -52,11 +51,6 @@ def set_taxonomy @taxonomy = Taxonomy.find(params[:id]) end - def set_possible_parents - @possible_parents = Taxonomy.all - @possible_parents = @possible_parents.where.not(id: params[:id]) if params[:id] - end - def taxonomy_params params.require(:taxonomy).permit( :name, diff --git a/app/models/taxonomy.rb b/app/models/taxonomy.rb index b4c017c1..04f5cd92 100644 --- a/app/models/taxonomy.rb +++ b/app/models/taxonomy.rb @@ -24,17 +24,4 @@ def slug def update_index UpdateIndexTaxonomiesJob.perform_later(self) end - - def self.options_for_select - # order("LOWER(name)").map { |e| [e.name, e.id] }.unshift(["All taxonomies", ""]) - Taxonomy.arranged_as_flat_array.map { |name, id| [name.html_safe, id] }.unshift(["All taxonomies", ""]) - end - - def self.arranged_as_flat_array(taxonomies = nil, level = 0) - taxonomies ||= Taxonomy.hash_tree - - taxonomies.map do |taxonomy, sub_taxonomies| - [["#{" " * level}#{taxonomy.name}", taxonomy.id], *arranged_as_flat_array(sub_taxonomies, level + 1)] - end.flatten(1) - end end diff --git a/app/views/admin/taxonomies/_fields.html.erb b/app/views/admin/taxonomies/_fields.html.erb index 7859cc26..5c3c9718 100644 --- a/app/views/admin/taxonomies/_fields.html.erb +++ b/app/views/admin/taxonomies/_fields.html.erb @@ -5,7 +5,7 @@
        <%= s.label :parent_id, "Parent", class: "field__label" %> - <%= s.collection_select( :parent_id, @possible_parents, :id, :name, {include_blank: ""}, class: "field__input") %> + <%= s.select( :parent_id, options_for_select(options_for_taxonomies_dropdown, selected: s.object.parent_id, disabled: params[:id]), {include_blank: ""}, class: "field__input") %>
        From 46e3a70040f8c494fa5b7ace2e1c3b17f4e139df Mon Sep 17 00:00:00 2001 From: Han Date: Thu, 23 May 2024 16:44:59 +0100 Subject: [PATCH 097/105] adding in (and commenting out) team specific taxonomy filters --- app/helpers/taxonomies_helper.rb | 2 +- app/views/admin/services/_filters.html.erb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/helpers/taxonomies_helper.rb b/app/helpers/taxonomies_helper.rb index 5389b48f..d1da71fd 100644 --- a/app/helpers/taxonomies_helper.rb +++ b/app/helpers/taxonomies_helper.rb @@ -30,7 +30,7 @@ def sorted_by_selected(taxonomies, service) end - def options_for_taxonomies_dropdown(taxonomies = Taxonomy.hash_tree, options=[], disabled=['265']) + def options_for_taxonomies_dropdown(taxonomies = Taxonomy.hash_tree, options=[]) options ||= [] taxonomies.each do |taxonomy, children| options << ['- ' * taxonomy.depth + taxonomy.name, taxonomy.id] diff --git a/app/views/admin/services/_filters.html.erb b/app/views/admin/services/_filters.html.erb index 3eda301b..b428c233 100644 --- a/app/views/admin/services/_filters.html.erb +++ b/app/views/admin/services/_filters.html.erb @@ -16,6 +16,9 @@ <%= f.label :with_status, "Status", class: "visually-hidden" %> <%= f.select :with_status, @filterrific.select_options[:with_status], {}, { class: "filters__select", data: { autosubmit: true } } %> + <%#= f.label :in_taxonomy, "Taxonomy", class: "visually-hidden" %> + <%#= f.select :in_taxonomy, options_for_taxonomies_dropdown(params[:directory].present? ? Taxonomy.filter_by_directory(params[:directory]) : Taxonomy.hash_tree), {include_blank: 'All taxonomies'}, { class: "filters__select", data: { autosubmit: true } } %> + <%= f.label :in_taxonomy, "Taxonomy", class: "visually-hidden" %> <%= f.select :in_taxonomy, options_for_taxonomies_dropdown, {}, { class: "filters__select", data: { autosubmit: true } } %> @@ -23,6 +26,7 @@ <%= f.select :tagged_with, @filterrific.select_options[:tagged_with], {}, { class: "filters__select", data: { autosubmit: true } } %>
        +
        From 2bcb419bd6742787afce0bfeb81d4f81f5814928 Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 3 Jun 2024 16:26:29 +0100 Subject: [PATCH 098/105] Forgot the 'All taxonomies' in the dropdown --- app/views/admin/services/_filters.html.erb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/admin/services/_filters.html.erb b/app/views/admin/services/_filters.html.erb index b428c233..fdecaa01 100644 --- a/app/views/admin/services/_filters.html.erb +++ b/app/views/admin/services/_filters.html.erb @@ -8,8 +8,6 @@
        - - <%= f.label :sorted_by, "Sort", class: "visually-hidden" %> <%= f.select :sorted_by, @filterrific.select_options[:sorted_by], {}, { class: "filters__select", data: { autosubmit: true }, disabled: params.dig(:filterrific, :search).present? } %> @@ -20,7 +18,7 @@ <%#= f.select :in_taxonomy, options_for_taxonomies_dropdown(params[:directory].present? ? Taxonomy.filter_by_directory(params[:directory]) : Taxonomy.hash_tree), {include_blank: 'All taxonomies'}, { class: "filters__select", data: { autosubmit: true } } %> <%= f.label :in_taxonomy, "Taxonomy", class: "visually-hidden" %> - <%= f.select :in_taxonomy, options_for_taxonomies_dropdown, {}, { class: "filters__select", data: { autosubmit: true } } %> + <%= f.select :in_taxonomy, options_for_taxonomies_dropdown, {include_blank: 'All taxonomies'}, { class: "filters__select", data: { autosubmit: true } } %> <%= f.label :in_taxonomy, "Labels", class: "visually-hidden" %> <%= f.select :tagged_with, @filterrific.select_options[:tagged_with], {}, { class: "filters__select", data: { autosubmit: true } } %> From 5fd5c4a07f3a5215f6383d1c4b08381ac45ae842 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 16:55:26 +0100 Subject: [PATCH 099/105] Don't attempt to load images from google if not configured --- app/helpers/application_helper.rb | 14 ++++++++++++++ app/views/shared/_header.html.erb | 6 +----- config/environments/development.rb | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index fd5412c1..5e2c0f36 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -109,4 +109,18 @@ def mobile_agent? return true if params[:mobile] == "1" request.user_agent =~ /Mobile|webOS/ end + + def get_header_image + if Rails.configuration.active_storage.service == :public_google + logo = FileUpload.find_by(var: 'outpost_logo') + if logo.present? + logo_url = url_for(logo.file) + image_tag(logo_url, alt: Setting.outpost_title, class: "site-header__logo") + else + image_tag("logo-outpost.svg", alt: "Outpost", class: "site-header__logo") + end + else + image_tag("logo-outpost.svg", alt: "Outpost", class: "site-header__logo") + end + end end \ No newline at end of file diff --git a/app/views/shared/_header.html.erb b/app/views/shared/_header.html.erb index 6645a627..d602c228 100644 --- a/app/views/shared/_header.html.erb +++ b/app/views/shared/_header.html.erb @@ -3,11 +3,7 @@
        site-header__inner">
        diff --git a/config/environments/development.rb b/config/environments/development.rb index f06ebe8c..2a393530 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -39,7 +39,7 @@ end # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :public_google + config.active_storage.service = ENV['GCP_PROJECT_ID'].present? ? :public_google : :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false From 3f046f1f36dc63da4a6abe8df0ab9121aa8bf385 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 16:57:47 +0100 Subject: [PATCH 100/105] Housekeeping job - to make sure all services have their parent taxonomies --- lib/tasks/services/add_parent_taxonomies.rake | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lib/tasks/services/add_parent_taxonomies.rake diff --git a/lib/tasks/services/add_parent_taxonomies.rake b/lib/tasks/services/add_parent_taxonomies.rake new file mode 100644 index 00000000..524f5208 --- /dev/null +++ b/lib/tasks/services/add_parent_taxonomies.rake @@ -0,0 +1,10 @@ +# bin/bundle exec rake service:add_parent_taxonomies + +namespace :service do + desc 'Add parent taxonomies to each service' + task add_parent_taxonomies: :environment do + Service.find_each(batch_size: 1000) do |service| + service.add_parent_taxonomies + end + end +end \ No newline at end of file From 1203acdb7967e5e1557fe610548b50a03cd04cd0 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 17:03:22 +0100 Subject: [PATCH 101/105] Add new pages for settings and tools --- app/controllers/admin/settings_controller.rb | 4 + app/views/admin/settings/edit.html.erb | 84 ++++--------------- .../settings/editors/_application.html.erb | 17 ++++ .../admin/settings/editors/_features.html.erb | 10 +++ .../admin/settings/editors/_theming.html.erb | 30 +++++++ app/views/admin/settings/show.html.erb | 36 ++++++++ config/routes.rb | 6 +- 7 files changed, 116 insertions(+), 71 deletions(-) create mode 100644 app/views/admin/settings/editors/_application.html.erb create mode 100644 app/views/admin/settings/editors/_features.html.erb create mode 100644 app/views/admin/settings/editors/_theming.html.erb create mode 100644 app/views/admin/settings/show.html.erb diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 4555e730..e60306d6 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -1,6 +1,10 @@ class Admin::SettingsController < Admin::BaseController before_action :require_superadmin! + def show + # redirect_to edit_admin_settings_path() + end + def edit @admin_settings = Form::AdminSettings.new end diff --git a/app/views/admin/settings/edit.html.erb b/app/views/admin/settings/edit.html.erb index 7080034d..86ccdcf8 100644 --- a/app/views/admin/settings/edit.html.erb +++ b/app/views/admin/settings/edit.html.erb @@ -8,8 +8,9 @@ <% content_for :precontent do%> <% end %> @@ -24,82 +25,25 @@
        - +
        <%= form_for(@admin_settings, url: admin_settings_path, html: { method: :patch } ) do |f| %> - <%= render "shared/errors", model: @admin_settings %> - - <%= render "shared/collapsible", name: "Application settings", id: "settings-application " do %> -
        -
        - <%= f.label :outpost_title, class: "field__label" %> -

        The title of this install. Shown in the title and header for all users.

        - <%= f.text_field :outpost_title, value: Setting.outpost_title, class: "field__input" %> -
        -
        - <%= f.label :outpost_sub_title, class: "field__label" %> -

        The sub title for this install. Shown in the site hea <Outpost Title> | <Outpost sub title>

        - <%= f.text_field :outpost_sub_title, value: Setting.outpost_sub_title, class: "field__input" %> -
        -
        - <%= f.label :outpost_instance_name, class: "field__label" %> -

        The name of this instance, appears on emails, for example "You have been invited to join <our directory service>"

        - <%= f.text_field :outpost_instance_name, value: Setting.outpost_instance_name, class: "field__input" %> -
        -
        - <% end %> - - <%= render "shared/collapsible", name: "Application theming", id: "settings-theming " do %> -
        -
        - <%= f.label :primary_color, class: "field__label" %> -

        The primary colour used in this outpost install. Mostly used in the header. The default is #2c2d84

        -
        - <%= f.color_field :primary_color, value: Setting.primary_color, class: "field__color-input" %> -
        -

        <%= Setting.primary_color %>

        -
        -
        - <%= f.label :outpost_logo, class: "field__label" %> -

        The logo used for outpost

        - <%= f.file_field :outpost_logo, value: Setting.outpost_logo, class: "field__input" %> -
        - <% if FileUpload.find_by(var: 'outpost_logo') %> -

        - <%= image_tag(url_for(FileUpload.find_by(var: 'outpost_logo').file))%> -

        - <% end %> -
        - <%= f.label :outpost_logo_height, class: "field__label" %> -

        The height of the logo.

        - <%= f.text_field :outpost_logo_height, value: Setting.outpost_logo_height, class: "field__input" %> -
        -
        - <%= f.label :outpost_logo_height_mobile, class: "field__label" %> -

        The height of the logo when on mobile view.

        - <%= f.text_field :outpost_logo_height_mobile, value: Setting.outpost_logo_height_mobile, class: "field__input" %> -
        -
        - <% end %> + <%= render "shared/errors", model: @admin_settings %> + <%= render "shared/collapsible", name: "Application settings", id: "settings-application " do %> + <%= render "admin/settings/editors/application", f: f %> + <% end %> - <%= render "shared/collapsible", name: "Outpost features", id: "settings-features " do %> -
        -
        -
        - <%= f.check_box :feature_wysiwyg, class: "checkbox__input"%> - <%= f.label :feature_wysiwyg, class: "checkbox__label" do %> - Enable WYSIWYG editor functionality for service description fields. - <% end %> -
        -
        -
        - <% end %> + <%= render "shared/collapsible", name: "Application theming", id: "settings-theming " do %> + <%= render "admin/settings/editors/theming", f: f %> + <% end %> + <%= render "shared/collapsible", name: "Outpost features", id: "settings-features " do %> + <%= render "admin/settings/editors/features", f: f %> + <% end %> -
        <%= f.submit "Save", class: "button" %>
        diff --git a/app/views/admin/settings/editors/_application.html.erb b/app/views/admin/settings/editors/_application.html.erb new file mode 100644 index 00000000..8cea139c --- /dev/null +++ b/app/views/admin/settings/editors/_application.html.erb @@ -0,0 +1,17 @@ +
        +
        + <%= f.label :outpost_title, class: "field__label" %> +

        The title of this install. Shown in the title and header for all users.

        + <%= f.text_field :outpost_title, value: Setting.outpost_title, class: "field__input" %> +
        +
        + <%= f.label :outpost_sub_title, class: "field__label" %> +

        The sub title for this install. Shown in the site header <Outpost Title> | <Outpost sub title>

        + <%= f.text_field :outpost_sub_title, value: Setting.outpost_sub_title, class: "field__input" %> +
        +
        + <%= f.label :outpost_instance_name, class: "field__label" %> +

        The name of this instance, appears on emails, for example "You have been invited to join <our directory service>"

        + <%= f.text_field :outpost_instance_name, value: Setting.outpost_instance_name, class: "field__input" %> +
        +
        \ No newline at end of file diff --git a/app/views/admin/settings/editors/_features.html.erb b/app/views/admin/settings/editors/_features.html.erb new file mode 100644 index 00000000..0db650fa --- /dev/null +++ b/app/views/admin/settings/editors/_features.html.erb @@ -0,0 +1,10 @@ +
        +
        +
        + <%= f.check_box :feature_wysiwyg, class: "checkbox__input"%> + <%= f.label :feature_wysiwyg, class: "checkbox__label" do %> + Enable WYSIWYG editor functionality for service description fields. + <% end %> +
        +
        +
        \ No newline at end of file diff --git a/app/views/admin/settings/editors/_theming.html.erb b/app/views/admin/settings/editors/_theming.html.erb new file mode 100644 index 00000000..ce58c18d --- /dev/null +++ b/app/views/admin/settings/editors/_theming.html.erb @@ -0,0 +1,30 @@ +
        +
        + <%= f.label :primary_color, class: "field__label" %> +

        The primary colour used in this outpost install. Mostly used in the header. The default is #2c2d84

        +
        + <%= f.color_field :primary_color, value: Setting.primary_color, class: "field__color-input" %> +
        +

        <%= Setting.primary_color %>

        +
        +
        + <%= f.label :outpost_logo, class: "field__label" %> +

        The logo used for outpost

        + <%= f.file_field :outpost_logo, value: Setting.outpost_logo, class: "field__input" %> +
        + <% if FileUpload.find_by(var: 'outpost_logo') %> +

        + <%= image_tag(url_for(FileUpload.find_by(var: 'outpost_logo').file))%> +

        + <% end %> +
        + <%= f.label :outpost_logo_height, class: "field__label" %> +

        The height of the logo.

        + <%= f.text_field :outpost_logo_height, value: Setting.outpost_logo_height, class: "field__input" %> +
        +
        + <%= f.label :outpost_logo_height_mobile, class: "field__label" %> +

        The height of the logo when on mobile view.

        + <%= f.text_field :outpost_logo_height_mobile, value: Setting.outpost_logo_height_mobile, class: "field__input" %> +
        +
        \ No newline at end of file diff --git a/app/views/admin/settings/show.html.erb b/app/views/admin/settings/show.html.erb new file mode 100644 index 00000000..6ac98c6d --- /dev/null +++ b/app/views/admin/settings/show.html.erb @@ -0,0 +1,36 @@ +<% content_for :title do %>Settings | <% end %> + +<% content_for :header do %> +

        Settings

        +<% end %> + + +<% content_for :precontent do%> + +<% end %> + +
        + + +
        +

        The settings page allows to to configure your Outpost installation. It is currently only accessible by users with the superadmin role. This role can only be set by a server administrator.

        +

        <%= link_to "Edit settings", edit_admin_settings_path, class: "button button--small" %>

        + + + +

        Tools

        +

        The following are links to tools that are useful for managing your Outpost installation and its data.

        +

        <%= link_to "Bulk add taxonomies", admin_settings_tools_bulk_add_taxonomies_path %>
        This tool allows you to add an additional taxonomy to a selection of services

        + + +
        + + +
        diff --git a/config/routes.rb b/config/routes.rb index e5c67621..c8bbf451 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,7 +51,11 @@ post :reset, on: :member put :reactivate, on: :member end - resource :settings, only: [:edit, :update] + resource :settings, only: [:show, :edit, :update] do + namespace :tools do + resource :bulk_add_taxonomies, only: [:show, :update] + end + end resources :send_needs, except: [:edit, :show, :destroy, :update] do collection do post 'create_defaults', to: "send_needs#create_defaults" From 11c73a19f66c95008eea110afadd21affb426d30 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 17:03:57 +0100 Subject: [PATCH 102/105] less service editor centric taxonomies form --- app/views/shared/editors/_taxonomies.html.erb | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 app/views/shared/editors/_taxonomies.html.erb diff --git a/app/views/shared/editors/_taxonomies.html.erb b/app/views/shared/editors/_taxonomies.html.erb new file mode 100644 index 00000000..6ba6249a --- /dev/null +++ b/app/views/shared/editors/_taxonomies.html.erb @@ -0,0 +1,38 @@ +
        +
          + <% Taxonomy.roots.each do |t| %> +
        • + <%= t.name %> +
        • + <% end %> +
        + <% tree = Taxonomy.hash_tree %> + <%= s.collection_check_boxes( :taxonomy_ids, tree.keys, :id, :name) do |c| %> +
        +
        + +
        + <%= c.check_box class: "checkbox__input" %> + <%= c.label class: "checkbox__label" %> +
        + + <% branch = tree[c.object] %> + <%= s.collection_check_boxes( :taxonomy_ids, branch.keys, :id, :name) do |d| %> +
        + <%= d.check_box class: "checkbox__input" %> + <%= d.label class: "checkbox__label" %> +
        + <% leaf = branch[d.object] %> + <%= s.collection_check_boxes( :taxonomy_ids, leaf.keys, :id, :name) do |e| %> +
        + <%= e.check_box class: "checkbox__input" %> + <%= e.label class: "checkbox__label" %> +
        + <% end %> + <% end %> +
        + + +
        + <% end %> +
        From 594962a59ebf24b1e69e5a4eb70020479611be94 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 17:05:46 +0100 Subject: [PATCH 103/105] bulk add taxonomies form page --- .../tools/bulk_add_taxonomies/show.html.erb | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 app/views/admin/tools/bulk_add_taxonomies/show.html.erb diff --git a/app/views/admin/tools/bulk_add_taxonomies/show.html.erb b/app/views/admin/tools/bulk_add_taxonomies/show.html.erb new file mode 100644 index 00000000..eceee572 --- /dev/null +++ b/app/views/admin/tools/bulk_add_taxonomies/show.html.erb @@ -0,0 +1,90 @@ +<% content_for :title do %>Bulk add taxonomies | <% end %> + +<% content_for :header do %> +

        Bulk add taxonomies

        +<% end %> + + +<% content_for :precontent do%> + +<% end %> + + +
        + + +
        +

        This tool allows you to add new taxonomies to a selection of services.
        + Please note some actions may take a long time as every record is updated and added to the activity log.

        + +

        Email alerts are not sent to watchers.
        + We don't update the mongo database so you will need to run the build_public_index task afterwards.
        + Activity records are created manually. +

        + +

        After running this tool you will need to run the build_public_index and update_counters jobs

        + + <% if Taxonomy.any? %> + + <%= form_with url: admin_settings_tools_bulk_add_taxonomies_path, method: :patch, data: {warn_unsaved_changes: true}, builder: OutpostFormBuilder do |s| %> + + <% if @errors.any? %> +
        +

        <%= pluralize(@errors.count, "error") %> occured

        +

        The following services could not be updated, please try again or update them manually

        +
          + <% @errors.each do |e| %> +
        • + <%= link_to e[:name] || 'Unknown service name', admin_service_path(e[:id]) %> +

          +

            + <% e[:messages].each do |m| %> +
          • <%= m.html_safe %>
          • + <% end %> +
          +

          +
        • + <% end %> +
        +
        + <% end %> + + +

        Services

        + +
        + <%= label_tag :taxonomy, "Services in this taxonomy", class: "field__label" %> + <%= select_tag :taxonomy, options_for_select(options_for_taxonomies_dropdown()), { class: "field__input", include_blank: true, required: true} %> +
        + +

        Taxonomies

        + + <%= render "shared/editors/taxonomies", s: s %> + +
        + <%= s.submit "Add new taxonomies", class: "button" %> +
        + + <% end %> + + + <% else %> +

        + No taxonomies set up yet. + <%= link_to 'Create some taxonomies', admin_taxonomies_path %> +

        + <% end %> + +
        + + +
        From 951f9e792d494d89cc1416810b78aea16e9d2d8a Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 17:06:49 +0100 Subject: [PATCH 104/105] add some optional skip callbacks and allow service as_json options to be optionally overwritten --- app/models/service.rb | 52 ++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/app/models/service.rb b/app/models/service.rb index 30440a2f..495310b4 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -16,10 +16,18 @@ class Service < ApplicationRecord } ) + # fields + attr_accessor :skip_notify_watchers + attr_accessor :skip_add_parent_taxonomies + attr_accessor :skip_cost_option_validation + attr_accessor :skip_age_validation + # validations validates :name, presence: true, uniqueness: true, length: { minimum: 2, maximum: 100 } - validate :validate_ages - validate :validate_freeness + validate :validate_ages, unless: :skip_age_validation + validate :validate_freeness, unless: :skip_cost_option_validation + + # associations belongs_to :organisation, counter_cache: true @@ -74,8 +82,8 @@ class Service < ApplicationRecord scope :in_directory, -> (directory) { joins(:directories).where(directories: { name: directory }) } # callbacks - after_save :notify_watchers - after_save :add_parent_taxonomies + after_save :notify_watchers, unless: :skip_notify_watchers + before_save :add_parent_taxonomies, unless: :skip_add_parent_taxonomies before_save :skip_nested_indexes before_save :update_directories @@ -265,25 +273,27 @@ def update_directories self.directories_as_text = self.directories&.map{ |dir| dir.name }&.uniq&.sort&.join(", ") end - # include nested taxonomies in json representation by default + # include nested taxonomies in json representation by default (but can be overridden) def as_json(options={}) - options[:include] = { - :organisation => {}, - :locations => { - methods: :geometry, - include: :accessibilities - }, - :taxonomies => { methods: :slug }, - :meta => {}, - :contacts => {}, - :local_offer => {}, - :send_needs => {}, - :suitabilities => {}, - :cost_options => {}, - :regular_schedules => {}, - :links => {} + default_options = { + :include => { + :organisation => {}, + :locations => { + methods: :geometry, + include: :accessibilities + }, + :taxonomies => { methods: :slug }, + :meta => {}, + :contacts => {}, + :local_offer => {}, + :send_needs => {}, + :suitabilities => {}, + :cost_options => {}, + :regular_schedules => {}, + :links => {} + } } - super + super(default_options.merge(options)) end # fields that we don't care about for versioning purposes From df2c22e7ad8aa62d18b0e0253c27fb8c8f0b43ab Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 5 Jun 2024 17:08:06 +0100 Subject: [PATCH 105/105] Bulk add taxonomies controller --- .../tools/bulk_add_taxonomies_controller.rb | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 app/controllers/admin/tools/bulk_add_taxonomies_controller.rb diff --git a/app/controllers/admin/tools/bulk_add_taxonomies_controller.rb b/app/controllers/admin/tools/bulk_add_taxonomies_controller.rb new file mode 100644 index 00000000..00a75cc8 --- /dev/null +++ b/app/controllers/admin/tools/bulk_add_taxonomies_controller.rb @@ -0,0 +1,145 @@ +# This tool is for superadmins only right now +# it is only very simply optimised for large number of services, +# if you run into errors you should be able to just re-run the command with it only updating ones where data will be changing +class Admin::Tools::BulkAddTaxonomiesController < Admin::BaseController + + def show + @errors = flash.now[:errors] || [] + end + + def update + services_taxonomy_id = params[:taxonomy] + taxonomy_ids = setup_taxonomy_ids(params[:taxonomy_ids], services_taxonomy_id) + + if services_taxonomy_id.present? && taxonomy_ids.length > 0 + + updated_services = 0 + skipped_services = 0 + errors_count = 0 + errors = [] + + Service.joins(:service_taxonomies).where(service_taxonomies: { taxonomy_id: services_taxonomy_id }).includes(:taxonomies, :versions, :organisation, :service_at_locations, :locations, :directories_services, :directories, :taggings).distinct.find_each(batch_size: 10) do |service| + + service_updated = false + service_taxonomy_ids = service.taxonomies.map(&:id) + + # budget optimisation - skip if the service already has the taxonomies we're wanting to add to it + if (taxonomy_ids - service_taxonomy_ids).empty? + skipped_services += 1 + next + end + + # force paper trail version to be saved + service.updated_at = Time.now + + # dont notify watchers + service.skip_notify_watchers = true + + # we found the parents above to save some time + service.skip_add_parent_taxonomies = true + + # we don't want to update the mongo index we can do that later + service.skip_mongo_callbacks = true + + # skip things that do extra database lookups + service.skip_cost_option_validation = true + + + begin + service_updated = ActiveRecord::Base.transaction do + + update_service = PaperTrail.request(enabled: false) do + service.update!(taxonomy_ids: (service_taxonomy_ids | taxonomy_ids)) + end + + if update_service + + # create a manual papertrail version (if update is successful) + # the .to_json method in service does a lot of queries and we know we're only updating the taxonomies and updated_at date here + last_version = service.versions.last.object + current_changes = service.as_json(only: [:taxonomies, :updated_at], include: { taxonomies: { methods: :slug } }) + new_object = last_version.merge(current_changes) + + version = PaperTrail::Version.create( + item_type: 'Service', + item_id: service.id, + event: 'update', + whodunnit: nil, + object: new_object, + object_changes: service.saved_changes + ) + version.persisted? if version + else + false + end + + end + rescue ActiveRecord::RecordInvalid => e + puts "Caught RecordInvalid exception: #{e.message}" + errors << { id: service.id, name: service.name, error: "RecordInvalid", messages: [e.message] } + errors_count += 1 + rescue ActiveRecord::RecordNotFound => e + puts "Caught RecordNotFound exception: #{e.message}" + errors << { id: service.id, name: service.name, error: "RecordNotFound", messages: [e.message] } + errors_count += 1 + end + + + if service_updated + updated_services += 1 + else + if !errors.map { |e| e[:id] }.include?(service.id) + errors << { id: service.id, name: service.name, error: 'Transaction failed', messages: ['Update transaction failed, please view logs for more information']} + errors_count += 1 + end + end + + + end + + # sort by id in case of dupes + errors.sort_by! { |error| error[:id] } + + + puts errors.inspect + if errors.any? + flash.now[:alert] = "#{updated_services} services have been updated. #{skipped_services} services were skipped. There were #{errors_count} errors." + @errors = errors + render :show + else + redirect_to admin_settings_tools_bulk_add_taxonomies_path, notice: "#{updated_services} services have been updated. #{skipped_services} services were skipped." + end + + else + redirect_to admin_settings_tools_bulk_add_taxonomies_path, alert: "Please select at least one taxonomy to add." + end + end + + private + + + def setup_taxonomy_ids(tax_ids, services_taxonomy_id) + # remove empty values + taxonomy_ids = tax_ids.reject { |c| c.empty? } + + # remove current taxonomy from list + taxonomy_ids = taxonomy_ids.reject { |c| c == services_taxonomy_id } + + # ensure the taxonomy id's are integers + taxonomy_ids = taxonomy_ids.map(&:to_i) + + # to speed things up we fetch the parents of the selected taxonomies here + # that way we can safely skip the add_parent_taxonomies callback + parent_taxonomy_ids = [] + taxonomy_ids.each do |taxonomy_id| + parents = Taxonomy.find(taxonomy_id).ancestors.pluck(:id) + parent_taxonomy_ids.concat(parents) + end + + taxonomy_ids = (taxonomy_ids + parent_taxonomy_ids).uniq + end + + + + +end