From 4deb83dd7dd1f6b614ab1a2da6b255ed652e5874 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Mon, 19 Aug 2024 10:17:37 -0600 Subject: [PATCH 01/14] Update email title for changed admin perms --- app/mailers/user_mailer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index e863a2ba2b..b7c6e21f48 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -195,7 +195,7 @@ def admin_privileges(user) I18n.with_locale I18n.locale do mail(to: user.email, - subject: format(_('Administrator privileges granted in %{tool_name}'), + subject: format(_('Administrator privileges updated in %{tool_name}'), tool_name: tool_name)) end end From 7b788d695b9ec778b0c7fc913a3052004206b39a Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Mon, 19 Aug 2024 11:16:06 -0600 Subject: [PATCH 02/14] Fix handling of `privileges_changed` assignment When `privileges_changed == true`, the admin_privileges email is triggered. Prior to this commit, the triggered email was working properly with respect to removed privileges. However, in terms of added privileges, it was only being triggered when the API access privilege was added. This commit results in the email now being triggered after any privilege is added. --- app/controllers/users_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index def9e66356..6a07aeca7d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -87,8 +87,8 @@ def admin_update_permissions @user.perms << perm if perm.id == Perm.use_api.id @user.keep_or_generate_token! - privileges_changed = true end + privileges_changed = true end end From fbe11629cd9c950b987546ad3ee98ec460a1095d Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Mon, 19 Aug 2024 11:19:26 -0600 Subject: [PATCH 03/14] Make rubocop happy --- app/controllers/users_controller.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6a07aeca7d..1e241f5fbf 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -85,9 +85,7 @@ def admin_update_permissions end elsif perms.include? perm @user.perms << perm - if perm.id == Perm.use_api.id - @user.keep_or_generate_token! - end + @user.keep_or_generate_token! if perm.id == Perm.use_api.id privileges_changed = true end end From 67aa127d3f7c3a27cc3e4c016e08c5dd4cecda2f Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Mon, 19 Aug 2024 14:13:22 -0600 Subject: [PATCH 04/14] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7732ce4653..822b6f507d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +### Fixed + + - Fix triggering and title of autosent email when a user's admin privileges are changed [#858](https://github.com/portagenetwork/roadmap/pull/858) + +## [4.1.1+portage-4.1.3] - 2024-08-08 + ### Changed - Bump rexml from 3.2.8 to 3.3.3 [#839](https://github.com/portagenetwork/roadmap/pull/839) From 9a9e6e25c8d2c5ac4ad46170d19ab9cf2b4e4c45 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Tue, 20 Aug 2024 13:03:46 -0600 Subject: [PATCH 05/14] Delete sessions.rake Our app has been using `cookie_store` for some time https://github.com/portagenetwork/roadmap/blob/deployment-portage/config/initializers/session_store.rb. As a result, this rake task is no longer needed. Also, this rake task is currently broken: https://app.rollbar.com/a/ualbertalib/fix/item/dmp_assistant/490 --- lib/tasks/sessions.rake | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 lib/tasks/sessions.rake diff --git a/lib/tasks/sessions.rake b/lib/tasks/sessions.rake deleted file mode 100644 index e3f9b1fbe1..0000000000 --- a/lib/tasks/sessions.rake +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -# Neil created this, designed around http://stackoverflow.com/questions/10088619/how-to-clear-rails-sessions-table -# hint: config/initializers/devise.rb sets "remember_for" -namespace :sessions do - desc 'Clear expired sessions from the database' - task cleanup: :environment do - ActiveRecord::SessionStore::Session.delete_all(['updated_at < ?', Devise.remember_for.ago]) - end -end From 124bc52c4bd32d5f72bb8480f6ab8073d836bede Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Tue, 20 Aug 2024 13:29:15 -0600 Subject: [PATCH 06/14] Create and run migration to drop sessions table Our app is using the cookie_store https://github.com/portagenetwork/roadmap/blob/deployment-portage/config/initializers/session_store.rb. As a result, the sessions table is no longer needed. --- .../20240820190548_drop_sessions_table.rb | 11 + db/schema.rb | 208 +++++++++--------- 2 files changed, 112 insertions(+), 107 deletions(-) create mode 100644 db/migrate/20240820190548_drop_sessions_table.rb diff --git a/db/migrate/20240820190548_drop_sessions_table.rb b/db/migrate/20240820190548_drop_sessions_table.rb new file mode 100644 index 0000000000..5026e7b645 --- /dev/null +++ b/db/migrate/20240820190548_drop_sessions_table.rb @@ -0,0 +1,11 @@ +class DropSessionsTable < ActiveRecord::Migration[6.1] + def up + drop_table :sessions + end + + def down + # rollback will the execute the initial migration code written to create the sessions table + require Rails.root.join('db/migrate/20181024120747_add_sessions_table.rb') + AddSessionsTable.new.change + end +end diff --git a/db/schema.rb b/db/schema.rb index 5cf36f45cb..466b1fbda9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,20 +2,23 @@ # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_03_15_104737) do +ActiveRecord::Schema.define(version: 2024_08_20_190548) do - create_table "annotations", id: :integer, force: :cascade do |t| + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "annotations", id: :serial, force: :cascade do |t| t.integer "question_id" t.integer "org_id" - t.text "text", limit: 16777215 + t.text "text" t.integer "type", default: 0, null: false t.datetime "created_at" t.datetime "updated_at" @@ -25,8 +28,8 @@ t.index ["versionable_id"], name: "index_annotations_on_versionable_id" end - create_table "answers", id: :integer, force: :cascade do |t| - t.text "text", limit: 16777215 + create_table "answers", id: :serial, force: :cascade do |t| + t.text "text" t.integer "plan_id" t.integer "user_id" t.integer "question_id" @@ -51,7 +54,7 @@ t.index ["question_option_id"], name: "fk_rails_01ba00b569" end - create_table "api_clients", id: :integer, force: :cascade do |t| + create_table "api_clients", id: :serial, force: :cascade do |t| t.string "name", null: false t.string "description" t.string "homepage" @@ -66,7 +69,7 @@ t.index ["name"], name: "index_api_clients_on_name" end - create_table "comments", id: :integer, force: :cascade do |t| + create_table "comments", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "question_id" t.text "text" @@ -77,7 +80,7 @@ t.integer "archived_by" end - create_table "conditions", id: :integer, force: :cascade do |t| + create_table "conditions", id: :serial, force: :cascade do |t| t.integer "question_id" t.text "option_list" t.integer "action_type" @@ -89,7 +92,7 @@ t.index ["question_id"], name: "index_conditions_on_question_id" end - create_table "contributors", id: :integer, force: :cascade do |t| + create_table "contributors", id: :serial, force: :cascade do |t| t.string "name" t.string "email" t.string "phone" @@ -104,7 +107,7 @@ t.index ["roles"], name: "index_contributors_on_roles" end - create_table "departments", id: :integer, force: :cascade do |t| + create_table "departments", id: :serial, force: :cascade do |t| t.string "name" t.string "code" t.integer "org_id" @@ -113,18 +116,18 @@ t.index ["org_id"], name: "index_departments_on_org_id" end - create_table "dmptemplate_translations", id: :integer, force: :cascade do |t| + create_table "dmptemplate_translations", id: :serial, force: :cascade do |t| t.integer "dmptemplate_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.index ["dmptemplate_id"], name: "index_dmptemplate_translations_on_dmptemplate_id" t.index ["locale"], name: "index_dmptemplate_translations_on_locale" end - create_table "dmptemplates", id: :integer, force: :cascade do |t| + create_table "dmptemplates", id: :serial, force: :cascade do |t| t.string "title" t.text "description" t.boolean "published" @@ -141,7 +144,7 @@ t.integer "guidance_group_id" end - create_table "exported_plans", id: :integer, force: :cascade do |t| + create_table "exported_plans", id: :serial, force: :cascade do |t| t.integer "plan_id" t.integer "user_id" t.string "format" @@ -150,7 +153,7 @@ t.integer "phase_id" end - create_table "file_types", id: :integer, force: :cascade do |t| + create_table "file_types", id: :serial, force: :cascade do |t| t.string "name" t.string "icon_name" t.integer "icon_size" @@ -159,7 +162,7 @@ t.datetime "updated_at", null: false end - create_table "file_uploads", id: :integer, force: :cascade do |t| + create_table "file_uploads", id: :serial, force: :cascade do |t| t.string "name" t.string "title" t.text "description" @@ -171,7 +174,7 @@ t.datetime "updated_at", null: false end - create_table "friendly_id_slugs", id: :integer, force: :cascade do |t| + create_table "friendly_id_slugs", id: :serial, force: :cascade do |t| t.string "slug", null: false t.integer "sluggable_id", null: false t.string "sluggable_type", limit: 40 @@ -181,7 +184,7 @@ t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type" end - create_table "guidance_groups", id: :integer, force: :cascade do |t| + create_table "guidance_groups", id: :serial, force: :cascade do |t| t.string "name" t.integer "org_id" t.datetime "created_at", null: false @@ -197,18 +200,18 @@ t.index ["guidance_id", "guidance_group_id"], name: "index_guidance_in_group_on_guidance_id_and_guidance_group_id" end - create_table "guidance_translations", id: :integer, force: :cascade do |t| + create_table "guidance_translations", id: :serial, force: :cascade do |t| t.integer "guidance_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.text "text", limit: 16777215 + t.text "text" t.index ["guidance_id"], name: "index_guidance_translations_on_guidance_id" t.index ["locale"], name: "index_guidance_translations_on_locale" end - create_table "guidances", id: :integer, force: :cascade do |t| - t.text "text", limit: 16777215 + create_table "guidances", id: :serial, force: :cascade do |t| + t.text "text" t.integer "guidance_group_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -216,18 +219,18 @@ t.index ["guidance_group_id"], name: "index_guidances_on_guidance_group_id" end - create_table "identifier_schemes", id: :integer, force: :cascade do |t| + create_table "identifier_schemes", id: :serial, force: :cascade do |t| t.string "name" t.string "description" t.boolean "active" t.datetime "created_at" t.datetime "updated_at" - t.text "logo_url", limit: 16777215 - t.text "identifier_prefix", limit: 16777215 + t.text "logo_url" + t.text "identifier_prefix" t.integer "context" end - create_table "identifiers", id: :integer, force: :cascade do |t| + create_table "identifiers", id: :serial, force: :cascade do |t| t.string "value", null: false t.text "attrs" t.integer "identifier_scheme_id" @@ -240,7 +243,7 @@ t.index ["identifier_scheme_id", "value"], name: "index_identifiers_on_identifier_scheme_id_and_value" end - create_table "languages", id: :integer, force: :cascade do |t| + create_table "languages", id: :serial, force: :cascade do |t| t.string "abbreviation" t.string "description" t.string "name" @@ -278,9 +281,9 @@ t.index ["research_output_id"], name: "metadata_research_outputs_on_ro" end - create_table "notes", id: :integer, force: :cascade do |t| + create_table "notes", id: :serial, force: :cascade do |t| t.integer "user_id" - t.text "text", limit: 16777215 + t.text "text" t.boolean "archived", default: false, null: false t.integer "answer_id" t.integer "archived_by" @@ -290,7 +293,7 @@ t.index ["user_id"], name: "fk_rails_7f2323ad43" end - create_table "notification_acknowledgements", id: :integer, force: :cascade do |t| + create_table "notification_acknowledgements", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "notification_id" t.datetime "created_at" @@ -299,11 +302,11 @@ t.index ["user_id"], name: "index_notification_acknowledgements_on_user_id" end - create_table "notifications", id: :integer, force: :cascade do |t| + create_table "notifications", id: :serial, force: :cascade do |t| t.integer "notification_type" t.string "title" t.integer "level" - t.text "body", limit: 16777215 + t.text "body" t.boolean "dismissable" t.date "starts_at" t.date "expires_at" @@ -312,7 +315,7 @@ t.boolean "enabled", default: true end - create_table "option_warnings", id: :integer, force: :cascade do |t| + create_table "option_warnings", id: :serial, force: :cascade do |t| t.integer "organisation_id" t.integer "option_id" t.text "text" @@ -320,7 +323,7 @@ t.datetime "updated_at", null: false end - create_table "options", id: :integer, force: :cascade do |t| + create_table "options", id: :serial, force: :cascade do |t| t.integer "question_id" t.string "text" t.integer "number" @@ -329,7 +332,7 @@ t.datetime "updated_at", null: false end - create_table "org_token_permissions", id: :integer, force: :cascade do |t| + create_table "org_token_permissions", id: :serial, force: :cascade do |t| t.integer "org_id" t.integer "token_permission_type_id" t.datetime "created_at" @@ -338,14 +341,14 @@ t.index ["token_permission_type_id"], name: "fk_rails_2aa265f538" end - create_table "organisation_types", id: :integer, force: :cascade do |t| + create_table "organisation_types", id: :serial, force: :cascade do |t| t.string "name" t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "organisations", id: :integer, force: :cascade do |t| + create_table "organisations", id: :serial, force: :cascade do |t| t.string "name" t.string "abbreviation" t.string "target_url" @@ -370,7 +373,7 @@ t.string "contact_email" end - create_table "orgs", id: :integer, force: :cascade do |t| + create_table "orgs", id: :serial, force: :cascade do |t| t.string "name" t.string "abbreviation" t.string "target_url" @@ -386,36 +389,36 @@ t.integer "language_id" t.string "contact_email" t.integer "org_type", default: 0, null: false - t.text "links", limit: 16777215 + t.text "links" t.string "contact_name" t.boolean "feedback_enabled", default: false - t.text "feedback_msg", limit: 16777215 + t.text "feedback_msg" t.boolean "managed", default: false, null: false t.string "helpdesk_email" t.index ["language_id"], name: "fk_rails_5640112cab" t.index ["region_id"], name: "fk_rails_5a6adf6bab" end - create_table "perms", id: :integer, force: :cascade do |t| + create_table "perms", id: :serial, force: :cascade do |t| t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "phase_translations", id: :integer, force: :cascade do |t| + create_table "phase_translations", id: :serial, force: :cascade do |t| t.integer "phase_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.index ["locale"], name: "index_phase_translations_on_locale" t.index ["phase_id"], name: "index_phase_translations_on_phase_id" end - create_table "phases", id: :integer, force: :cascade do |t| + create_table "phases", id: :serial, force: :cascade do |t| t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.integer "number" t.integer "template_id" t.datetime "created_at" @@ -426,7 +429,7 @@ t.index ["versionable_id"], name: "index_phases_on_versionable_id" end - create_table "plan_sections", id: :integer, force: :cascade do |t| + create_table "plan_sections", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "section_id" t.integer "plan_id" @@ -435,13 +438,13 @@ t.datetime "release_time" end - create_table "plans", id: :integer, force: :cascade do |t| + create_table "plans", id: :serial, force: :cascade do |t| t.string "title" t.integer "template_id" t.datetime "created_at" t.datetime "updated_at" t.string "identifier" - t.text "description", limit: 16777215 + t.text "description" t.integer "visibility", default: 3, null: false t.boolean "feedback_requested", default: false t.boolean "complete", default: false @@ -462,19 +465,19 @@ t.index ["template_id"], name: "index_plans_on_template_id" end - create_table "plans_guidance_groups", id: :integer, force: :cascade do |t| + create_table "plans_guidance_groups", id: :serial, force: :cascade do |t| t.integer "guidance_group_id" t.integer "plan_id" t.index ["guidance_group_id", "plan_id"], name: "index_plans_guidance_groups_on_guidance_group_id_and_plan_id" t.index ["plan_id"], name: "fk_rails_13d0671430" end - create_table "prefs", id: :integer, force: :cascade do |t| - t.text "settings", limit: 16777215 + create_table "prefs", id: :serial, force: :cascade do |t| + t.text "settings" t.integer "user_id" end - create_table "project_groups", id: :integer, force: :cascade do |t| + create_table "project_groups", id: :serial, force: :cascade do |t| t.boolean "project_creator" t.boolean "project_editor" t.integer "user_id" @@ -490,7 +493,7 @@ t.index ["project_id", "guidance_group_id"], name: "index_project_guidance_on_project_id_and_guidance_group_id" end - create_table "projects", id: :integer, force: :cascade do |t| + create_table "projects", id: :serial, force: :cascade do |t| t.string "title" t.integer "dmptemplate_id" t.datetime "created_at", null: false @@ -507,27 +510,27 @@ t.index ["slug"], name: "index_projects_on_slug", unique: true end - create_table "question_format_translations", id: :integer, force: :cascade do |t| + create_table "question_format_translations", id: :serial, force: :cascade do |t| t.integer "question_format_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.index ["locale"], name: "index_question_format_translations_on_locale" t.index ["question_format_id"], name: "index_question_format_translations_on_question_format_id" end - create_table "question_formats", id: :integer, force: :cascade do |t| + create_table "question_formats", id: :serial, force: :cascade do |t| t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "option_based", default: false t.integer "formattype", default: 0 end - create_table "question_options", id: :integer, force: :cascade do |t| + create_table "question_options", id: :serial, force: :cascade do |t| t.integer "question_id" t.string "text" t.integer "number" @@ -539,20 +542,20 @@ t.index ["versionable_id"], name: "index_question_options_on_versionable_id" end - create_table "question_translations", id: :integer, force: :cascade do |t| + create_table "question_translations", id: :serial, force: :cascade do |t| t.integer "question_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.text "text", limit: 16777215 - t.text "guidance", limit: 16777215 + t.text "text" + t.text "guidance" t.index ["locale"], name: "index_question_translations_on_locale" t.index ["question_id"], name: "index_question_translations_on_question_id" end - create_table "questions", id: :integer, force: :cascade do |t| - t.text "text", limit: 16777215 - t.text "default_value", limit: 16777215 + create_table "questions", id: :serial, force: :cascade do |t| + t.text "text" + t.text "default_value" t.integer "number" t.integer "section_id" t.datetime "created_at" @@ -573,12 +576,12 @@ t.index ["theme_id"], name: "fk_rails_0489d5eeba" end - create_table "region_groups", id: :integer, force: :cascade do |t| + create_table "region_groups", id: :serial, force: :cascade do |t| t.integer "super_region_id" t.integer "region_id" end - create_table "regions", id: :integer, force: :cascade do |t| + create_table "regions", id: :serial, force: :cascade do |t| t.string "abbreviation" t.string "description" t.string "name" @@ -637,7 +640,7 @@ t.index ["plan_id"], name: "index_research_outputs_on_plan_id" end - create_table "roles", id: :integer, force: :cascade do |t| + create_table "roles", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "plan_id" t.datetime "created_at" @@ -648,20 +651,20 @@ t.index ["user_id"], name: "index_roles_on_user_id" end - create_table "section_translations", id: :integer, force: :cascade do |t| + create_table "section_translations", id: :serial, force: :cascade do |t| t.integer "section_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.index ["locale"], name: "index_section_translations_on_locale" t.index ["section_id"], name: "index_section_translations_on_section_id" end - create_table "sections", id: :integer, force: :cascade do |t| + create_table "sections", id: :serial, force: :cascade do |t| t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.integer "number" t.datetime "created_at" t.datetime "updated_at" @@ -672,42 +675,33 @@ t.index ["versionable_id"], name: "index_sections_on_versionable_id" end - create_table "sessions", id: :integer, force: :cascade do |t| - t.string "session_id", limit: 64, null: false - t.text "data", limit: 16777215 - t.datetime "created_at" - t.datetime "updated_at" - t.index ["session_id"], name: "index_sessions_on_session_id", unique: true - t.index ["updated_at"], name: "index_sessions_on_updated_at" - end - - create_table "settings", id: :integer, force: :cascade do |t| + create_table "settings", id: :serial, force: :cascade do |t| t.string "var", null: false - t.text "value", limit: 16777215 + t.text "value" t.integer "target_id", null: false t.string "target_type", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "splash_logs", id: :integer, force: :cascade do |t| + create_table "splash_logs", id: :serial, force: :cascade do |t| t.string "destination" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "stats", id: :integer, force: :cascade do |t| + create_table "stats", id: :serial, force: :cascade do |t| t.bigint "count", default: 0 t.date "date", null: false t.string "type", null: false t.integer "org_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.text "details", limit: 16777215 + t.text "details" t.boolean "filtered", default: false end - create_table "stylesheets", id: :integer, force: :cascade do |t| + create_table "stylesheets", id: :serial, force: :cascade do |t| t.string "file_uid" t.string "file_name" t.integer "organisation_id" @@ -715,7 +709,7 @@ t.datetime "updated_at", null: false end - create_table "suggested_answers", id: :integer, force: :cascade do |t| + create_table "suggested_answers", id: :serial, force: :cascade do |t| t.integer "question_id" t.integer "organisation_id" t.text "text" @@ -724,9 +718,9 @@ t.boolean "is_example" end - create_table "templates", id: :integer, force: :cascade do |t| + create_table "templates", id: :serial, force: :cascade do |t| t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.boolean "published" t.integer "org_id" t.string "locale" @@ -738,16 +732,16 @@ t.integer "customization_of" t.integer "family_id" t.boolean "archived" - t.text "links", limit: 16777215 + t.text "links" t.index ["family_id", "version"], name: "index_templates_on_family_id_and_version", unique: true t.index ["family_id"], name: "index_templates_on_family_id" t.index ["org_id", "family_id"], name: "template_organisation_dmptemplate_index" t.index ["org_id"], name: "index_templates_on_org_id" end - create_table "themes", id: :integer, force: :cascade do |t| + create_table "themes", id: :serial, force: :cascade do |t| t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "locale" @@ -760,14 +754,14 @@ t.index ["theme_id"], name: "index_themes_in_guidance_on_theme_id" end - create_table "token_permission_types", id: :integer, force: :cascade do |t| + create_table "token_permission_types", id: :serial, force: :cascade do |t| t.string "token_type" - t.text "text_description", limit: 16777215 + t.text "text_description" t.datetime "created_at" t.datetime "updated_at" end - create_table "trackers", id: :integer, force: :cascade do |t| + create_table "trackers", id: :serial, force: :cascade do |t| t.integer "org_id" t.string "code" t.datetime "created_at", null: false @@ -775,28 +769,28 @@ t.index ["org_id"], name: "index_trackers_on_org_id" end - create_table "user_role_types", id: :integer, force: :cascade do |t| + create_table "user_role_types", id: :serial, force: :cascade do |t| t.string "name" t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "user_statuses", id: :integer, force: :cascade do |t| + create_table "user_statuses", id: :serial, force: :cascade do |t| t.string "name" t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "user_types", id: :integer, force: :cascade do |t| + create_table "user_types", id: :serial, force: :cascade do |t| t.string "name" t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "users", id: :integer, force: :cascade do |t| + create_table "users", id: :serial, force: :cascade do |t| t.string "firstname" t.string "surname" t.string "email", limit: 80, default: "", null: false @@ -849,18 +843,18 @@ t.index ["user_id", "role_id"], name: "index_users_roles_on_user_id_and_role_id" end - create_table "version_translations", id: :integer, force: :cascade do |t| + create_table "version_translations", id: :serial, force: :cascade do |t| t.integer "version_id" t.string "locale", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" - t.text "description", limit: 16777215 + t.text "description" t.index ["locale"], name: "index_version_translations_on_locale" t.index ["version_id"], name: "index_version_translations_on_version_id" end - create_table "versions", id: :integer, force: :cascade do |t| + create_table "versions", id: :serial, force: :cascade do |t| t.string "title" t.text "description" t.boolean "published" From 53611884d19e2a3bd70081f19655fa5b6731da2b Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Thu, 22 Aug 2024 09:49:05 -0600 Subject: [PATCH 07/14] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 822b6f507d..c6bccd7cc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Changed + + - Drop Sessions Table and Delete `lib/tasks/sessions.rake` [#859](https://github.com/portagenetwork/roadmap/pull/859) + ### Fixed - Fix triggering and title of autosent email when a user's admin privileges are changed [#858](https://github.com/portagenetwork/roadmap/pull/858) From 1ace30bfccf060f4b60e4b72a2b8c7b1302f0d30 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Tue, 13 Aug 2024 16:18:58 -0600 Subject: [PATCH 08/14] Create `GET "/api/ca_dashboard/stats"` endpoint --- .../api/ca_dashboard/stats_controller.rb | 59 +++++++++++++++++++ .../ca_dashboard/stats/index.json.jbuilder | 6 ++ config/routes.rb | 4 ++ 3 files changed, 69 insertions(+) create mode 100644 app/controllers/api/ca_dashboard/stats_controller.rb create mode 100644 app/views/api/ca_dashboard/stats/index.json.jbuilder diff --git a/app/controllers/api/ca_dashboard/stats_controller.rb b/app/controllers/api/ca_dashboard/stats_controller.rb new file mode 100644 index 0000000000..113f60a098 --- /dev/null +++ b/app/controllers/api/ca_dashboard/stats_controller.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Api + module CaDashboard + # Handles CRUD operations for "/api/ca_dashboard/stats" + class StatsController < Api::V1::BaseApiController + + # GET /api/ca_dashboard/stats + def index + # To access this endpoint, the user must provide a valid JWT + # JWT is acquired by authenticating via POST /api/v1/authenticate + base_hash = { + 'plans' => Plan.all, + 'orgs' => Org.where(managed: true).all, + 'users' => User.all + } + @totals = { + 'all_time' => all_time_counts(base_hash), + 'last_30_days' => last_30_days_counts(base_hash) + } + begin + @totals['custom_range'] = custom_range_counts(base_hash) if date_params_present? + render 'api/ca_dashboard/stats/index', status: :ok + rescue ArgumentError + error_msg = _('Invalid date format. please use YYYY-MM-DD when supplying `start` or `end` params.') + render_error(errors: [error_msg], status: :bad_request) + end + end + + private + + def all_time_counts(base_hash) + base_hash.transform_values(&:count) + end + + def last_30_days_counts(base_hash) + base_hash.transform_values do |scope| + scope.where('created_at >= ?', 30.days.ago).count + end + end + + def custom_range_counts(base_hash) + start_date = parse_date(params[:start]) + end_date = parse_date(params[:end]) + base_hash.transform_values do |scope| + scope.where(created_at: start_date..end_date).count + end + end + + def date_params_present? + params[:start].present? || params[:end].present? + end + + def parse_date(date_string) + Date.strptime(date_string, '%Y-%m-%d') if date_string.present? + end + end + end +end diff --git a/app/views/api/ca_dashboard/stats/index.json.jbuilder b/app/views/api/ca_dashboard/stats/index.json.jbuilder new file mode 100644 index 0000000000..29ce2c4fba --- /dev/null +++ b/app/views/api/ca_dashboard/stats/index.json.jbuilder @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +json.partial! 'api/v1/standard_response' +json.stats do + json.totals @totals +end diff --git a/config/routes.rb b/config/routes.rb index 2d63c59536..df1b14542b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -204,6 +204,10 @@ resources :plans, only: %i[create show index] resources :templates, only: [:index] end + + namespace :ca_dashboard do + resources :stats, only: [:index] + end end namespace :paginable do From 1066be2320b0985c90ef1faea0bf08dd75143376 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Thu, 22 Aug 2024 13:36:46 -0600 Subject: [PATCH 09/14] Bypass JWT auth for `GET /api/ca_dashboard/stats` --- app/controllers/api/ca_dashboard/stats_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/ca_dashboard/stats_controller.rb b/app/controllers/api/ca_dashboard/stats_controller.rb index 113f60a098..92efb460ab 100644 --- a/app/controllers/api/ca_dashboard/stats_controller.rb +++ b/app/controllers/api/ca_dashboard/stats_controller.rb @@ -4,11 +4,11 @@ module Api module CaDashboard # Handles CRUD operations for "/api/ca_dashboard/stats" class StatsController < Api::V1::BaseApiController + # Allow public access / bypass JWT authentication via "POST /api/v1/authenticate" + skip_before_action :authorize_request, only: [:index] # GET /api/ca_dashboard/stats def index - # To access this endpoint, the user must provide a valid JWT - # JWT is acquired by authenticating via POST /api/v1/authenticate base_hash = { 'plans' => Plan.all, 'orgs' => Org.where(managed: true).all, From 1e018b1a78bf3b6638990176962a5cc59d3a5141 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Wed, 28 Aug 2024 09:25:14 -0600 Subject: [PATCH 10/14] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7732ce4653..ed41c0089d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + + - Create GET "/api/ca_dashboard/stats" endpoint to fetch Plan, User, and Org-related statistics [#852](https://github.com/portagenetwork/roadmap/pull/852) + ### Changed - Bump rexml from 3.2.8 to 3.3.3 [#839](https://github.com/portagenetwork/roadmap/pull/839) From 1f94fb11a0f3b303f3d0c8fccf5849fce5a9f273 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Thu, 29 Aug 2024 14:28:35 -0600 Subject: [PATCH 11/14] Fix flaky tests / optimize checking of page title This commit replaces `page.source` with (the hopefully more efficient) `page.title` for verifying the page title. Checking the entire page source was potentially causing slowdowns and leading to the intermittent failing of tests within this file. --- spec/features/plans/exports_spec.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spec/features/plans/exports_spec.rb b/spec/features/plans/exports_spec.rb index 38081afb3f..43132b798e 100644 --- a/spec/features/plans/exports_spec.rb +++ b/spec/features/plans/exports_spec.rb @@ -45,7 +45,7 @@ select('html') new_window = window_opened_by { click_button 'Download Plan' } within_window new_window do - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) end end @@ -60,7 +60,7 @@ select('html') new_window = window_opened_by { click_button 'Download Plan' } within_window new_window do - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) end end @@ -91,7 +91,7 @@ click_button 'Download Plan' end within_window new_window do - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) plan.phases.each do |phase| expect(page.source).to have_text(phase.title) end @@ -101,7 +101,7 @@ click_button 'Download Plan' end within_window new_window do - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) expect(page.source).to have_text(plan.phases[1].title) expect(page.source).not_to have_text(plan.phases[2].title) if plan.phases.length > 2 end @@ -173,18 +173,18 @@ def _regular_download(format) click_button 'Download Plan' end within_window new_window do - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) end else click_button 'Download Plan' - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) end end def _all_phase_download _select_option('phase_id', 'All') click_button 'Download Plan' - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) plan.phases.each do |phase| # All phase titles should be included in output expect(page.source).to have_text(phase.title) end @@ -193,7 +193,7 @@ def _all_phase_download def _single_phase_download _select_option('phase_id', plan.phases[1].id) click_button 'Download Plan' - expect(page.source).to have_text(plan.title) + expect(page.title).to have_text(plan.title) expect(page.source).to have_text(plan.phases[1].title) expect(page.source).not_to have_text(plan.phases[2].title) if plan.phases.length > 2 end From 1a09e2ca3eb409326b6bdd4e4543bf4c8c35729b Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Thu, 29 Aug 2024 15:14:40 -0600 Subject: [PATCH 12/14] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6bccd7cc3..82cd786995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ - Fix triggering and title of autosent email when a user's admin privileges are changed [#858](https://github.com/portagenetwork/roadmap/pull/858) + - Fix flaky tests / Optimize Checking Of `plan.title` Within `spec/features/plans/exports_spec.rb` [#871](https://github.com/portagenetwork/roadmap/pull/871) + ## [4.1.1+portage-4.1.3] - 2024-08-08 ### Changed From f539af699ff13b6a0e6a1574d997cf21bb749e69 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Wed, 28 Aug 2024 13:01:54 -0600 Subject: [PATCH 13/14] Update favicons and associated html code Favicon and HTML code generated via https://realfavicongenerator.net/ The previous favicon was also generated via https://realfavicongenerator.net/ . However, rather than `public/android-chrome-192x192.png` and `public/android-chrome-256x256.png`, this time only `public/android-chrome-144x144.png` was generated. The updated `public/site.webmanifest` reflects this change. Also, due to the size of the provided favicon, https://realfavicongenerator.net/ outputted the following warning: ``` The strict minimum for the master picture is 70x70. Your picture is 150x150, which is ok. However, it is recommended to use a picture of at least 260x260. If you still want to use your picture, some of the derivated favicons will not be generated, such as the high resolution tile for Windows 8 / IE 11. ``` --- app/views/layouts/application.html.erb | 2 +- public/android-chrome-144x144.png | Bin 0 -> 15053 bytes public/android-chrome-192x192.png | Bin 5977 -> 0 bytes public/android-chrome-256x256.png | Bin 8083 -> 0 bytes public/apple-touch-icon.png | Bin 4169 -> 15053 bytes public/favicon-16x16.png | Bin 1018 -> 1648 bytes public/favicon-32x32.png | Bin 1572 -> 2383 bytes public/favicon.ico | Bin 15086 -> 12014 bytes public/mstile-150x150.png | Bin 3861 -> 14216 bytes public/safari-pinned-tab.svg | 22 +++++++++++----------- public/site.webmanifest | 9 ++------- 11 files changed, 14 insertions(+), 19 deletions(-) create mode 100644 public/android-chrome-144x144.png delete mode 100644 public/android-chrome-192x192.png delete mode 100644 public/android-chrome-256x256.png diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 58eaf24d05..89788fcccd 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -32,7 +32,7 @@ <%= content_for?(:title) ? yield(:title) : _('%{application_name}') % { :application_name => ApplicationService.application_name } %> - + diff --git a/public/android-chrome-144x144.png b/public/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..5dca11776f54a6a3c95f270648309101718d9999 GIT binary patch literal 15053 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 delta 4037 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 AXaE2J diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index cf3295736aee043a1757ce8bf906c38587ebf187..b44acf048bff2f3ccdc878e87c8db30067e3ecfd 100644 GIT binary patch delta 1452 zcmZ{j4OEg>7{_0t!VhX@$|^t5M05Gki?$+iEfuC^j!Y6g$22u4D)R$y>P|wf)NEyG z&eqK3npqYVP&hMnStzFFl=oGjOy>tmp=Ew$BJ8!Z(>a~Bd!Bpmx%d8m_j#Us?(+`w z8heItcC9;~w0#?$s?%1hWDH2W5|Y@#5_?$U0E_Xk*rr2b4@n##v8@6zi5*l$G8pue zW2*l4bXbCi%IB%>c@DIt{4I}a7cTB@h#2fRrh$KWR_h0e?Ttp`?CkU#-J>3PG$eL> zE{o9hmUZ6W(A^k4tDn$70!V~t_y+yV_(-2nUE>c)oRm^$=$7Sh-%W$jsDUydk)6S4 zn4TIMQlC{;cqp!+)HS|u$GZlhjLEUi-qvLJ7VcTK-$>t0y?$&662Kxmy?&y}>rx*>YHj8`+e09Asm4=li@7$pj~qPE z_0aBwT?!zMYYUynY7`D6nO3L$_*kn@_r8r4(j?i27EM*LpIHU8oxaf}IjY?Mefx`+<>5WS0U?)}egfa#^UEp+GZk(Z7;#r8 zQlG4AOp+=x(R`03e^KQD@e7yUX-dkXEy222uEYwn%hjB`*Un_85Z*xZK5S7+VK>7D!uMh8vYKw4;7+`N)j%J_X`&{ zAHmaa<5!zEmt~<-2J*P#PvygX3$yqR5*={U!wWx@m z@qdCD8Xc~vDlD!GWK_+zcggDEhJ(l8^IG$FWfj3A?282C6O?bE_|lgtc0HEijsjLd z2o}rN;SQ(7#C?Y}qY*Fn`>MzN)$;ixm9TA~KS_L9YoQ z2%*0C4@FBxutPBiKLxoRI&>0&EI&ZhR6d(UW3f0)F5pcP{!xQeF<|rIIFuI~%8dIs z77z?5!`C9R6`zoOa1MfM;>2Y{wQ^2{)EL?S{lm@W_C7KXBIp4U=|uB?^T`s81m~Yb GC;S8GS)tzm literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>y!YP!K5F z22u<%8O(-g0g+(qfEIyt!Hj~+f{oH{1WAE(fsF!@Elm2&66Pf*YWWXV2tssyo+k2V zj_98`Vi3fj3$p9;bkTov#r^?33vvV4RUoqE^EA=FbH#vx07O6qK*K@o|NnibU0DST zz^sxWKTxz_0gKEE_sH}R_V->3KA?&f>%E^Tq*ldWDxlD_B9{E$CstW&?ad|%wN z;-qL${J$SxpKozv^8cOg>}s#U&BUnnOkvK7RUxbkjovqCp3s=7ssHHH*UH~*W^;g6 zF(!GtyX2f)^mS!_!p$NiFaOM0ksT;>$kW9! zMB;LCf`G92bOxqEPt8n8H?=f2wwpQ@6DFr8G;(NYXlXXPgoH#YGG)Dznib^`72VFO zv|!EYa|_vn7M*7hHAqM|HeoXAv3$V9qqfYUO_DvPdnfCJZCjdVCFUk)FXvtIR@Nf$ zj^eu$N6#L3z>;Dqy>rKoT|28QJ{cHqsH|ju`~BnB&-@%uc)6Y>C-8H!N}oC-FD54_ zsd_*`LY8^kv`7szJ!|W@8ICQwih`~UkyEraEe%^IM{1br+A0T2FdSTCQ^=6}<0Q~G zswJ)wB`Jv|saDBFsX&Us$iT=z*U(Vcz$C=b!phhXh_nq1tqcsj9gfzbXvob^$xN%n zt-(sR_8?G0cvVP5Nl;?BLP1e}T4qkFLP=#oszPQ#NiqXN#hk~VcsL5fG&D~6pFZRH zG>Cy&nOiTJTUc4xd$I_#u!2j2$>9`c<;@`qr*B+2apcSqnIr6{8$1?x=`p+#7cBYY SWI7dS1%s!npUXO@geCw1*g(ku diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index 5097e8b7c07fd11cd00b1afdecc6ca4de5ab7483..cd21e2006afb4a2ab40389925e03135268c6517c 100644 GIT binary patch literal 2383 zcmZ{mc{mi_8pqEt_K~rZ+(sC(HDmvceT?i`B7;LqbUT3~2Qj%ak4Cgr_)qMj}Yz zp+x^60)i4vA|MD+{zL#Ia;cX;@U)>|Nqd3mS4c6q`c58OzUh)VmwHiN`Q5j2y3?;W zqFRb6Qq>7Tfzxf$Y0?qkq4)4fHewHBK8&X+I;`oi}s~-*LD_MsC5B zN(+cD;%fYC=R`@R+Q}&7Sccp1kt=`loSEm`fIMRAMU$<*6#@XE{Jz@2uDeS6(FU`8mgE@uk`ob>R3Br&-P$#Me(xfxUm)?^1fl;j~O*S>>6$^E@5ZWoA0$fr)fZYTX2xW36#yFJBSf zaCXOZkZWmut>I~Y@e2!=r@JH59i8J{K}q8U%Y5I<8*D%N-;e_U+HHw5akA)Q*ppuE~g!B$U@tJj@2LJzou4-e_;RdF;yGor~#-=Dfy) za+}9J7P#khXfyc+QOwJla?$Y-4SEk8EM+soAIxeU-JH%@!2(m+Gj#p0bK5U@LcbRU z=ZWNw)!m*HxGiNkvM(hB2irMLMq(?zT zFYvW%-{4eS-3{$ey=`wYPCBh$e$vnoDXAioZtNP-ti2PY@=Ct>jGLlj!}}qRLP?`V zHPN}A2bP_2x*_rw{g=w>PcbJi@JsiA+kwXkS- zKxZwvDq+&dV7uqjby-pfZdS_pfqFzh6^Yp@Uf{mlDEY;z;|aq8PV(+>qM|r|MFuoP*JNLQI{Pg?0gpu0{Af<;GBWncK`EUO@%;aeh$bvM5M2fM8U)~INyyM7CbVdSSM za2X0m+DLlD6Bw#&DjC|6J(?|tdZ?z=`0b{+Io}aQhd>TE!V+G3pJe#z8xk8`FtRZo z+AiI3vFMIKrjTiF_gY%R>Sl-bmo}yZ-ynOChz55Hc?tqnN01aKn z<7Srf1F2u$lT@#h1n<9>f>A8uiV9sEt$uiPjU6TP|rAvv-i#nN7k>0i&bf3?2~ zQ$?dxQD~?C-sV!xN7lCmxcpYS{YeyW0HTWKKEt@fPAMw(+V%BY&N~8jSw1yyK4Dp5 z>uVzH!U!Bqv(1NHw$=&JH!;@T-rs(xovV*#QDUVAR>TD;$d~doJ-$ D)oK3m literal 1572 zcmb7Ddr%W+5MM$fHb6m0f}-GsHza|?K*S76&>#s93y2_!JM(M}<@zNnpION*lE-htEckN(k{z5Dj|+x_kDx8L37 z^m$3{OkXAdxGNR%Ok4@_9`B4#`MxdPxX_Cd(h>lUyze@qW{{g2MP?d+Aq2o^26%=c z;{$*)A;2RQfV2_7N7sBZBMyL;nVy=JhzSr_2n7xZ)kB~bB5S}i0t99d7(rAIp{2k# zLS!xQDnM}(MDIcHa^RaF+yLQa;2sJQ2JlS=&MXk`fXQl_kcK2{fM5N30`8hgWK6~!+(jDbL{U{FLLI3H9f65ryN*;!CQ$g; zh%^cxWk%LP$ZD##j#N4t=dC9dAnVK74_G{gjFd+CAmEspUo}M> z)2r^a;3cMzQ7>lJK!9q@2`VC;Q6mLX5=cH24(U+Lkr=YV!=kqA^(>qxPIAU{5uwb2@yt`IWH09l|5@>V?Kg7 z9F7=q;vD>_&gnDf%_qOE|9{aNu6%dtqU~^P3X9SH@~KVjHr(ptR(Su%=jXlu%JKCJ z)7>9ZBorChpEg`xE7KBP?zz&vrcV83 z4%Y>1HYw!^S+PADl`2~Nl~qp5zAibwX6Vh-Ubpnl{s;Prez9MlIN8yDv@aXz{<{|s ztYuG`HSq9)Dc`iwBh=>*ttdY}K0d$d#1^A$Wfmjh40q2Sb>9RbV@F2Zr_6vh6YW%m z$Y01lGD2%)PNdsES2O#)&DJnaj?x^iNal3ym2DF<4iGW!O|+8D`o`*QsVn)+py75E z^XTe*)(-A;j|0SMneSHGld}Ph)diDsQyHbf`>j?!Z&!{iBRwN`!8`L8<#>o&_hd{E zMCMs6mOM*e$>r}4nWszc+`jeu-14M@N15^j9|^<%hna_xx3l(NFWwsR@a~Oxb$^h5 z+0wn&RK~=M_rm8NOly)&bunl-$F1 zE&sOhK&R@~U?5>F*w5Wmd~A7)g=UZOWEAIEjKgt{uiJBoE-TmTOWL@O`X-5eL1*g; z?c?J_5aZ5ewov!6;n$lT#nX9Lebx^>xpTV8VXE2aHVKAq+F~DQWJ!2T!TQ97`a-o{ zE7g>0ae-;VX+nWWBoIbtiDIQ<5gJb@k_v?>vaZV43f^5+xNOO~|1OaFRi43u97EPZ zeWtpc(3P%QvTTKx(67^JiDf#y24HQoeb8-uNp@J+w{P|IDu2!d=Rns;jjMN{cghDW zXKzAoj6PTB9N3;k^xV99-qvfIVsq&+Dq52x;gQb-{ow4F53vO(6X(ef&sJ6c1D169 AmH+?% diff --git a/public/favicon.ico b/public/favicon.ico index 7c6dbee1d8d3af9dd51ebeedc3e528758473acf8..a12072882c1985346af4a9710910586f19ff66a2 100644 GIT binary patch literal 12014 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 literal 15086 zcmdU$d2m(r6~|8qF`X`k%6m~jh~)BXVxND*WiGDKnsNp3&q<^9r|mwVs6_q|+v zKIY`y`@6sMJKuBe`JLZ#e~9EszD%Dk@R&4D6ZwLO#A3<&F(U6$HU_TG7mpTMPlYn- zAR==iEl>QW4zO(hE-96Q)p03lsFGV7t7OgED*5T^%7nVWO-CMi?_0%Ndv_N%^?A|T z(XD6h46MK=u&i9p0q^DOs^y9GHL@4_@Sz&9pk8da#a7k#W#rMr^NXAMt>PyvZ))mm z^xbeu#rjIQ=)r1v49q8zm=(97oW>9K>FcYd)rQyLHautX6XS8> z`29~F*mD*?@xBu5eIG~sfbzf?1lp+k&W%1GD_^6n|>{)9C#>^YiaAU;LyOPPgaG@oQ-3*hhfh z*wcmnCyA|#+%Tpq&jI`iJFwxe^pTQuSe>5b3Vwb6*zjli#5gCMZe_WIKWW3pWdZV2 zuHh#~9Vg#@&CTDb&ZG)b(6Xh=u2X9hl*7~NO`sR!)zqzYa&Pm1Ube|!9 zT|Xwq-&GZoZ)i2w_wnu@sE`PG@pf!!#}41PO9_}31if3Fr75G zf^cN-O~vYTA13~#rBX;N{5A+~QA)^}sU@>Wp%)bA#DUFC+`l!uL<95@~PnXK{#b6unC?2)@bm88 zAT}qY!)$++OZau1AnvcTQ;-au5E=VHGN2FO3H|Uo)o0_@z`e1<*j1P;pESVp)DL=2D+XN#4W85DELYGU zbMy0wi|-L5TcAG@8#P{SL^d70jPJgCIKOlN+Ha$Fu6OXgccNDt^>Ha6CT}J_UnADd zJf#aPmwU-ZHXXZ`b6=-j&Q9&;yjLt;8_ex=FJcvXQ}-18>c1u%{pkK7x}Cn$hpr!= z&%oyg&~MiFb{?w!JEqAfY=6u}x8ev@KjTXb+xKLz|7e=`-|rfK`2I$8r&~+-vwvgz zh0(`9m=pcQsd*_hpZi;)n@>8f_wc>f`3hh9)Ag-%&+vUy8sF>t?*Zel@Y7QGavLop zFWdv&#`tvw?{PAH*w=RzgNL&TdOjnQ{X2XA(CMSlW682$~0ucX5erhfG)7xUs zw#7SG=cS)IuW=UVGj`p2JrerKy(_%*V|L=ZW!hifo`DLpgzb-=eX)pcMt4~p#xb><3 zL-N1`bxjufb$maBzIP4jJ-WT}o*4&slBXQc()qMM z?Ys5xy`FdmPw|b*ao!oSezp54UB|lF9)kYFJb~DFmGN#KdnvAV8%+3r zG_kpfcc^2So-q$XZ)xAh&R3!5(YcPf&Ns0+V%m4(*6!XytEjiIAL@m=p^ibatd1hf zYAb{!50W~l7McVVwH38MiGPLsO;U&L+LTdG>kr7OthQmbv1OzC6gn8hpgc1@^Efq& zjb+&TOK2yymLod&i*D|$VeNf@wf{-z6#ESi3_j!n*>aUj_Lbw@582O%KHhl=GAI7O zchFyNLI= zHN=PR{Slw@c(0LHrhwSlTx;all9yvFSywT&t|Ap>ZMpijkzk`k=NqQe{ yrz7Cd*n1oL8M0M&+0J&6_WdHQN?fDqMn)_N-G(`=-oY- zgH|$vfJs|TzHDO~$%2^x!$kTw4Y)tz7Ljt$`TyCLK|_3(oBiFQm`c2^NT`VH)Sn7Z z5HQV6Jb{lihp^b+fTkY!3cUzFo_h$rVA#Xbt=08ABC{VLuE~IY8^{g4b)2P}=f2?{t2p

LBN&-IJB~R5p|qn%Nxh5e?@ExgYQp}Fs534P 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 O!Ub(+Yg%o5E%HCe-S;X0 diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg index 1b52f7e7dc..f44b83bd2d 100644 --- a/public/safari-pinned-tab.svg +++ b/public/safari-pinned-tab.svg @@ -2,20 +2,20 @@ -Created by potrace 1.11, written by Peter Selinger 2001-2013 +Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - + diff --git a/public/site.webmanifest b/public/site.webmanifest index de65106f48..8af025f70d 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -3,13 +3,8 @@ "short_name": "", "icons": [ { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-256x256.png", - "sizes": "256x256", + "src": "/android-chrome-144x144.png", + "sizes": "144x144", "type": "image/png" } ], From e355197bf88e2bd1e0e9cdb0d8ba1813815ce870 Mon Sep 17 00:00:00 2001 From: aaronskiba Date: Thu, 29 Aug 2024 15:46:31 -0600 Subject: [PATCH 14/14] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3efed4395b..e1898ed39b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ ### Changed + - Update Favicons and Associated HTML Code [#873](https://github.com/portagenetwork/roadmap/pull/873) + - Drop Sessions Table and Delete `lib/tasks/sessions.rake` [#859](https://github.com/portagenetwork/roadmap/pull/859) ### Fixed