From d45f0d0f801c1abeb8eb03f13dd37c073b2c7add Mon Sep 17 00:00:00 2001 From: "Chris Baudouin, Jr" Date: Thu, 17 Dec 2020 20:28:27 -0500 Subject: [PATCH 1/6] feat: Allows agreements to be fully customizable --- .../manage/agreements_controller.rb | 26 ++++++------------- app/models/agreement.rb | 6 +++-- app/views/manage/agreements/_form.html.haml | 2 +- app/views/manage/agreements/index.html.haml | 4 +-- config/locales/en.yml | 2 +- .../20201130220942_create_agreements.rb | 2 +- ...201218010133_convert_agreements_to_text.rb | 6 +++++ db/schema.rb | 4 +-- .../manage/agreements_controller_test.rb | 7 +---- test/factories/agreement.rb | 2 +- test/models/agreement_test.rb | 4 +-- 11 files changed, 29 insertions(+), 36 deletions(-) create mode 100644 db/migrate/20201218010133_convert_agreements_to_text.rb diff --git a/app/controllers/manage/agreements_controller.rb b/app/controllers/manage/agreements_controller.rb index 1eb815535..2e7422714 100644 --- a/app/controllers/manage/agreements_controller.rb +++ b/app/controllers/manage/agreements_controller.rb @@ -20,27 +20,17 @@ def edit # POST /agreements def create - if !agreement_params['agreement_url'].start_with?('http://', 'https://') - flash[:alert] = "Agreement URL must start with http:// or https://" - redirect_to new_manage_agreement_path - else - @agreement = Agreement.new(agreement_params) - @agreement.save - flash[:notice] = "#{@agreement.name} was successfully created." - redirect_to manage_agreements_path - end + @agreement = Agreement.new(agreement_params) + @agreement.save + flash[:notice] = "#{@agreement.name} was successfully created." + redirect_to manage_agreements_path end # PATCH/PUT /agreements/1 def update - if !agreement_params['agreement_url'].nil? && !agreement_params['agreement_url'].start_with?('http://', 'https://') - flash[:alert] = "Agreement URL must start with http:// or https://" - redirect_to edit_manage_agreement_url - else - @agreement.update_attributes(agreement_params) - flash[:notice] = nil - redirect_to manage_agreements_path - end + @agreement.update_attributes(agreement_params) + flash[:notice] = nil + redirect_to manage_agreements_path end # DELETE /agreements/1 @@ -60,7 +50,7 @@ def set_agreement # Only allow a trusted parameter "white list" through. def agreement_params params.require(:agreement).permit( - :name, :agreement_url + :name, :agreement ) end end diff --git a/app/models/agreement.rb b/app/models/agreement.rb index 1bafec138..37adfbf59 100644 --- a/app/models/agreement.rb +++ b/app/models/agreement.rb @@ -1,13 +1,15 @@ class Agreement < ApplicationRecord include ActionView::Helpers::UrlHelper validates_presence_of :name - validates_presence_of :agreement_url + validates_presence_of :agreement strip_attributes has_and_belongs_to_many :questionnaires def formatted_agreement - "

I read and accept the #{link_to name, agreement_url, target: '_blank'} agreement.

".html_safe + markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true) + + markdown.render(agreement).html_safe end end diff --git a/app/views/manage/agreements/_form.html.haml b/app/views/manage/agreements/_form.html.haml index beaf45816..386df6190 100644 --- a/app/views/manage/agreements/_form.html.haml +++ b/app/views/manage/agreements/_form.html.haml @@ -4,7 +4,7 @@ .form-inputs = f.input :name - = f.input :agreement_url, hint: "Should be a full https:// URL to a web page or .pdf file", label: t(:agreement_url, scope: 'pages.manage.agreements') + = f.input :agreement, label: t(:agreement, scope: 'pages.manage.agreements'), input_html: { rows: 10, 'data-simple-mde' => '1' } .form-actions = f.button :submit, class: 'btn-primary' diff --git a/app/views/manage/agreements/index.html.haml b/app/views/manage/agreements/index.html.haml index 1907f6f36..be0c560ac 100644 --- a/app/views/manage/agreements/index.html.haml +++ b/app/views/manage/agreements/index.html.haml @@ -12,7 +12,7 @@ %th = t(:name, scope: 'pages.manage.agreements') %th - = t(:agreement_url, scope: 'pages.manage.agreements') + = t(:agreement, scope: 'pages.manage.agreements') %tbody - @agreements.each do |agreement| @@ -25,4 +25,4 @@ %strong = agreement.name %td - = agreement.agreement_url + = markdown(agreement.agreement) diff --git a/config/locales/en.yml b/config/locales/en.yml index 2ec73ca7e..fb1e03052 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -192,7 +192,7 @@ en: title: Legal Agreements notice: "These are legal agreements that are required to be reviewed and agreed upon by all applicants of %{hackathon_name}." name: Name - agreement_url: Agreement URL + agreement: Agreement new: New Agreement edit: Edit Agreement settings: diff --git a/db/migrate/20201130220942_create_agreements.rb b/db/migrate/20201130220942_create_agreements.rb index df59f3d59..665ef00bb 100644 --- a/db/migrate/20201130220942_create_agreements.rb +++ b/db/migrate/20201130220942_create_agreements.rb @@ -2,7 +2,7 @@ class CreateAgreements < ActiveRecord::Migration[5.2] def change create_table :agreements do |t| t.string :name - t.string :agreement_url + t.string :agreement t.timestamps end end diff --git a/db/migrate/20201218010133_convert_agreements_to_text.rb b/db/migrate/20201218010133_convert_agreements_to_text.rb new file mode 100644 index 000000000..75db066c9 --- /dev/null +++ b/db/migrate/20201218010133_convert_agreements_to_text.rb @@ -0,0 +1,6 @@ +class ConvertAgreementsToText < ActiveRecord::Migration[5.2] + def change + change_column :agreements, :agreement_url, :text + rename_column :agreements, :agreement_url, :agreement + end +end diff --git a/db/schema.rb b/db/schema.rb index 5d5d5831b..4515dc4ff 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: 2020_12_09_053827) do +ActiveRecord::Schema.define(version: 2020_12_18_010133) do create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name", null: false @@ -35,7 +35,7 @@ create_table "agreements", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" - t.string "agreement_url" + t.text "agreement" t.datetime "created_at", null: false t.datetime "updated_at", null: false end diff --git a/test/controllers/manage/agreements_controller_test.rb b/test/controllers/manage/agreements_controller_test.rb index 9cc4d441b..75fc3a928 100644 --- a/test/controllers/manage/agreements_controller_test.rb +++ b/test/controllers/manage/agreements_controller_test.rb @@ -191,7 +191,7 @@ class Manage::AgreementsControllerTest < ActionController::TestCase end should "create a new agreement" do - post :create, params: { agreement: { name: "Fun Agreement", agreement_url: "https://foo.com" } } + post :create, params: { agreement: { name: "Fun Agreement", agreement: "Please read and accept https://foo.com" } } assert_response :redirect end @@ -206,11 +206,6 @@ class Manage::AgreementsControllerTest < ActionController::TestCase assert_redirected_to manage_agreements_path end - should "enforce agreement_url to be a link" do - patch :update, params: { id: @agreement, agreement: { name: "New agreement Name", agreement_url: "hello" } } - assert_response :redirect - end - context "#destroy" do should "destroy agreement" do assert_difference("Agreement.count", -1) do diff --git a/test/factories/agreement.rb b/test/factories/agreement.rb index ad1d8909c..bbe59cc70 100644 --- a/test/factories/agreement.rb +++ b/test/factories/agreement.rb @@ -1,6 +1,6 @@ FactoryBot.define do factory :agreement do name { "HackFoo Agreement" } - agreement_url { "https://www.foo.com" } + agreement { "Please read and accept https://www.foo.com" } end end diff --git a/test/models/agreement_test.rb b/test/models/agreement_test.rb index 2ffddab95..ee09a3ae2 100644 --- a/test/models/agreement_test.rb +++ b/test/models/agreement_test.rb @@ -4,10 +4,10 @@ class AgreementTest < ActiveSupport::TestCase should have_and_belong_to_many :questionnaires should strip_attribute :name - should strip_attribute :agreement_url + should strip_attribute :agreement should validate_presence_of :name - should validate_presence_of :agreement_url + should validate_presence_of :agreement should "not allow questionnaires to accept agreements for others" do @questionnaire1 = create(:questionnaire) From 16cc0c0009365bf878905384c1393a9e88df9ba4 Mon Sep 17 00:00:00 2001 From: "Chris Baudouin, Jr" Date: Thu, 17 Dec 2020 20:49:22 -0500 Subject: [PATCH 2/6] fix: Fixes broken migrations --- db/migrate/20201130220942_create_agreements.rb | 2 +- db/migrate/20201218010133_convert_agreements_to_text.rb | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/db/migrate/20201130220942_create_agreements.rb b/db/migrate/20201130220942_create_agreements.rb index 665ef00bb..df59f3d59 100644 --- a/db/migrate/20201130220942_create_agreements.rb +++ b/db/migrate/20201130220942_create_agreements.rb @@ -2,7 +2,7 @@ class CreateAgreements < ActiveRecord::Migration[5.2] def change create_table :agreements do |t| t.string :name - t.string :agreement + t.string :agreement_url t.timestamps end end diff --git a/db/migrate/20201218010133_convert_agreements_to_text.rb b/db/migrate/20201218010133_convert_agreements_to_text.rb index 75db066c9..e193888ed 100644 --- a/db/migrate/20201218010133_convert_agreements_to_text.rb +++ b/db/migrate/20201218010133_convert_agreements_to_text.rb @@ -1,6 +1,11 @@ class ConvertAgreementsToText < ActiveRecord::Migration[5.2] - def change - change_column :agreements, :agreement_url, :text + def self.up + change_column :agreements, :agreement, :text rename_column :agreements, :agreement_url, :agreement end + + def self.down + rename_column :agreements, :agreement, :agreement_url + change_column :agreements, :agreement, :sring + end end From 8bd454609fe88dbb5ecab6ad514e3704e34f23af Mon Sep 17 00:00:00 2001 From: "Chris Baudouin, Jr" Date: Thu, 17 Dec 2020 21:16:15 -0500 Subject: [PATCH 3/6] fix: Migrations misname issue --- ...0201218010133_convert_agreements_to_text.rb | 4 ++-- db/schema.rb | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/db/migrate/20201218010133_convert_agreements_to_text.rb b/db/migrate/20201218010133_convert_agreements_to_text.rb index e193888ed..81200ef7e 100644 --- a/db/migrate/20201218010133_convert_agreements_to_text.rb +++ b/db/migrate/20201218010133_convert_agreements_to_text.rb @@ -1,11 +1,11 @@ class ConvertAgreementsToText < ActiveRecord::Migration[5.2] def self.up - change_column :agreements, :agreement, :text + change_column :agreements, :agreement_url, :text rename_column :agreements, :agreement_url, :agreement end def self.down rename_column :agreements, :agreement, :agreement_url - change_column :agreements, :agreement, :sring + change_column :agreements, :agreement_url, :sring end end diff --git a/db/schema.rb b/db/schema.rb index 4515dc4ff..f50a277c0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -73,7 +73,9 @@ t.integer "query_id" t.text "statement" t.string "data_source" - t.datetime "created_at" + t.timestamp "created_at" + t.index ["query_id"], name: "index_blazer_audits_on_query_id" + t.index ["user_id"], name: "index_blazer_audits_on_user_id" end create_table "blazer_checks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| @@ -84,9 +86,11 @@ t.text "emails" t.string "check_type" t.text "message" - t.datetime "last_run_at" + t.timestamp "last_run_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["creator_id"], name: "index_blazer_checks_on_creator_id" + t.index ["query_id"], name: "index_blazer_checks_on_query_id" end create_table "blazer_dashboard_queries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| @@ -95,6 +99,8 @@ t.integer "position" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["dashboard_id"], name: "index_blazer_dashboard_queries_on_dashboard_id" + t.index ["query_id"], name: "index_blazer_dashboard_queries_on_query_id" end create_table "blazer_dashboards", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| @@ -102,6 +108,7 @@ t.text "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["creator_id"], name: "index_blazer_dashboards_on_creator_id" end create_table "blazer_queries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| @@ -112,6 +119,7 @@ t.string "data_source" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["creator_id"], name: "index_blazer_queries_on_creator_id" end create_table "bus_lists", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| @@ -151,9 +159,9 @@ t.string "subject" t.string "recipients" t.text "body" - t.datetime "queued_at" - t.datetime "started_at" - t.datetime "delivered_at" + t.timestamp "queued_at" + t.timestamp "started_at" + t.timestamp "delivered_at" t.datetime "created_at" t.datetime "updated_at" t.string "template", default: "default" From 13c10760d12c3dd2efba18e276364f4a504099d0 Mon Sep 17 00:00:00 2001 From: "Chris Baudouin, Jr" Date: Thu, 17 Dec 2020 21:58:22 -0500 Subject: [PATCH 4/6] feat: Forces agreement links to open in new tab --- app/models/agreement.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/agreement.rb b/app/models/agreement.rb index 37adfbf59..962a86ea3 100644 --- a/app/models/agreement.rb +++ b/app/models/agreement.rb @@ -9,7 +9,6 @@ class Agreement < ApplicationRecord def formatted_agreement markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true) - - markdown.render(agreement).html_safe + markdown.render(agreement).gsub(" Date: Fri, 18 Dec 2020 01:27:13 -0500 Subject: [PATCH 6/6] refactor: Removes old input hint --- config/locales/en.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index fb1e03052..e942e663f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -54,8 +54,6 @@ en: trigger: Sent automatically when a new or updated applicant matches this criteria. Does not send to anyone already matching this criteria. school: is_home: The "home" school is separated from all other schools on dashboard metrics. - agreement: - name: 'Agreements are displayed to applicants as: "I read & accept the [agreement_name] agreement"' hackathon_config: accepting_questionnaires: Specify and allow questionnaires to be accepted. digital_hackathon: Optimize HackathonManager for a digital hackathon. (Removes travel, dietary restrictions, etc.)