From bee8ee7563bd129318a8a9f84ec6041c51ddbc40 Mon Sep 17 00:00:00 2001 From: Peter Kos Date: Sun, 20 Sep 2020 23:27:16 -0400 Subject: [PATCH 1/5] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 09167ae2020f4a6abc213b3986e42cf522e59bb9 Author: JeremyRudman <38338616+JeremyRudman@users.noreply.github.com> Date: Sun Sep 20 04:23:15 2020 -0400 fix(questionnaire): added phone number requirements (#283) * fix(questionnaire): added phone number requirement using a regex to require users to input a valid phone number and stripped non numbers from the stored value with the exception of the country code * fix(questionnaire): edited callback to pass test edit call back that removes non-numbers from phone number to pass testing * fix(questionnaire): edited test to fail with phone formatting edited test to fail if the phone # formating is still there when saved into the database. Also stopped exception for "+" as it was not necessary. * fix(questionnaire): fixed comment about phone number stripping * fix: houndci formatting comments * fix: earlier fix was incorrect. correct houndci fix * fix(phone): implmented changed phone number regex for validation implement suggested regex although made internation extention 3 instead of 2 digits long for max length * fix(questionnaire): added support for more international numbers made the numbers regex more flexable to support more international numbers such as in Nigeria with two digit area codes. * Phone validation hit, remove duplicate check Co-authored-by: Chris Baudouin, Jr Co-authored-by: Peter Kos commit c9d6658e3c7e163b562aa6d2aa00c48d73080cd4 Author: JeremyRudman <38338616+JeremyRudman@users.noreply.github.com> Date: Sun Sep 20 04:09:39 2020 -0400 fix: School text-box dropdown in manage/questionnaires/edit missing background (#296) * fix(questionnaire): fixed background in school autocomplete fixed the questionnaire edit page so that it was blank in the management edit page * fix(questionnaire): sperated autocomplete sass into its own file seperated the sass for the autocomplete into its own file so that manage could use it without the other sass in forms.sass * Use grays for manage backgrouind Co-authored-by: Chris Baudouin, Jr Co-authored-by: Peter Kos commit 113cd6166f4b8a91e28d7d540c296eb03d1e6274 Author: Chris Baudouin, Jr Date: Sun Sep 20 03:55:37 2020 -0400 fix: Fixes failing test cases from #242 (#364) commit 58b58492cc2a37555c05c222ef69670023e4716f Author: Peter Kos Date: Sun Sep 20 03:01:47 2020 -0400 refactor: Renames user roles, improves security commit 1daa9432daa3abb1545ed1b2401ef50aabc9a543 Author: Peter Kos Date: Sun Sep 20 02:57:01 2020 -0400 Organizers have same overview page access as direc commit cdf57b6157bd1c92a9a5493a88cbef785a7e97a5 Author: Peter Kos Date: Sun Sep 20 02:56:41 2020 -0400 Volunteers are redirected to checkin route commit 3f2a30c2006178e4e2a96ceed9a0c03aa04ad136 Merge: b5ad3b8 d87269d Author: Chris Baudouin, Jr Date: Sun Sep 20 00:30:03 2020 -0400 Merge branch '2.0' into hm-242 commit b5ad3b88c8f5aae6f472513576def99fe3a93572 Author: Jeremy Rudman Date: Sat Sep 19 21:03:08 2020 -0400 fix(sidebar): fixed UI problems for diffrent roles removed the duplicate checkin button for orginizers and had checkin page defaut to be highlighted for volenteers commit 057e3aada84802684f8cda587a64d06176801a82 Merge: 971dd0a 69e8d6e Author: Chris Baudouin, Jr Date: Mon Sep 14 16:43:59 2020 -0400 Merge branch '2.0' into hm-242 commit 971dd0a5a9f69005994af6102f612fdacd4e4a4c Author: Chris Baudouin, Jr Date: Mon Sep 14 16:37:18 2020 -0400 refactor: Increases funciton clarity commit 711aeea81dc70dce3ff244f326df31a6ceed0486 Author: Chris Baudouin, Jr Date: Mon Sep 14 16:35:56 2020 -0400 refactor: Increases funciton clarity commit 19f19266f66425d80d6fdd6666879b8cc5d6167d Author: Chris Baudouin, Jr Date: Sat Sep 12 00:46:52 2020 -0400 fix: Hound issues v1 commit c3d44f0b8c1e9002af458f5163bc5874bfe530b6 Merge: 2ab8865 a767446 Author: Chris Baudouin, Jr Date: Sat Sep 12 00:32:30 2020 -0400 Merge branch '2.0' into hm-242 commit 2ab8865d27e065e450de4a602dea52250fc22080 Author: Chris Baudouin, Jr Date: Sat Sep 12 00:29:43 2020 -0400 refactor: Cleans tests, improves coverage commit 59d54edbcb084379685d8b788edc59b786e49bda Merge: 274787f cb16869 Author: Chris Baudouin, Jr Date: Mon Sep 7 00:11:19 2020 -0400 Merge branch '2.0' into hm-242 commit 274787f339c30f8644f2fb0171983caca1c13dbb Author: Chris Baudouin, Jr Date: Sun Sep 6 23:59:27 2020 -0400 refactor: Renames event_tracking to Volunteer commit 873e43c70d11bf161e5bf9d47ed8ed0f4abccdaf Author: Chris Baudouin, Jr Date: Sun Sep 6 23:48:29 2020 -0400 refactor: Renames admin_limited_access to Organizer commit f592750a6f8e17507c6cf9e7df20ae65e5d8a55d Author: Chris Baudouin, Jr Date: Sun Sep 6 19:38:54 2020 -0400 refactor: Changes admin to director commit 0237965aa3376d921fc28b3ca969de899f24faba Author: Peter Kos Date: Sun Sep 20 02:27:55 2020 -0400 fix: Text centering on application page (#361) * Fix bug * Long containers are left aligned,not centernewline commit 28913f7499b43ba92e5e7774d07932085be3d7ec Author: JeremyRudman <38338616+JeremyRudman@users.noreply.github.com> Date: Sun Sep 20 02:16:29 2020 -0400 fix(bus_captain): Alerts admins if a bus captain is removed (#270) * fix(bus_captain): alerts admins if a bus captain is removed if a bus captain changes bus or declinces a rsvp he is removed as a bus captain. All admins are alerted to the removal of a bus captain by email * fix: corrected houndci formating errors * Refactor var names; remove auto captain interest * On questnnre destroy, email admins if bus captain * Don’t send email remove_captain on first bus assignment * Tests! * bark bark Co-authored-by: Chris Baudouin, Jr Co-authored-by: Peter Kos commit d87269d20b4a72fac6fba18198ab8953e0b5f7d7 Author: David Quach Date: Sun Sep 20 00:13:52 2020 -0400 feat: Automatically remind people to RSVP (#175) * feat: add rsvp reminder email to trigger and automation process based on loose rules * feat: add the rsvp reminder email to queue_reminder_email class * fix: fix issue with hound * fix: resolve issues with linting and fix conditionals * fix: more linting issues * fix: more more linting issues * seperate the two functions * update on per Stuart instruction, make this more automated * forgot to commit this * remove this unnecessary piece of code * fix linting issues * remove since we are not using this * Update app/models/user.rb Co-Authored-By: Stuart Olivera * forgot to add end * resolve for hound * fix(dashboard): Fixes security vulnerability that allowed event_tracking role to access Dashboard (#215) * chore(release): 1.22.3 [skip ci] ## [1.22.3](https://github.com/codeRIT/hackathon-manager/compare/v1.22.2...v1.22.3) (2020-05-16) ### Bug Fixes * **dashboard:** Fixes security vulnerability that allowed event_tracking role to access Dashboard ([#215](https://github.com/codeRIT/hackathon-manager/issues/215)) ([](https://github.com/codeRIT/hackathon-manager/commit/74a40ad)) ### Styles * **check-in:** Changes table header to be more descriptive ([#207](https://github.com/codeRIT/hackathon-manager/issues/207)) ([](https://github.com/codeRIT/hackathon-manager/commit/889fbd0)) * **config:** Removes unused event_is_over flag ([#208](https://github.com/codeRIT/hackathon-manager/issues/208)) ([](https://github.com/codeRIT/hackathon-manager/commit/0c73e66)) * build(deps): Upgrade yarn (#212) * build(deps): Upgrade yarn * build(deps): Upgrade gems * build(deps): Remove obsolete gems * v0.0.0 * build(deps): Update semantic-release * fix(questionnaire): visual bug in school autocomplete school dropdown the css was set for an "a" tag when the list was made up of divs so I switched the css to work for the "div" tag in the autocomplete * fix(questionnaire): visual bug in school autocomplete school dropdown the css was set for an "a" tag when the list was made up of divs so I switched the css to work for the "div" tag in the autocomplete. I also hide a element that was not present earlier * build(deps): Upgrades Rails to 5.2.4.3 * build(deps): Upgrades gems Co-authored-by: Jeremy Rudman * fix: Fixes date issue with RSVP reminder job * fix: Fixes bug where message would not send * refactor: Change subject of RSVP reminder * refactor: Verbage changes, updated reminder message * 2.0: Removes SparkPost mentions for 2.0 * fix: Fixes timezone issues * fix: More timezone issues Co-authored-by: Stuart Olivera Co-authored-by: Chris Baudouin, Jr Co-authored-by: semantic-release-bot Co-authored-by: Jeremy Rudman Co-authored-by: Chris Baudouin, Jr commit 2e9379fe8c5d998b36263c668257162e9f4bddf2 Author: Peter Kos Date: Sat Sep 19 22:31:18 2020 -0400 fix: Hackathon names now consistently on newline, wrapping is centered (#358) * Hackthon name title page has newline * Make houndbot happy --- .../javascripts/manage/lib/setupDataTables.js | 2 +- app/assets/javascripts/validate.js | 9 ++ app/assets/stylesheets/application.sass | 1 + .../stylesheets/forms/_autocomplete.sass | 24 +++ app/assets/stylesheets/forms/_forms.sass | 29 +--- app/assets/stylesheets/manage.sass | 4 + .../stylesheets/manage/_autocomplete.sass | 12 ++ .../manage/application_controller.rb | 23 +-- app/controllers/manage/configs_controller.rb | 5 +- .../manage/dashboard_controller.rb | 3 +- .../manage/data_exports_controller.rb | 3 +- app/controllers/manage/messages_controller.rb | 7 +- .../manage/questionnaires_controller.rb | 7 + app/controllers/manage/stats_controller.rb | 1 + .../manage/trackable_events_controller.rb | 15 +- .../manage/trackable_tags_controller.rb | 3 - app/controllers/manage/users_controller.rb | 8 +- app/controllers/questionnaires_controller.rb | 8 +- app/controllers/rsvps_controller.rb | 15 ++ app/datatables/questionnaire_datatable.rb | 4 +- ...{admin_datatable.rb => staff_datatable.rb} | 4 +- app/jobs/bulk_message_job.rb | 8 +- ...port_job.rb => staff_weekly_report_job.rb} | 4 +- app/mailers/mail_preview.rb | 4 +- .../{admin_mailer.rb => staff_mailer.rb} | 15 +- app/mailers/user_mailer.rb | 9 +- app/models/message.rb | 1 + app/models/questionnaire.rb | 21 +++ app/models/user.rb | 16 +- app/views/devise/passwords/edit.html.haml | 2 +- app/views/devise/passwords/new.html.haml | 2 +- app/views/devise/registrations/new.html.haml | 2 +- app/views/devise/sessions/new.html.haml | 2 +- app/views/layouts/_header.html.haml | 4 +- .../layouts/manage/_page_title.html.haml | 2 +- .../layouts/manage/application.html.haml | 64 ++++---- ..._mailer.html.erb => staff_mailer.html.erb} | 0 .../_questionnaire_datatable.html.haml | 2 +- app/views/manage/bus_lists/show.html.haml | 4 +- .../messages/_message_template_status.haml | 2 +- app/views/manage/messages/index.html.haml | 2 +- .../manage/questionnaires/show.html.haml | 4 +- .../manage/trackable_events/index.html.haml | 2 +- .../manage/trackable_tags/show.html.haml | 2 +- app/views/manage/users/index.html.haml | 2 +- app/views/questionnaires/_form.html.haml | 2 +- .../staff_mailer/bus_captain_left.html.haml | 1 + .../weekly_report.haml | 0 config/initializers/doorkeeper.rb | 2 +- config/locales/en.yml | 2 +- config/routes.rb | 14 +- config/schedule.yml | 4 +- .../questionnaire--rsvp_reminder.md | 12 ++ db/seeds.rb | 2 + docs/api-testing-setup.md | 6 +- docs/deployment-dokku.md | 4 +- docs/deployment-okd.md | 6 +- docs/messages.md | 2 +- test/controllers/bus_lists_controller_test.rb | 6 +- .../manage/bus_lists_controller_test.rb | 76 ++++++++- .../manage/checkins_controller_test.rb | 37 +---- .../manage/configs_controller_test.rb | 44 +++++- .../manage/dashboard_controller_test.rb | 145 +++++++++++++++++- .../manage/messages_controller_test.rb | 110 ++++++++++++- .../manage/questionnaires_controller_test.rb | 98 ++++++++++-- .../manage/schools_controller_test.rb | 75 ++++++++- .../manage/stats_controller_test.rb | 57 ++++++- .../trackable_events_controller_test.rb | 14 +- .../manage/trackable_tags_controller_test.rb | 14 +- .../manage/users_controller_test.rb | 76 +++++++-- .../questionnaires_controller_test.rb | 22 ++- test/controllers/rsvps_controller_test.rb | 39 ++++- ...in_mailer_test.rb => staff_mailer_test.rb} | 16 +- test/controllers/user_mailer_test.rb | 13 ++ test/factories/users.rb | 19 ++- test/integration/user_flows_test.rb | 6 +- ...est.rb => staff_weekly_report_job_test.rb} | 4 +- test/models/questionnaire_test.rb | 6 +- test/models/user_test.rb | 52 ++++++- vendor/cache/puma-4.3.4.gem | Bin 0 -> 174592 bytes 80 files changed, 1066 insertions(+), 283 deletions(-) create mode 100644 app/assets/stylesheets/forms/_autocomplete.sass create mode 100644 app/assets/stylesheets/manage/_autocomplete.sass rename app/datatables/{admin_datatable.rb => staff_datatable.rb} (94%) rename app/jobs/{admin_weekly_report_job.rb => staff_weekly_report_job.rb} (71%) rename app/mailers/{admin_mailer.rb => staff_mailer.rb} (79%) rename app/views/layouts/{admin_mailer.html.erb => staff_mailer.html.erb} (100%) create mode 100644 app/views/staff_mailer/bus_captain_left.html.haml rename app/views/{admin_mailer => staff_mailer}/weekly_report.haml (100%) create mode 100644 db/seed_messages/questionnaire--rsvp_reminder.md rename test/controllers/{admin_mailer_test.rb => staff_mailer_test.rb} (68%) rename test/jobs/{admin_weekly_report_job_test.rb => staff_weekly_report_job_test.rb} (74%) create mode 100644 vendor/cache/puma-4.3.4.gem diff --git a/app/assets/javascripts/manage/lib/setupDataTables.js b/app/assets/javascripts/manage/lib/setupDataTables.js index ad23dfdf8..f9418bc3c 100644 --- a/app/assets/javascripts/manage/lib/setupDataTables.js +++ b/app/assets/javascripts/manage/lib/setupDataTables.js @@ -36,7 +36,7 @@ var setupDataTables = function () { ], }); - $('.datatable.admins').DataTable({ + $('.datatable.staff').DataTable({ order: [2, 'asc'], columns: [ { orderable: true, data: 'id', visible: false }, diff --git a/app/assets/javascripts/validate.js b/app/assets/javascripts/validate.js index 6eec34797..8da91b2f8 100644 --- a/app/assets/javascripts/validate.js +++ b/app/assets/javascripts/validate.js @@ -40,6 +40,15 @@ document.addEventListener('turbolinks:load', function() { } } break; + case 'phone': + if (value) { + var phoneReg = /^[\+]?[0-9]{0,3}[-\s\.]?[(]?[0-9]{1,3}[)]?[-\s\.]?[0-9]{1,3}[-\s\.]?[0-9]{4,6}$/; + if (!phoneReg.test(value)) { + notify(this, 'Please enter a valid phone number'); + success = false; + } + } + break; case 'file-max-size': if ( this.files && diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass index bf1d19b10..3a4b95ddb 100644 --- a/app/assets/stylesheets/application.sass +++ b/app/assets/stylesheets/application.sass @@ -25,6 +25,7 @@ @import general/table @import forms/forms @import forms/confirmation +@import forms/autocomplete @import general/theming-editor diff --git a/app/assets/stylesheets/forms/_autocomplete.sass b/app/assets/stylesheets/forms/_autocomplete.sass new file mode 100644 index 000000000..05e044650 --- /dev/null +++ b/app/assets/stylesheets/forms/_autocomplete.sass @@ -0,0 +1,24 @@ + +// jquery ui override +.ui-autocomplete + @include css4 + background: var(--input--background--focus) + border: 1px solid var(--input--border-color--focus) + color: var(--input--text--focus) + list-style: none + padding: 0 + .ui-menu-item div + padding: 2px 5px + display: block + cursor: pointer + overflow: hidden + text-overflow: ellipsis + white-space: nowrap + &:hover + @include css4 + background: var(--primary) + @include css4 + color: var(--white) +// needed for ellipsis in text to work and acts as a min-width +.ui-menu + width: 50px diff --git a/app/assets/stylesheets/forms/_forms.sass b/app/assets/stylesheets/forms/_forms.sass index 547db9e6e..f3f635423 100644 --- a/app/assets/stylesheets/forms/_forms.sass +++ b/app/assets/stylesheets/forms/_forms.sass @@ -61,6 +61,11 @@ hr .btn margin-bottom: 30px +.text-overflow-center + text-align: center + display: flex + justify-content: center + .simple_form @include css4 color: var(--grey) @@ -253,30 +258,6 @@ input[type=submit] margin-bottom: 3px -// jquery ui override -.ui-autocomplete - @include css4 - background: var(--input--background--focus) - border: 1px solid var(--input--border-color--focus) - color: var(--input--text--focus) - list-style: none - padding: 0 - .ui-menu-item div - padding: 2px 5px - display: block - cursor: pointer - overflow: hidden - text-overflow: ellipsis - white-space: nowrap - &:hover - @include css4 - background: var(--primary) - @include css4 - color: var(--white) -// needed for ellipsis in text to work and acts as a min-width -.ui-menu - width: 50px - // form wizard .wizard-stage display: none diff --git a/app/assets/stylesheets/manage.sass b/app/assets/stylesheets/manage.sass index e08c1596e..087c35ffa 100644 --- a/app/assets/stylesheets/manage.sass +++ b/app/assets/stylesheets/manage.sass @@ -3,6 +3,9 @@ @import manage/selectize-fix @import vendor/simplemde.min @import vendor/codemirror +@import general/variables +@import general/css4 +@import manage/autocomplete $grey-dark: #555 $grey-med: #999 @@ -172,6 +175,7 @@ $grey-med: #999 .sidebar-mobile .sidebar-sticky height: auto + /* * Datatable changes */ diff --git a/app/assets/stylesheets/manage/_autocomplete.sass b/app/assets/stylesheets/manage/_autocomplete.sass new file mode 100644 index 000000000..f5e716fea --- /dev/null +++ b/app/assets/stylesheets/manage/_autocomplete.sass @@ -0,0 +1,12 @@ + +@import ../forms/autocomplete + +// jquery ui override +.ui-autocomplete + background: white + border: 1px solid #333 + color: #222 + .ui-menu-item div + &:hover + background: #999 + color: white diff --git a/app/controllers/manage/application_controller.rb b/app/controllers/manage/application_controller.rb index d2cbc8e72..111f68f62 100644 --- a/app/controllers/manage/application_controller.rb +++ b/app/controllers/manage/application_controller.rb @@ -1,27 +1,30 @@ class Manage::ApplicationController < ApplicationController before_action :logged_in - before_action :require_admin_or_limited_admin - before_action :limit_write_access_to_admins, only: ["edit", "update", "new", "create", "destroy", "deliver", "merge", "perform_merge", "toggle_bus_captain", "duplicate", "update_acc_status", "send_update_email", "live_preview"] + before_action :require_director_or_organizer_or_volunteer + before_action :limit_write_access_to_directors, only: ["edit", "update", "new", "create", "destroy", "deliver", "merge", "perform_merge", "toggle_bus_captain", "duplicate", "update_acc_status", "send_update_email", "live_preview"] skip_before_action :verify_authenticity_token, if: :json_request? def logged_in authenticate_user! end - def require_full_admin - return redirect_to root_path unless current_user.try(:admin?) + def require_director + return redirect_to manage_checkins_path if current_user.volunteer? + return redirect_to manage_root_path if current_user.organizer? + return redirect_to root_path unless current_user.try(:director?) end - def require_admin_or_limited_admin - return redirect_to root_path unless current_user.try(:admin?) || current_user.try(:admin_limited_access?) + def require_director_or_organizer + return redirect_to manage_checkins_path if current_user.volunteer? + return redirect_to root_path unless current_user.organizing_staff? end - def require_admin_or_limited_admin_or_event_tracking - redirect_to root_path unless current_user.try(:admin?) || current_user.try(:admin_limited_access?) || current_user.try(:event_tracking?) + def require_director_or_organizer_or_volunteer + redirect_to root_path unless current_user.staff? end - def limit_write_access_to_admins - redirect_to url_for(controller: controller_name, action: :index) unless current_user.try(:admin?) + def limit_write_access_to_directors + redirect_to url_for(controller: controller_name, action: :index) unless current_user.try(:director?) end def json_request? diff --git a/app/controllers/manage/configs_controller.rb b/app/controllers/manage/configs_controller.rb index e5d8eedc9..e7b9884de 100644 --- a/app/controllers/manage/configs_controller.rb +++ b/app/controllers/manage/configs_controller.rb @@ -1,5 +1,5 @@ class Manage::ConfigsController < Manage::ApplicationController - before_action :limit_access_admin + before_action :require_director before_action :get_config, only: [:edit, :update, :update_only_css_variables] respond_to :html, :json @@ -69,7 +69,4 @@ def get_config end end - def limit_access_admin - redirect_to root_path unless current_user.admin? - end end diff --git a/app/controllers/manage/dashboard_controller.rb b/app/controllers/manage/dashboard_controller.rb index 7b2f822e0..96dcd0f65 100644 --- a/app/controllers/manage/dashboard_controller.rb +++ b/app/controllers/manage/dashboard_controller.rb @@ -1,6 +1,5 @@ class Manage::DashboardController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin + before_action :require_director_or_organizer def index end diff --git a/app/controllers/manage/data_exports_controller.rb b/app/controllers/manage/data_exports_controller.rb index a20b89db8..4142d1d9d 100644 --- a/app/controllers/manage/data_exports_controller.rb +++ b/app/controllers/manage/data_exports_controller.rb @@ -1,6 +1,5 @@ class Manage::DataExportsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_full_admin + before_action :require_director before_action :set_data_export, only: [:destroy] diff --git a/app/controllers/manage/messages_controller.rb b/app/controllers/manage/messages_controller.rb index 245e2b07f..e84908fd4 100644 --- a/app/controllers/manage/messages_controller.rb +++ b/app/controllers/manage/messages_controller.rb @@ -1,7 +1,8 @@ class Manage::MessagesController < Manage::ApplicationController + before_action :require_director_or_organizer before_action :set_message, only: [:show, :edit, :update, :destroy, :deliver, :preview, :duplicate] before_action :check_message_access, only: [:edit, :update, :destroy] - before_action :limit_template_access_to_admins, only: [:template, :template_preview, :template_update, :template_replace_with_default] + before_action :limit_template_access_to_directors, only: [:template, :template_preview, :template_update, :template_replace_with_default] respond_to :html, :json @@ -106,9 +107,9 @@ def template_replace_with_default private - def limit_template_access_to_admins + def limit_template_access_to_directors # From Manage::ApplicationController - limit_write_access_to_admins + limit_write_access_to_directors end def message_params diff --git a/app/controllers/manage/questionnaires_controller.rb b/app/controllers/manage/questionnaires_controller.rb index 4edb31cc0..ce2ed1218 100644 --- a/app/controllers/manage/questionnaires_controller.rb +++ b/app/controllers/manage/questionnaires_controller.rb @@ -96,6 +96,13 @@ def check_in end def destroy + if @questionnaire.is_bus_captain + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy respond_with(:manage, @questionnaire) end diff --git a/app/controllers/manage/stats_controller.rb b/app/controllers/manage/stats_controller.rb index 459285f71..5426424e1 100644 --- a/app/controllers/manage/stats_controller.rb +++ b/app/controllers/manage/stats_controller.rb @@ -1,4 +1,5 @@ class Manage::StatsController < Manage::ApplicationController + before_action :require_director_or_organizer respond_to :html, :json diff --git a/app/controllers/manage/trackable_events_controller.rb b/app/controllers/manage/trackable_events_controller.rb index 1bd812fb5..28cb7059b 100644 --- a/app/controllers/manage/trackable_events_controller.rb +++ b/app/controllers/manage/trackable_events_controller.rb @@ -1,9 +1,6 @@ class Manage::TrackableEventsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin_or_event_tracking - before_action :set_trackable_event, only: [:show, :edit, :update, :destroy] - before_action :scope_limited_admin_access, only: [:edit, :update, :destroy] + before_action :scope_organizer_access, only: [:edit, :update, :destroy] respond_to :html, :json @@ -81,13 +78,13 @@ def trackable_event_params params.require(:trackable_event).permit(:band_id, :trackable_tag_id) end - # Permit limited-access admins (overrides Manage::ApplicationController#limit_write_access_to_admins) - def limit_write_access_to_admins + # Permit limited-access directors (overrides Manage::ApplicationController#limit_write_access_to_directors) + def limit_write_access_to_directors end - # If the user isn't a full admin, scope changes only to those they created - def scope_limited_admin_access - return if current_user.admin? || @trackable_event.blank? || @trackable_event.user.blank? + # If the user isn't a director, scope changes only to those they created + def scope_organizer_access + return if current_user.director? || @trackable_event.blank? || @trackable_event.user.blank? redirect_to manage_trackable_events_path, notice: 'You may not view events you did not create.' if @trackable_event.user != current_user end end diff --git a/app/controllers/manage/trackable_tags_controller.rb b/app/controllers/manage/trackable_tags_controller.rb index 525643772..852ea9f5d 100644 --- a/app/controllers/manage/trackable_tags_controller.rb +++ b/app/controllers/manage/trackable_tags_controller.rb @@ -1,7 +1,4 @@ class Manage::TrackableTagsController < Manage::ApplicationController - skip_before_action :require_admin_or_limited_admin - before_action :require_admin_or_limited_admin_or_event_tracking - before_action :set_trackable_tag, only: [:show, :edit, :update, :destroy] respond_to :html, :json diff --git a/app/controllers/manage/users_controller.rb b/app/controllers/manage/users_controller.rb index e64fad0e0..e5d743166 100644 --- a/app/controllers/manage/users_controller.rb +++ b/app/controllers/manage/users_controller.rb @@ -1,19 +1,19 @@ class Manage::UsersController < Manage::ApplicationController - before_action :require_full_admin + before_action :require_director before_action :find_user, only: [:show, :edit, :update, :destroy] respond_to :html, :json def index - respond_with(:manage, User.where(role: [:admin, :admin_limited_access, :event_tracking])) + respond_with(:manage, User.where(role: [:director, :organizer, :volunteer])) end def user_datatable render json: UserDatatable.new(params, view_context: view_context) end - def admin_datatable - render json: AdminDatatable.new(params, view_context: view_context) + def staff_datatable + render json: StaffDatatable.new(params, view_context: view_context) end def show diff --git a/app/controllers/questionnaires_controller.rb b/app/controllers/questionnaires_controller.rb index 190acbac9..3cb3763b6 100644 --- a/app/controllers/questionnaires_controller.rb +++ b/app/controllers/questionnaires_controller.rb @@ -94,8 +94,14 @@ def update # DELETE /apply # DELETE /apply.json def destroy - @questionnaire.destroy + if @questionnaire.is_bus_captain + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy respond_to do |format| format.html { redirect_to questionnaires_url } format.json { head :no_content } diff --git a/app/controllers/rsvps_controller.rb b/app/controllers/rsvps_controller.rb index 32cfc9881..85a61defd 100644 --- a/app/controllers/rsvps_controller.rb +++ b/app/controllers/rsvps_controller.rb @@ -43,6 +43,10 @@ def deny # rubocop:disable CyclomaticComplexity # rubocop:disable PerceivedComplexity def update + # save to check if bus status changes after rsvp + bus = @questionnaire.bus_list_id + acc_status = @questionnaire.acc_status + unless @questionnaire.update_attributes(params.require(:questionnaire).permit(:agreement_accepted, :phone)) flash[:alert] = @questionnaire.errors.full_messages.join(", ") redirect_to rsvp_path @@ -58,6 +62,17 @@ def update update_acc_status update_bus_list + bus_after_rsvp = @questionnaire.bus_list_id + acc_status_after_rsvp = @questionnaire.acc_status + + if bus != nil && (acc_status != acc_status_after_rsvp || bus != bus_after_rsvp) && @questionnaire.is_bus_captain == true + @questionnaire.is_bus_captain = false + directors = User.where(role: :director) + directors.each do |user| + StaffMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + unless @questionnaire.save flash[:alert] = @questionnaire.errors.full_message.join(", ") redirect_to rsvp_path diff --git a/app/datatables/questionnaire_datatable.rb b/app/datatables/questionnaire_datatable.rb index 48f04cc8e..6ff70041c 100644 --- a/app/datatables/questionnaire_datatable.rb +++ b/app/datatables/questionnaire_datatable.rb @@ -35,7 +35,7 @@ def note(record) def bus_captain(record) return "No" unless record.bus_list_id? - return record.is_bus_captain? ? 'Yes' : "No" unless current_user.admin? + return record.is_bus_captain? ? 'Yes' : "No" unless current_user.director? if record.is_bus_captain? link_to("Remove", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "0"), method: "post", class: "text-danger") @@ -47,7 +47,7 @@ def bus_captain(record) def data records.map do |record| { - bulk: current_user.admin? ? "".html_safe : "", + bulk: current_user.director? ? "".html_safe : "", link: link_to(''.html_safe, manage_questionnaire_path(record)), note: note(record), id: record.id, diff --git a/app/datatables/admin_datatable.rb b/app/datatables/staff_datatable.rb similarity index 94% rename from app/datatables/admin_datatable.rb rename to app/datatables/staff_datatable.rb index d34cb8a61..01c39c922 100644 --- a/app/datatables/admin_datatable.rb +++ b/app/datatables/staff_datatable.rb @@ -1,4 +1,4 @@ -class AdminDatatable < ApplicationDatatable +class StaffDatatable < ApplicationDatatable def_delegators :@view, :link_to, :manage_user_path, :bold, :display_datetime def view_columns @@ -43,6 +43,6 @@ def data end def get_raw_records - User.where(role: [:admin, :admin_limited_access, :event_tracking]) + User.where(role: [:director, :organizer, :volunteer]) end end diff --git a/app/jobs/bulk_message_job.rb b/app/jobs/bulk_message_job.rb index 2989e6564..3af60748e 100644 --- a/app/jobs/bulk_message_job.rb +++ b/app/jobs/bulk_message_job.rb @@ -27,11 +27,11 @@ def self.build_recipients(recipient_types) def self.user_ids(type) case type when "all" - # Everyone, including admins that completed a questionnaire - User.non_admins.pluck(:id) + Questionnaire.pluck(:user_id) + # Everyone, including organizers that completed a questionnaire + User.non_organizer.pluck(:id) + Questionnaire.pluck(:user_id) when "incomplete" - # Incomplete applications, excluding admins that don't have a questionnaire - User.non_admins.pluck(:id) - Questionnaire.pluck(:user_id) + # Incomplete applications, excluding organizers that don't have a questionnaire + User.non_organizer.pluck(:id) - Questionnaire.pluck(:user_id) when "complete" Questionnaire.pluck(:user_id) when "accepted" diff --git a/app/jobs/admin_weekly_report_job.rb b/app/jobs/staff_weekly_report_job.rb similarity index 71% rename from app/jobs/admin_weekly_report_job.rb rename to app/jobs/staff_weekly_report_job.rb index 5c3f7b0c5..5e78e0fa7 100644 --- a/app/jobs/admin_weekly_report_job.rb +++ b/app/jobs/staff_weekly_report_job.rb @@ -1,11 +1,11 @@ -class AdminWeeklyReportJob < ApplicationJob +class StaffWeeklyReportJob < ApplicationJob queue_as :default def perform # Queue all eligible users and let the is_active (or other) logic determine if they should really receive it users = User.where(receive_weekly_report: true) users.each do |user| - AdminMailer.weekly_report(user.id).deliver_later + StaffMailer.weekly_report(user.id).deliver_later end end end diff --git a/app/mailers/mail_preview.rb b/app/mailers/mail_preview.rb index d29bda648..18d63abf8 100644 --- a/app/mailers/mail_preview.rb +++ b/app/mailers/mail_preview.rb @@ -5,8 +5,8 @@ def bulk_message_email UserMailer.bulk_message_email(message, User.first.id) end - def admin_weekly_report - AdminMailer.weekly_report(User.first.id) + def staff_weekly_report + StaffMailer.weekly_report(User.first.id) end end end diff --git a/app/mailers/admin_mailer.rb b/app/mailers/staff_mailer.rb similarity index 79% rename from app/mailers/admin_mailer.rb rename to app/mailers/staff_mailer.rb index 2fd2d8bb6..5c08c4cd9 100644 --- a/app/mailers/admin_mailer.rb +++ b/app/mailers/staff_mailer.rb @@ -1,8 +1,8 @@ -class AdminMailer < ApplicationMailer +class StaffMailer < ApplicationMailer include Roadie::Rails::Automatic add_template_helper(HackathonManagerHelper) - layout "admin_mailer" + layout "staff_mailer" def weekly_report(user_id) # Don't send emails more than 7 days after event starts @@ -42,6 +42,17 @@ def weekly_report(user_id) ) end + def bus_captain_left(bus_list_id, former_captain_id, user_id) + @bus_route = BusList.find_by_id(bus_list_id) + @former_captain = User.find_by_id(former_captain_id) + @user = User.find_by_id(user_id) + + mail( + to: pretty_email(@user.full_name, @user.email), + subject: "Bus Captain Left Bus Route: " + @bus_route.name, + ) + end + private def report_metric(query_base, new_query_field) diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 42cc88df2..ef1d03cf2 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -16,8 +16,15 @@ def bulk_message_email(message_id, user_id, message = nil, use_examples = false) def incomplete_reminder_email(user_id) @user = User.find_by_id(user_id) - return if @user.blank? || @user.admin? || @user.questionnaire || Time.now.to_date > Date.parse(HackathonConfig["last_day_to_apply"]) + return if @user.blank? || @user.director? || @user.questionnaire || Time.now.in_time_zone.to_date > Date.parse(HackathonConfig["last_day_to_apply"]).in_time_zone.to_date Message.queue_for_trigger("user.24hr_incomplete_application", @user.id) end + + def rsvp_reminder_email(user_id) + @user = User.find_by_id(user_id) + return if @user.blank? || !@user.questionnaire.acc_status == "accepted" || Time.now.in_time_zone.to_date > Date.parse(HackathonConfig["event_start_date"]).in_time_zone.to_date + + Message.queue_for_trigger("questionnaire.rsvp_reminder", @user.id) + end end diff --git a/app/models/message.rb b/app/models/message.rb index f98ee83bf..a25dfec09 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -37,6 +37,7 @@ class Message < ApplicationRecord "questionnaire.late_waitlist" => "Questionnaire Status: Waitlisted, Late", "questionnaire.rsvp_confirmed" => "Questionnaire Status: RSVP Confirmed", "questionnaire.rsvp_denied" => "Questionnaire Status: RSVP Denied", + "questionnaire.rsvp_reminder" => "Questionnaire: RSVP Reminder", "user.24hr_incomplete_application" => "User: Incomplete application (24 hours later)", "bus_list.new_captain_confirmation" => "Bus List: New captain confirmation", "bus_list.notes_update" => "Bus List: Updated notes (manually triggered)" diff --git a/app/models/questionnaire.rb b/app/models/questionnaire.rb index 973b96dad..1cb47671e 100644 --- a/app/models/questionnaire.rb +++ b/app/models/questionnaire.rb @@ -10,6 +10,7 @@ class Questionnaire < ApplicationRecord before_validation :clean_negative_dietary_restrictions after_create :queue_triggered_email_create after_update :queue_triggered_email_update + after_update :queue_triggered_email_rsvp_reminder after_save :update_school_questionnaire_count after_destroy :update_school_questionnaire_count @@ -137,6 +138,12 @@ def vcs_url=(value) super value end + def phone=(value) + # strips the string to just numbers for standardization + value = value.try(:tr, '^0-9', '') + super value + end + def school School.find(school_id) if school_id end @@ -249,4 +256,18 @@ def queue_triggered_email_update def queue_triggered_email_create Message.queue_for_trigger("questionnaire.#{acc_status}", user_id) end + + def queue_triggered_email_rsvp_reminder + if saved_change_to_acc_status? && acc_status == "accepted" + days_remaining = Date.parse(HackathonConfig["event_start_date"]).in_time_zone.to_date - Time.now.in_time_zone.to_date + if days_remaining > 14 + deliver_date = 7.days.from_now + elsif days_remaining > 10 + deliver_date = 5.days.from_now + elsif days_remaining > 3 + deliver_date = 2.days.from_now + end + UserMailer.rsvp_reminder_email(user_id).deliver_later(wait_until: deliver_date) if deliver_date.present? + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 3b5de0bd2..00f16f4d6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,7 +23,7 @@ class User < ApplicationRecord after_create :queue_reminder_email after_initialize :set_default_role, if: :new_record? - enum role: { user: 0, event_tracking: 1, admin_limited_access: 2, admin: 3 } + enum role: { user: 0, volunteer: 1, organizer: 2, director: 3 } def set_default_role self.role ||= :user @@ -56,6 +56,14 @@ def full_name "#{first_name} #{last_name}" end + def staff? + director? || organizer? || volunteer? + end + + def organizing_staff? + director? || organizer? + end + def self.from_omniauth(auth) matching_provider = where(provider: auth.provider, uid: auth.uid) matching_email = where(email: auth.info.email) @@ -75,11 +83,11 @@ def self.from_omniauth(auth) current_user end - def self.non_admins - User.where.not(role: :admin).where.not(role: :admin_limited_access) + def self.non_organizer + User.where.not(role: :director).where.not(role: :organizer) end def self.without_questionnaire - non_admins.left_outer_joins(:questionnaire).where(questionnaires: { id: nil }) + non_organizer.left_outer_joins(:questionnaire).where(questionnaires: { id: nil }) end end diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml index 76f92f72b..4a866a98e 100644 --- a/app/views/devise/passwords/edit.html.haml +++ b/app/views/devise/passwords/edit.html.haml @@ -2,7 +2,7 @@ .form-container.password .section-title.center Change Your - %span.emphasized Password + .emphasized Password = simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| = f.error_notification = f.input :reset_password_token, as: :hidden diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml index 18281428a..b856f1727 100644 --- a/app/views/devise/passwords/new.html.haml +++ b/app/views/devise/passwords/new.html.haml @@ -2,6 +2,6 @@ .form-container.password %h1.section-title.center Reset Your - %span.emphasized Password + .emphasized Password = render 'form' diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index e0e19883e..50d55651b 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -2,7 +2,7 @@ .form-container.signup %h1.section-title.center Register for - %span.emphasized= HackathonConfig['name'] + .emphasized.text-overflow-center= HackathonConfig['name'] - if !HackathonConfig['accepting_questionnaires'] || HackathonConfig['disclaimer_message'].present? #disclaimer diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index 822d2b20f..b9bb3896c 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -2,5 +2,5 @@ .form-container.login %h1.section-title.center Sign in to - %span.emphasized= HackathonConfig['name'] + .emphasized.text-overflow-center= HackathonConfig['name'] = render 'form' diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index a44fe61d7..91427e44d 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -10,6 +10,8 @@ = btn_link_to "Home", homepage_url .header-nav - if user_signed_in? - - if current_user.admin? or current_user.admin_limited_access? + - if current_user.organizing_staff? = btn_link_to "Manage", manage_root_path + - elsif current_user.volunteer? + = btn_link_to "Manage", manage_checkins_path = btn_link_to "Sign Out", destroy_user_session_path, method: :delete diff --git a/app/views/layouts/manage/_page_title.html.haml b/app/views/layouts/manage/_page_title.html.haml index 4affee59c..d4b2a0e3c 100644 --- a/app/views/layouts/manage/_page_title.html.haml +++ b/app/views/layouts/manage/_page_title.html.haml @@ -4,5 +4,5 @@ - if defined?(subtitle) && subtitle.present? %small.text-muted= subtitle - - if current_user.try(:admin?) + - if current_user.try(:director?) = yield diff --git a/app/views/layouts/manage/application.html.haml b/app/views/layouts/manage/application.html.haml index 730a76151..c529658dd 100644 --- a/app/views/layouts/manage/application.html.haml +++ b/app/views/layouts/manage/application.html.haml @@ -28,20 +28,32 @@ %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted %span = t(:overview, scope: 'layouts.manage.navigation') - %ul.nav.flex-column.mb-2 - %li.nav-item - = active_link_to manage_root_path, class: "nav-link", active_children: false do - .fa.fa-area-chart.fa-fw.icon-space-r-half - = t(:title, scope: 'pages.manage.dashboard') - %li.nav-item - = active_link_to manage_questionnaires_path, class: "nav-link" do - .fa.fa-inbox.fa-fw.icon-space-r-half - = t(:title, scope: 'pages.manage.questionnaires') - %li.nav-item - = active_link_to manage_messages_path, class: "nav-link" do - .fa.fa-bullhorn.fa-fw.icon-space-r-half - = t(:title, scope: 'pages.manage.messages') + - if current_user.organizing_staff? + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_root_path, class: "nav-link", active_children: false do + .fa.fa-area-chart.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.dashboard') + %li.nav-item + = active_link_to manage_questionnaires_path, class: "nav-link" do + .fa.fa-inbox.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.questionnaires') + %li.nav-item + = active_link_to manage_messages_path, class: "nav-link" do + .fa.fa-bullhorn.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.messages') + - elsif current_user.volunteer? + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_checkins_path, class: "nav-link" do + .fa.fa-drivers-license-o.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.check-in') + %li.nav-item + = active_link_to manage_questionnaires_path, class: "nav-link" do + .fa.fa-inbox.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.questionnaires') + - if current_user.organizing_staff? %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted %span = t(:logistics, scope: 'layouts.manage.navigation') @@ -59,20 +71,20 @@ .fa.fa-tag.fa-fw.icon-space-r-half = t(:title, scope: 'pages.manage.trackable-tags') - %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted - %span - = t(:travel, scope: 'layouts.manage.navigation') - %ul.nav.flex-column.mb-2 - %li.nav-item - = active_link_to manage_bus_lists_path, class: "nav-link" do - .fa.fa-bus.fa-fw.icon-space-r-half - = t(:title, scope: 'pages.manage.bus-lists') - %li.nav-item - = active_link_to manage_schools_path, class: "nav-link" do - .fa.fa-home.fa-fw.icon-space-r-half - = t(:title, scope: 'pages.manage.schools') + %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted + %span + = t(:travel, scope: 'layouts.manage.navigation') + %ul.nav.flex-column.mb-2 + %li.nav-item + = active_link_to manage_bus_lists_path, class: "nav-link" do + .fa.fa-bus.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.bus-lists') + %li.nav-item + = active_link_to manage_schools_path, class: "nav-link" do + .fa.fa-home.fa-fw.icon-space-r-half + = t(:title, scope: 'pages.manage.schools') - - if current_user.admin? + - if current_user.director? %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted %span = t(:administration, scope: 'layouts.manage.navigation') diff --git a/app/views/layouts/admin_mailer.html.erb b/app/views/layouts/staff_mailer.html.erb similarity index 100% rename from app/views/layouts/admin_mailer.html.erb rename to app/views/layouts/staff_mailer.html.erb diff --git a/app/views/manage/application/_questionnaire_datatable.html.haml b/app/views/manage/application/_questionnaire_datatable.html.haml index 61f33683c..a985b3d44 100644 --- a/app/views/manage/application/_questionnaire_datatable.html.haml +++ b/app/views/manage/application/_questionnaire_datatable.html.haml @@ -19,7 +19,7 @@ %thead %tr %th{'data-table': { orderable: 'false', data: 'bulk', visible: bulk_actions ? 'true' : 'false' }} - - if current_user.admin? + - if current_user.director? %input{ type: "checkbox", name: "select_allc", value: "1", data: { bulk_row_select: "" } } %th{'data-table': { orderable: 'false', data: 'link', visible: visible.call('link', columns) }} %th{'data-table': { orderable: 'false', data: 'note', visible: visible.call('note', columns) }} diff --git a/app/views/manage/bus_lists/show.html.haml b/app/views/manage/bus_lists/show.html.haml index d13c65b9c..1bc51c05b 100644 --- a/app/views/manage/bus_lists/show.html.haml +++ b/app/views/manage/bus_lists/show.html.haml @@ -59,7 +59,7 @@ %th Email %th Phone Number %th School - - if current_user.admin? + - if current_user.director? %th Actions %tbody - @bus_list.passengers.select { |q| q.bus_captain_interest }.each do |p| @@ -70,7 +70,7 @@ %td= p.email %td= phone_link_to p.phone %td= link_to p.school.name, manage_school_path(p.school) - - if current_user.admin? + - if current_user.director? %td - if p.is_bus_captain? = link_to "Remove Bus Captain", toggle_bus_captain_manage_bus_list_path(@bus_list, questionnaire_id: p.id, bus_captain: '0'), method: 'post', class: 'text-danger' diff --git a/app/views/manage/messages/_message_template_status.haml b/app/views/manage/messages/_message_template_status.haml index 6677e267f..971ee2c82 100644 --- a/app/views/manage/messages/_message_template_status.haml +++ b/app/views/manage/messages/_message_template_status.haml @@ -5,7 +5,7 @@ %span.badge.badge-danger.mb-1 Using customized template %br Not in sync with HackathonManager - - if current_user.try(:admin?) + - if current_user.try(:director?) %br %small = link_to template_replace_with_default_manage_messages_path, method: :post, data: { confirm: 'Are you sure? This will permanently erase the existing template and replace it with the HackathonManager default. This action is irreversible.'} do diff --git a/app/views/manage/messages/index.html.haml b/app/views/manage/messages/index.html.haml index 7c8299518..8fd7b7a12 100644 --- a/app/views/manage/messages/index.html.haml +++ b/app/views/manage/messages/index.html.haml @@ -19,7 +19,7 @@ = render 'triggered_email_summary' -- if current_user.try(:admin?) +- if current_user.try(:director?) .mb-4 %h3.pb-2.mb-3.border-bottom#triggered-email-overview Message Template %p The message template is used for all outgoing emails. If desired, it may be customized to your needs. diff --git a/app/views/manage/questionnaires/show.html.haml b/app/views/manage/questionnaires/show.html.haml index 64960e699..eceae3356 100644 --- a/app/views/manage/questionnaires/show.html.haml +++ b/app/views/manage/questionnaires/show.html.haml @@ -9,7 +9,7 @@ = render 'check_in_badge' .btn-group{role: "group"} - - if current_user.admin? + - if current_user.director? = link_to 'Edit', edit_manage_questionnaire_path(@questionnaire), class: 'btn btn-sm btn-outline-secondary' = render 'overview' @@ -34,7 +34,7 @@ - else = "(no author)" = @questionnaire.acc_status_date ? display_datetime(@questionnaire.acc_status_date, in_sentence: true) : "(no date)" - - if current_user.admin? + - if current_user.director? = bs_vertical_simple_form @questionnaire, url: url_for(action: "update_acc_status", controller: "questionnaires") do |f| = f.input :acc_status, as: :select, collection: Questionnaire::POSSIBLE_ACC_STATUS.invert, include_blank: false, label: "Acceptance Status:", hint: "Updating this status may trigger an automatic email to the applicant - see #{link_to('messages', manage_messages_path(anchor: 'triggered-email-overview'))} for details.".html_safe = f.button :submit, value: "Update Status", class: 'btn-primary' diff --git a/app/views/manage/trackable_events/index.html.haml b/app/views/manage/trackable_events/index.html.haml index ae63ad9ca..8a4f51b77 100644 --- a/app/views/manage/trackable_events/index.html.haml +++ b/app/views/manage/trackable_events/index.html.haml @@ -28,7 +28,7 @@ %td= trackable_event.trackable_tag.name %td= trackable_event.user.email %td= link_to 'Show', manage_trackable_event_path(trackable_event) - - if current_user.admin? || current_user == trackable_event.user + - if current_user.director? || current_user == trackable_event.user %td= link_to 'Edit', edit_manage_trackable_event_path(trackable_event) %td= link_to 'Destroy', manage_trackable_event_path(trackable_event), method: :delete, data: { confirm: 'Are you sure?' } - else diff --git a/app/views/manage/trackable_tags/show.html.haml b/app/views/manage/trackable_tags/show.html.haml index c9ad2ece3..a25899c6f 100644 --- a/app/views/manage/trackable_tags/show.html.haml +++ b/app/views/manage/trackable_tags/show.html.haml @@ -34,7 +34,7 @@ %td= trackable_event.band_id %td= trackable_event.user.email %td - - if current_user.admin? || current_user == trackable_event.user + - if current_user.director? || current_user == trackable_event.user = link_to 'Edit', edit_manage_trackable_event_path(trackable_event) .row.mt-2.mb-4 diff --git a/app/views/manage/users/index.html.haml b/app/views/manage/users/index.html.haml index 6a0a96855..0b9b8a286 100644 --- a/app/views/manage/users/index.html.haml +++ b/app/views/manage/users/index.html.haml @@ -27,7 +27,7 @@ .col %h5.dashboard-container-title = t(:staff, scope: 'pages.manage.users', hackathon_name: HackathonConfig['name']) - %table.admins.datatable.table.table-striped.table-hover{ "data-source" => admin_datatable_manage_users_path(format: :json) } + %table.staff.datatable.table.table-striped.table-hover{ "data-source" => staff_datatable_manage_users_path(format: :json) } %thead %tr %th= t(:id, scope: 'pages.manage.users.table') diff --git a/app/views/questionnaires/_form.html.haml b/app/views/questionnaires/_form.html.haml index 4e8c45f8c..b895acebe 100644 --- a/app/views/questionnaires/_form.html.haml +++ b/app/views/questionnaires/_form.html.haml @@ -10,7 +10,7 @@ = markdown(HackathonConfig['disclaimer_message']) .form-inputs - = f.input :phone, label: "Phone number", input_html: { "data-validate" => "presence" } + = f.input :phone, label: "Phone number", input_html: { "data-validate" => ["presence", "phone"] } = f.input :date_of_birth, start_year: Date.today.year - 5, end_year: Date.today.year - 90, order: [:month, :day, :year], input_html: { "data-validate" => "presence" } = f.input :school_id, as: :school_selection, input_html: { "data-validate" => "presence" } diff --git a/app/views/staff_mailer/bus_captain_left.html.haml b/app/views/staff_mailer/bus_captain_left.html.haml new file mode 100644 index 000000000..7df0d04e8 --- /dev/null +++ b/app/views/staff_mailer/bus_captain_left.html.haml @@ -0,0 +1 @@ +%p Alert #{@former_captain.full_name} (#{@former_captain.email}) is no longer a bus captain for #{@bus_route.name} diff --git a/app/views/admin_mailer/weekly_report.haml b/app/views/staff_mailer/weekly_report.haml similarity index 100% rename from app/views/admin_mailer/weekly_report.haml rename to app/views/staff_mailer/weekly_report.haml diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 591199ccb..1109083b9 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -18,7 +18,7 @@ # every time somebody will try to access the admin web interface. admin_authenticator do if current_user - head :forbidden unless current_user.admin? || current_user.admin_limited_access? + head :forbidden unless current_user.director? || current_user.organizer? else redirect_to new_user_session_url end diff --git a/config/locales/en.yml b/config/locales/en.yml index 8e6b7835f..d3bd02c54 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -47,7 +47,7 @@ en: user: role: Limited access prevents the admin from adding, modifying, or deleting any records; modifications through the check-in process are allowed. Event tracking limits to only event tracking. is_active: Deactivating a user will prevent them from logging in. Their access will be immediately revoked from the admin and application pages. - receive_weekly_report: A weekly email report on admissions, bus lists, and messages. Only sent when there are weekly updates up until 7 days past the event. Disabled for inactive admins. + receive_weekly_report: A weekly email report on admissions, bus lists, and messages. Only sent when there are weekly updates up until 7 days past the event. Disabled for inactive staff members. message: type: Bulk emails are sent once, manually. Automated emails are sent upon a desired trigger/event. name: A friendly name to recognize this email. Applicants won't see this. diff --git a/config/routes.rb b/config/routes.rb index 44d89e523..9bf7f5c52 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,7 +19,7 @@ end end - authenticate :user, ->(u) { u.admin? } do + authenticate :user, ->(u) { u.director? } do mount Sidekiq::Web => "/sidekiq" mount Blazer::Engine, at: "blazer" end @@ -38,7 +38,15 @@ end namespace :manage do - root to: "dashboard#index" + authenticate :user, ->(u) { u.director? } do + root to: "dashboard#index" + end + authenticate :user, ->(u) { u.organizer? } do + root to: "dashboard#index" + end + authenticate :user, ->(u) { u.volunteer? } do + root to: "checkins#index" + end resources :dashboard do get :map_data, on: :collection get :todays_activity_data, on: :collection @@ -63,7 +71,7 @@ end resources :users do post :user_datatable, on: :collection - post :admin_datatable, on: :collection + post :staff_datatable, on: :collection patch :reset_password, on: :member end resources :messages do diff --git a/config/schedule.yml b/config/schedule.yml index 7035ecc3f..520cc4fe0 100644 --- a/config/schedule.yml +++ b/config/schedule.yml @@ -1,3 +1,3 @@ -admin_weekly_report: +staff_weekly_report: cron: '0 8 * * MON' - class: 'AdminWeeklyReportJob' + class: 'StaffWeeklyReportJob' diff --git a/db/seed_messages/questionnaire--rsvp_reminder.md b/db/seed_messages/questionnaire--rsvp_reminder.md new file mode 100644 index 000000000..ad7577856 --- /dev/null +++ b/db/seed_messages/questionnaire--rsvp_reminder.md @@ -0,0 +1,12 @@ +## Missing RSVP + +
+

Are you coming to {{hackathon_name}}?

+

Let us know if we should expect you there!

+

+ Yes, I will Attend » + No, I Can't Attend » +
+ Link not working? Go to {{rsvp_url}} +

+
\ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index 28ce41ec8..b72203e26 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -15,6 +15,7 @@ "questionnaire.accepted" => "You've been accepted!", "questionnaire.denied" => "Your application status", "questionnaire.rsvp_confirmed" => "RSVP Confirmation", + "questionnaire.rsvp_reminder" => "Are you coming to #{HackathonConfig['name']}?", "user.24hr_incomplete_application" => "Incomplete application", "bus_list.new_captain_confirmation" => "You're a bus captain!", "bus_list.update_notes" => "Bus Update" @@ -25,6 +26,7 @@ "questionnaire.accepted" => "Accepted email", "questionnaire.denied" => "Denied email", "questionnaire.rsvp_confirmed" => "RSVP confirmed email", + "questionnaire.rsvp_reminder" => "RSVP Reminder", "user.24hr_incomplete_application" => "Incomplete application (24-hour reminder)", "bus_list.new_captain_confirmation" => "New bus captain confirmation", "bus_list.update_notes" => "Bus list update" diff --git a/docs/api-testing-setup.md b/docs/api-testing-setup.md index 03e33e690..c4767b5a0 100644 --- a/docs/api-testing-setup.md +++ b/docs/api-testing-setup.md @@ -9,7 +9,7 @@ These programs allow you to run API requests (`GET`, `POST`, and so on) in an is In order to make requests in either Postman or Paw, you need to setup _OAuth 2 authorization_, as in HackathonManager, each request needs to be authorized first. This guide discusses how to enable OAuth 2 for these apps. -This guide assumes you have already setup an admin account on a local HackathonManager instance. For more details on this, see the [main README](https://github.com/codeRIT/hackathon-manager#local-development). +This guide assumes you have already setup an account with Director status on a local HackathonManager instance. For more details on this, see the [main README](https://github.com/codeRIT/hackathon-manager#local-development). > To make API requests on a live/remote instance, simply replace `localhost` in all following commands with your HackathonManager's URL. @@ -27,7 +27,7 @@ Select an app below to jump directly to its guide: ## Connecting with Postman -In HackathonManager, sign in to your admin account and click "Manage". Then, at the bottom left of the sidebar, click the **Doorkeeper** tab. +In HackathonManager, sign in to your staff account and click "Manage". Then, at the bottom left of the sidebar, click the **Doorkeeper** tab. @@ -47,7 +47,7 @@ On this screen, fill out the information but with your own keys from the image a -You should get a popup with your hackathon's sign in screen. Type in your admin credentials and log in. +You should get a popup with your hackathon's sign in screen. Type in your staff credentials and log in. On the next screen, select `Authorize`: diff --git a/docs/deployment-dokku.md b/docs/deployment-dokku.md index 6d68570f1..0b080214d 100644 --- a/docs/deployment-dokku.md +++ b/docs/deployment-dokku.md @@ -107,14 +107,14 @@ dokku letsencrypt hm - Deploy should succeed without any red flags in the build log - Should be able to submit an application on the website & receive an immediate confirmation email -### Promote account to admin +### Promote account to director ```bash dokku enter hm web # Wait for a bash shell to start... $ bin/rails c # Wait for the Rails console to start... -User.find_by(email: "your-email@example.com").update_attribute(:role, :admin) +User.find_by(email: "your-email@example.com").update_attribute(:role, :director) exit exit ``` diff --git a/docs/deployment-okd.md b/docs/deployment-okd.md index 69c00fcf8..23468082f 100644 --- a/docs/deployment-okd.md +++ b/docs/deployment-okd.md @@ -152,7 +152,7 @@ spec: 1. Seed the database (schools, emails, etc) -- do this **before** you create your first user 2. Apply as a hacker -3. Manually promote your (first) account to an admin +3. Manually promote your (first) account to a director 4. Configure your hackathon ### Seed the database @@ -170,7 +170,7 @@ exit 1. Open your hackathon's website, create an account, and complete an application 2. Validate that you received a confirmation email (if you didn't, don't fix it now, but take note for later) -### Manually promote your account to admin status +### Manually promote your account to director status 1. On the OKD website, navigate to the currently-running HackathonManager pod (Applications -> Pods -> Click the HM pod in the list) 2. In the tab bar, click "Terminal" @@ -178,7 +178,7 @@ exit ```bash bin/rails c # Wait for the Rails console to start... -User.find_by(email: "your-email@example.com").update_attribute(:role, :admin) +User.find_by(email: "your-email@example.com").update_attribute(:role, :director) exit exit ``` diff --git a/docs/messages.md b/docs/messages.md index 9131d1553..c47392f52 100644 --- a/docs/messages.md +++ b/docs/messages.md @@ -53,7 +53,7 @@ Automated emails can also be sent out upon certain events happening. All events * **Questionnaire status** — Upon being accepted, denied, RSVP'd, etc * **Bust list** — Becoming a passenger or bus captain -These messages are sent immediatley upon an applicant entering the given state. For example, when an admin marks someone as "accepted," they will immediately receive any automated messages associated with the "Questionnaire Status: Accepted" event. +These messages are sent immediatley upon an applicant entering the given state. For example, when a staff member marks someone as "accepted," they will immediately receive any automated messages assocaited with the "Questionnaire Status: Accepted" event. ## Message formatting diff --git a/test/controllers/bus_lists_controller_test.rb b/test/controllers/bus_lists_controller_test.rb index c32066764..e50ecd7fc 100644 --- a/test/controllers/bus_lists_controller_test.rb +++ b/test/controllers/bus_lists_controller_test.rb @@ -19,7 +19,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated without a questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] @user = create(:user, email: "newabc@example.com") sign_in @user end @@ -37,7 +37,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated with a questionnaire but no bus list" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") end @@ -55,7 +55,7 @@ class BusListsControllerTest < ActionController::TestCase context "while authenticated with a questionnaire with a bus list" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") @bus_list = create(:bus_list) diff --git a/test/controllers/manage/bus_lists_controller_test.rb b/test/controllers/manage/bus_lists_controller_test.rb index c03b743b8..1d12d9363 100644 --- a/test/controllers/manage/bus_lists_controller_test.rb +++ b/test/controllers/manage/bus_lists_controller_test.rb @@ -137,10 +137,76 @@ class Manage::BusListsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_bus_lists#index" do + get :index + assert_response :success + end + + should "allow access to manage_bus_lists#show" do + get :show, params: { id: @bus_list } + assert_response :success + end + + should "not allow access to manage_bus_lists#new" do + get :new + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#edit" do + get :edit, params: { id: @bus_list } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#create" do + post :create, params: { bus_list: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#update" do + patch :update, params: { id: @bus_list, bus_list: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#toggle_bus_captain" do + questionnaire = create(:questionnaire) + assert_difference "enqueued_jobs.size", 0 do + patch :toggle_bus_captain, params: { id: @bus_list, questionnaire_id: questionnaire.id, bus_captain: "1" } + end + assert_equal false, questionnaire.reload.is_bus_captain + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#send_update_email" do + assert_difference "enqueued_jobs.size", 0 do + patch :send_update_email, params: { id: @bus_list } + end + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + + should "not allow access to manage_bus_lists#destroy" do + patch :destroy, params: { id: @bus_list } + assert_response :redirect + assert_redirected_to manage_bus_lists_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -203,9 +269,9 @@ class Manage::BusListsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/checkins_controller_test.rb b/test/controllers/manage/checkins_controller_test.rb index 58d2f6df3..6b92b4276 100644 --- a/test/controllers/manage/checkins_controller_test.rb +++ b/test/controllers/manage/checkins_controller_test.rb @@ -15,7 +15,7 @@ class Manage::CheckinsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end end @@ -43,7 +43,7 @@ class Manage::CheckinsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -52,42 +52,17 @@ class Manage::CheckinsControllerTest < ActionController::TestCase end end - limited_conditions = { - 'event tracking user' => :event_tracking, - } - - limited_conditions.each do |condition_name, user_role| - context "while authenticated as a #{condition_name}" do - setup do - @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] - sign_in @user - end - - should "not get index" do - test_index_failure - end - - should "not show checkin" do - test_show_failure - end - - should "not render checking datatable" do - test_datatable_failure - end - end - end - success_conditions = { - 'limited access admin' => :admin_limited_access, - 'admin' => :admin + 'volunteer' => :volunteer, + 'organizer' => :organizer, + 'director' => :director } success_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end diff --git a/test/controllers/manage/configs_controller_test.rb b/test/controllers/manage/configs_controller_test.rb index 038423fa4..826bb3043 100644 --- a/test/controllers/manage/configs_controller_test.rb +++ b/test/controllers/manage/configs_controller_test.rb @@ -31,7 +31,7 @@ class Manage::ConfigsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -61,10 +61,10 @@ class Manage::ConfigsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -91,10 +91,40 @@ class Manage::ConfigsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as an organizer" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_configs#index" do + get :index + assert_response :redirect + end + + should "not allow access to manage_configs#edit" do + get :edit, params: { id: "registration_is_open" } + assert_response :redirect + end + + should "not update config" do + HackathonConfig["registration_is_open"] = false + patch :update, params: { id: "registration_is_open", hackathon_config: { registration_is_open: "true" } } + assert_equal false, HackathonConfig["registration_is_open"] + end + + should "not update css config" do + HackathonConfig["custom_css"] = "" + patch :update_only_css_variables, params: { id: "custom_css", hackathon_config: { custom_css: ":root {\n --foo: #fff;\n}" } } + assert_equal "", HackathonConfig["custom_css"] + end + end + + context "while authenticated as a director" do + setup do + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/dashboard_controller_test.rb b/test/controllers/manage/dashboard_controller_test.rb index f1dad23c1..f473968e6 100644 --- a/test/controllers/manage/dashboard_controller_test.rb +++ b/test/controllers/manage/dashboard_controller_test.rb @@ -12,21 +12,156 @@ class Manage::DashboardControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end - should "allow access to manage_dashboard#index" do + should "not allow access to manage_dashboard#index" do get :index assert_response :redirect assert_redirected_to root_path end + + should "not allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_redirected_to root_path + end + + get :map_data, format: "tsv" + assert_redirected_to root_path + end + end + + context "while authenticated as a volunteer" do + setup do + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:director] + sign_in @user + end + + should "not allow access to manage_dashboard#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_redirected_to manage_checkins_path + end + + get :map_data, format: "tsv" + assert_redirected_to manage_checkins_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:director] + sign_in @user + end + + should "allow access to manage_dashboard#index" do + get :index + assert_response :success + end + + should "allow access to all data endpoints" do + school1 = FactoryBot.create(:school) + school2 = FactoryBot.create(:school) + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "pending") + FactoryBot.create_list(:questionnaire, 20, school_id: school1.id, acc_status: "accepted") + FactoryBot.create_list(:questionnaire, 10, school_id: school2.id, acc_status: "accepted") + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + FactoryBot.create_list(:questionnaire, 1, school_id: school2.id, acc_status: status) + end + + stub_request(:get, "https://geocoding.geo.census.gov/geocoder/locations/address?street=123+Fake+Street&city=Rochester&state=NY&benchmark=Public_AR_Current&format=json") + .to_return(status: 200, body: '{ "result":{ "addressMatches":[{ "coordinates":{ "x": 100, "y": 100 } }] } }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + stub_request(:get, "https://geo.fcc.gov/api/census/area?format=json&lat=100&lon=100") + .to_return(status: 200, body: '{ "results":[{ "country_fips":1234 }] }', headers: { 'Content-Type' => 'application/json; charset=UTF-8' }) + + paths = [ + :todays_activity_data, + :todays_stats_data, + :checkin_activity_data, + :confirmation_activity_data, + :application_activity_data, + :schools_confirmed_data, + :user_distribution_data, + :application_distribution_data, + :schools_applied_data + ] + + paths.each do |path| + get path + assert_response :success + end + + get :map_data, format: "tsv" + assert_response :success + end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end diff --git a/test/controllers/manage/messages_controller_test.rb b/test/controllers/manage/messages_controller_test.rb index 291ee290a..c63245752 100644 --- a/test/controllers/manage/messages_controller_test.rb +++ b/test/controllers/manage/messages_controller_test.rb @@ -200,10 +200,110 @@ class Manage::MessagesControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_messages#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#new" do + get :new + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#show" do + get :show, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#edit" do + get :edit, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#create" do + post :create, params: { message: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#update" do + patch :update, params: { id: @message, message: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#destroy" do + patch :destroy, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not deliver message" do + assert_difference("enqueued_jobs.size", 0) do + patch :deliver, params: { id: @message } + end + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#preview" do + get :preview, params: { id: @message } + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_messages#live_preview" do + get :live_preview, params: { body: "foo bar" } + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#duplicate" do + assert_difference("Message.count", 0) do + patch :duplicate, params: { id: @message } + end + assert_response :redirect + assert_redirected_to manage_messages_path + end + + should "not allow access to manage_messages#template" do + test_template_failure + end + + should "not allow access to manage_messages#template_preview" do + test_template_preview_failure + end + + should "not allow access to manage_messages#template_update" do + test_template_update_failure + end + + should "not allow access to manage_messages#template_replace_with_default" do + test_template_replace_with_default_failure + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -296,9 +396,9 @@ class Manage::MessagesControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/questionnaires_controller_test.rb b/test/controllers/manage/questionnaires_controller_test.rb index 210c0dbc2..ab7f84023 100644 --- a/test/controllers/manage/questionnaires_controller_test.rb +++ b/test/controllers/manage/questionnaires_controller_test.rb @@ -71,7 +71,7 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user end @@ -136,10 +136,10 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -200,10 +200,74 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as an organizer" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_questionnaires#index" do + get :index + assert_response :success + end + + should "allow access to manage_questionnaires datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :success + end + + should "allow access to manage_questionnaires#show" do + get :show, params: { id: @questionnaire } + assert_response :success + end + + should "not allow access to manage_questionnaires#new" do + get :new, params: { id: @questionnaire } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#edit" do + get :edit, params: { id: @questionnaire } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#create" do + post :create, params: { questionnaire: { major: "Best Major" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#update" do + patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not allow access to manage_questionnaires#destroy" do + patch :destroy, params: { id: @questionnaire } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "not access to manage_questionnaires#update_acc_status" do + patch :update_acc_status, params: { id: @questionnaire, questionnaire: { acc_status: "accepted" } } + assert_response :redirect + assert_redirected_to manage_questionnaires_path + end + + should "allow access to manage_questionnaires#bulk_apply" do + patch :bulk_apply, params: { bulk_action: "waitlist", bulk_ids: [@questionnaire.id] } + assert_response :success + end + end + + context "while authenticated as a director" do + setup do + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -281,11 +345,21 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) end - should "destroy questionnaire" do - assert_difference("Questionnaire.count", -1) do - delete :destroy, params: { id: @questionnaire } + context "destroy questionnaire" do + should "if bus captain, notify directors that bus captain has been removed" do + @user = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + delete :destroy, params: { id: @questionnaire } + end + end + + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do + delete :destroy, params: { id: @questionnaire } + end + assert_redirected_to manage_questionnaires_path end - assert_redirected_to manage_questionnaires_path end should "check in the questionnaire" do @@ -316,7 +390,7 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_equal @user.id, @questionnaire.checked_in_by_id assert_equal true, @questionnaire.agreement_accepted assert_equal true, @questionnaire.can_share_info - assert_equal "(123) 333-3333", @questionnaire.phone + assert_equal "1233333333", @questionnaire.phone assert_equal "new_email@example.com", @questionnaire.email assert_match /Checked in/, flash[:notice] assert_response :redirect diff --git a/test/controllers/manage/schools_controller_test.rb b/test/controllers/manage/schools_controller_test.rb index 6402b80ce..a19f9406d 100644 --- a/test/controllers/manage/schools_controller_test.rb +++ b/test/controllers/manage/schools_controller_test.rb @@ -134,10 +134,75 @@ class Manage::SchoolsControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to manage_schools#index" do + get :index + assert_response :success + end + + should "allow access to manage_schools datatables api" do + post :datatable, format: :json, params: { "columns[0][data]" => "" } + assert_response :success + end + + should "allow access to manage_schools#show" do + get :show, params: { id: @school } + assert_response :success + end + + should "not allow access to manage_schools#new" do + get :new + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#edit" do + get :edit, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#create" do + post :create, params: { school: { name: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#update" do + patch :update, params: { id: @school, school: { name: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#destroy" do + patch :destroy, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#merge" do + patch :merge, params: { id: @school } + assert_response :redirect + assert_redirected_to manage_schools_path + end + + should "not allow access to manage_schools#perform_merge" do + patch :perform_merge, params: { id: @school, school: { id: "My Test School" } } + assert_response :redirect + assert_redirected_to manage_schools_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -199,9 +264,9 @@ class Manage::SchoolsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/stats_controller_test.rb b/test/controllers/manage/stats_controller_test.rb index 9e4e66f65..79aa2c9cb 100644 --- a/test/controllers/manage/stats_controller_test.rb +++ b/test/controllers/manage/stats_controller_test.rb @@ -20,7 +20,7 @@ class Manage::StatsControllerTest < ActionController::TestCase context "while authenticated as a user" do setup do @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end @@ -39,14 +39,61 @@ class Manage::StatsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end - should "allow access to manage_dashboard#index" do + should "not allow access to stats#index" do + get :index + assert_response :redirect + assert_redirected_to manage_checkins_path + end + + should "not allow access to data endpoints" do + paths.each do |path| + patch path + assert_response :redirect + assert_redirected_to manage_checkins_path + end + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to stats#index" do + get :index + assert_response :success + end + + should "allow access to all data endpoints" do + school = create(:school) + Questionnaire::POSSIBLE_ACC_STATUS.each do |status, _name| + create_list(:questionnaire, 5, school_id: school.id, acc_status: status, dietary_restrictions: "Vegetarian", special_needs: "Something") + end + + paths.each do |path| + patch path + assert_response :success + end + end + end + + context "while authenticated as a director" do + setup do + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "allow access to stats#index" do get :index assert_response :success end diff --git a/test/controllers/manage/trackable_events_controller_test.rb b/test/controllers/manage/trackable_events_controller_test.rb index faf5b4478..67cd2d398 100644 --- a/test/controllers/manage/trackable_events_controller_test.rb +++ b/test/controllers/manage/trackable_events_controller_test.rb @@ -15,7 +15,7 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user @trackable_event.update_attribute(:user, @user) end @@ -52,15 +52,15 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase end limited_conditions = { - 'event tracking user' => :event_tracking, - 'limited access admin' => :admin_limited_access + 'volunteer' => :volunteer, + 'organizer' => :organizer } limited_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user @trackable_event.update_attribute(:user, @user) end @@ -105,10 +105,10 @@ class Manage::TrackableEventsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/trackable_tags_controller_test.rb b/test/controllers/manage/trackable_tags_controller_test.rb index a392cf371..56c273cfa 100644 --- a/test/controllers/manage/trackable_tags_controller_test.rb +++ b/test/controllers/manage/trackable_tags_controller_test.rb @@ -15,7 +15,7 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase setup do if do_sign_in @user = create(:user) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @user end end @@ -51,15 +51,15 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase end limited_conditions = { - 'event tracking user' => :event_tracking, - 'limited access admin' => :admin_limited_access + 'volunteer' => :volunteer, + 'organizer' => :organizer } limited_conditions.each do |condition_name, user_role| context "while authenticated as a #{condition_name}" do setup do @user = create(:user, role: user_role) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end @@ -93,10 +93,10 @@ class Manage::TrackableTagsControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:director) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/manage/users_controller_test.rb b/test/controllers/manage/users_controller_test.rb index 1a2b5dc42..2ea0cd3c9 100644 --- a/test/controllers/manage/users_controller_test.rb +++ b/test/controllers/manage/users_controller_test.rb @@ -17,8 +17,8 @@ class Manage::UsersControllerTest < ActionController::TestCase assert_response 401 end - should "not allow access to manage_users admin datatables api" do - post :admin_datatable, format: :json, params: { "columns[0][data]" => "" } + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } assert_response 401 end @@ -65,8 +65,8 @@ class Manage::UsersControllerTest < ActionController::TestCase assert_redirected_to root_path end - should "not allow access to manage_users admin datatables api" do - post :admin_datatable, format: :json, params: { "columns[0][data]" => "" } + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } assert_response :redirect assert_redirected_to root_path end @@ -96,31 +96,77 @@ class Manage::UsersControllerTest < ActionController::TestCase end end - context "while authenticated as a limited access admin" do + context "while authenticated as a volunteer" do setup do - @user = create(:limited_access_admin) - @request.env["devise.mapping"] = Devise.mappings[:admin] + @user = create(:volunteer) + @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end should "not allow access to manage_users#index" do get :index - assert_redirected_to root_path + assert_redirected_to manage_checkins_path end should "not allow access to manage_users users datatables api" do post :user_datatable, format: :json, params: { "columns[0][data]" => "" } - assert_redirected_to root_path + assert_redirected_to manage_checkins_path end - should "not allow access to manage_users admins datatables api" do - post :admin_datatable, format: :json, params: { "columns[0][data]" => "" } - assert_redirected_to root_path + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_checkins_path end should "allow access to manage_users#show" do get :show, params: { id: @user } - assert_redirected_to root_path + assert_redirected_to manage_checkins_path + end + + should "not allow access to manage_users#edit" do + get :edit, params: { id: @user } + assert_response :redirect + assert_redirected_to manage_users_path + end + + should "not allow access to manage_users#update" do + patch :update, params: { id: @user, user: { email: "test@example.com" } } + assert_response :redirect + assert_redirected_to manage_users_path + end + + should "not allow access to manage_users#destroy" do + patch :destroy, params: { id: @user } + assert_response :redirect + assert_redirected_to manage_users_path + end + end + + context "while authenticated as an organizer" do + setup do + @user = create(:organizer) + @request.env["devise.mapping"] = Devise.mappings[:user] + sign_in @user + end + + should "not allow access to manage_users#index" do + get :index + assert_redirected_to manage_root_path + end + + should "not allow access to manage_users users datatables api" do + post :user_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_root_path + end + + should "not allow access to manage_users staff datatables api" do + post :staff_datatable, format: :json, params: { "columns[0][data]" => "" } + assert_redirected_to manage_root_path + end + + should "allow access to manage_users#show" do + get :show, params: { id: @user } + assert_redirected_to manage_root_path end should "not allow access to manage_users#edit" do @@ -142,9 +188,9 @@ class Manage::UsersControllerTest < ActionController::TestCase end end - context "while authenticated as an admin" do + context "while authenticated as a director" do setup do - @user = create(:admin) + @user = create(:director) @request.env["devise.mapping"] = Devise.mappings[:user] sign_in @user end diff --git a/test/controllers/questionnaires_controller_test.rb b/test/controllers/questionnaires_controller_test.rb index 53260735c..a3f14b404 100644 --- a/test/controllers/questionnaires_controller_test.rb +++ b/test/controllers/questionnaires_controller_test.rb @@ -35,7 +35,7 @@ class QuestionnairesControllerTest < ActionController::TestCase context "while authenticated without a completed questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] @user = create(:user) sign_in @user end @@ -139,7 +139,7 @@ class QuestionnairesControllerTest < ActionController::TestCase context "while authenticated with a completed questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user end @@ -165,12 +165,22 @@ class QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to questionnaires_path end - should "destroy questionnaire" do - assert_difference('Questionnaire.count', -1) do - delete :destroy + context "destroy questionnaire" do + should "if bus captain, notify directors that bus captain has been removed" do + @director = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + delete :destroy + end end - assert_redirected_to questionnaires_path + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do + delete :destroy + end + + assert_redirected_to questionnaires_path + end end context "with invalid questionnaire params" do diff --git a/test/controllers/rsvps_controller_test.rb b/test/controllers/rsvps_controller_test.rb index 77a15dbe7..7a61408a5 100644 --- a/test/controllers/rsvps_controller_test.rb +++ b/test/controllers/rsvps_controller_test.rb @@ -32,7 +32,7 @@ class RsvpsControllerTest < ActionController::TestCase context "while authenticated without a questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] @user = create(:user, email: "newabc@example.com") sign_in @user end @@ -60,7 +60,7 @@ class RsvpsControllerTest < ActionController::TestCase context "while authenticated with a non-accepted questionnaire" do setup do - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.acc_status = "denied" end @@ -90,7 +90,7 @@ class RsvpsControllerTest < ActionController::TestCase setup do clear_enqueued_jobs - @request.env["devise.mapping"] = Devise.mappings[:admin] + @request.env["devise.mapping"] = Devise.mappings[:director] sign_in @questionnaire.user @questionnaire.update_attribute(:acc_status, "accepted") end @@ -243,5 +243,38 @@ class RsvpsControllerTest < ActionController::TestCase assert_match /select a RSVP status/, flash[:alert] assert_redirected_to rsvp_path end + + should "if bus captain leaves a bus, notify directors that bus captain has been removed" do + @director = create(:director) + @questionnaire.update_attribute(:is_bus_captain, true) + @questionnaire.update_attribute(:acc_status, "rsvp_confirmed") + + bus_list1 = create(:bus_list, capacity: 1) + bus_list2 = create(:bus_list, capacity: 2) + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list1.id + } + } + + assert_difference('enqueued_jobs.size', User.where(role: :director).size) do + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list2.id + } + } + end + end + + should "not queue bus_captain_left email if questionnaire is not a bus captain" do + @questionnaire.update_attribute(:is_bus_captain, false) + assert_difference('enqueued_jobs.size', 0) do + patch :update, params: { questionnaire: { acc_status: "rsvp_confirmed" } } + end + end end end diff --git a/test/controllers/admin_mailer_test.rb b/test/controllers/staff_mailer_test.rb similarity index 68% rename from test/controllers/admin_mailer_test.rb rename to test/controllers/staff_mailer_test.rb index 565b63158..591b4089d 100644 --- a/test/controllers/admin_mailer_test.rb +++ b/test/controllers/staff_mailer_test.rb @@ -1,6 +1,6 @@ require "test_helper" -class AdminMailerTest < ActionMailer::TestCase +class StaffMailerTest < ActionMailer::TestCase context "weekly_report" do setup do @user = create(:user, email: "test@example.com", receive_weekly_report: true) @@ -10,7 +10,7 @@ class AdminMailerTest < ActionMailer::TestCase end should "deliver weekly email report" do - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_equal ["test@example.com"], email.to assert_equal "Your Weekly Report", email.subject @@ -19,25 +19,25 @@ class AdminMailerTest < ActionMailer::TestCase should "not send when more than 7 days after event started" do HackathonConfig["event_start_date"] = 10.days.ago.to_s - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end - should "not send if admin is inactive" do + should "not send if staff member is inactive" do @user.update_attribute(:is_active, false) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end - should "not send if admin isn't receiving weekly reports" do + should "not send if staff member isn't receiving weekly reports" do @user.update_attribute(:receive_weekly_report, false) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end should "not send if there hasn't been new activity" do @questionnaire.update_attribute(:created_at, Date.today) - email = AdminMailer.weekly_report(@user.id).deliver_now + email = StaffMailer.weekly_report(@user.id).deliver_now assert_nil email end end diff --git a/test/controllers/user_mailer_test.rb b/test/controllers/user_mailer_test.rb index 5b9d237e4..8bdaeea91 100644 --- a/test/controllers/user_mailer_test.rb +++ b/test/controllers/user_mailer_test.rb @@ -29,6 +29,19 @@ class UserMailerTest < ActionMailer::TestCase end end + context "upon scheduled rsvp reminder email" do + setup do + @user = create(:user, email: "test@example.com") + @message = create(:message, subject: "Are you coming to HackFoo?", type: "automated", trigger: "questionnaire.rsvp_reminder_email") + + should "queue reminder bulk message" do + assert_difference "enqueued_jobs.size", 1 do + UserMailer.rsvp_reminder_email(@user.id).deliver_later + end + end + end + end + context "with customized HackathonConfig" do setup do @user = create(:user, email: "test@example.com") diff --git a/test/factories/users.rb b/test/factories/users.rb index f4b7bedf1..4b5f80572 100644 --- a/test/factories/users.rb +++ b/test/factories/users.rb @@ -10,18 +10,25 @@ is_active { true } receive_weekly_report { false } - factory :admin do + factory :director do sequence :email do |n| - "admin#{n}@example.com" + "director#{n}@example.com" end - role { :admin } + role { :director } end - factory :limited_access_admin do + factory :organizer do sequence :email do |n| - "limited_admin#{n}@example.com" + "organizer#{n}@example.com" end - role { :admin_limited_access } + role { :organizer } + end + + factory :volunteer do + sequence :email do |n| + "volunteer#{n}@example.com" + end + role { :volunteer } end end end diff --git a/test/integration/user_flows_test.rb b/test/integration/user_flows_test.rb index f6131b5cf..f8ca5767d 100644 --- a/test/integration/user_flows_test.rb +++ b/test/integration/user_flows_test.rb @@ -10,8 +10,8 @@ class UserFlowsTest < ActionDispatch::IntegrationTest assert assigns(:questionnaire) end - should "be able to login and browse site as an admin" do - login(FactoryBot.create(:admin)) + should "be able to login and browse site as a director" do + login(FactoryBot.create(:director)) assert_redirected_to new_questionnaires_path get manage_dashboard_index_path @@ -24,7 +24,7 @@ class UserFlowsTest < ActionDispatch::IntegrationTest get manage_questionnaires_path assert_response :redirect - login(FactoryBot.create(:admin)) + login(FactoryBot.create(:director)) assert_redirected_to manage_questionnaires_path end diff --git a/test/jobs/admin_weekly_report_job_test.rb b/test/jobs/staff_weekly_report_job_test.rb similarity index 74% rename from test/jobs/admin_weekly_report_job_test.rb rename to test/jobs/staff_weekly_report_job_test.rb index c8b6007ba..094fd4403 100644 --- a/test/jobs/admin_weekly_report_job_test.rb +++ b/test/jobs/staff_weekly_report_job_test.rb @@ -1,11 +1,11 @@ require "test_helper" -class AdminWeeklyReportJobTest < ActiveJob::TestCase +class StaffWeeklyReportJobTest < ActiveJob::TestCase should "queue a mailer per recipient" do create_list(:user, 3, receive_weekly_report: true) create_list(:user, 2, receive_weekly_report: false) assert_difference "enqueued_jobs.size", 3 do - worker = AdminWeeklyReportJob.new + worker = StaffWeeklyReportJob.new worker.perform end end diff --git a/test/models/questionnaire_test.rb b/test/models/questionnaire_test.rb index d61fcfd47..c1d0ea6c1 100644 --- a/test/models/questionnaire_test.rb +++ b/test/models/questionnaire_test.rb @@ -194,16 +194,16 @@ class QuestionnaireTest < ActiveSupport::TestCase end should "return nil if author deleted" do - user = create(:user, email: "admin@example.com") + user = create(:user, email: "director@example.com") questionnaire = create(:questionnaire, acc_status_author_id: user.id) user.destroy assert_nil questionnaire.acc_status_author end should "return the questionnaire's user" do - user = create(:user, email: "admin@example.com") + user = create(:user, email: "director@example.com") questionnaire = create(:questionnaire, acc_status_author_id: user.id) - assert_equal "admin@example.com", questionnaire.acc_status_author.email + assert_equal "director@example.com", questionnaire.acc_status_author.email end end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 86e264e0c..2bac1093b 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -64,11 +64,11 @@ class UserTest < ActiveSupport::TestCase assert_equal 2, User.without_questionnaire.count end - should "not return admins" do + should "not return staff" do create(:questionnaire) # user, has questionnaire - create(:user, role: :event_tracking) # user, does not - create(:user, role: :admin_limited_access) # admin, does not - create(:user, role: :admin) # admin, does not + create(:user, role: :volunteer) # volunteer, does not + create(:user, role: :organizer) # organizer, does not + create(:user, role: :director) # director, does not assert_equal 4, User.count assert_equal 1, User.without_questionnaire.count end @@ -80,6 +80,50 @@ class UserTest < ActiveSupport::TestCase end end + context "current_user is staff" do + should "not report user as staff" do + user = create(:user, role: user) + assert_equal false, user.staff? + end + + should "report volunteer as staff" do + user = create(:user, role: :volunteer) + assert_equal true, user.staff? + end + + should "report organizer as staff" do + user = create(:user, role: :organizer) + assert_equal true, user.staff? + end + + should "report director as staff" do + user = create(:user, role: :director) + assert_equal true, user.staff? + end + end + + context "current_user is organizing staff" do + should "not report user as organizing staff" do + user = create(:user, role: user) + assert_equal false, user.organizing_staff? + end + + should "not report volunteer as organizing staff" do + user = create(:user, role: :volunteer) + assert_equal false, user.organizing_staff? + end + + should "report organizer as organizing staff" do + user = create(:user, role: :organizer) + assert_equal true, user.organizing_staff? + end + + should "report director as organizing staff" do + user = create(:user, role: :director) + assert_equal true, user.organizing_staff? + end + end + context "safe_receive_weekly_report" do should "return false if user is inactive" do user = build(:user, is_active: true, receive_weekly_report: true) diff --git a/vendor/cache/puma-4.3.4.gem b/vendor/cache/puma-4.3.4.gem new file mode 100644 index 0000000000000000000000000000000000000000..422fc484c61d60f58770f5dba4453cc983d7d76a GIT binary patch literal 174592 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

jpu|>T}yh$@r*B-rCR>y3oQcJbmJB zZ3(RT@N@TgC=Wed3aE$gCD%3_tG{_@w8P7mzLx3V-W<+2h)=3^iT?N@!Id-0e}j

hUMXce1TT} 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 H=7IkJ0NYf6 literal 0 HcmV?d00001 From 32d7d541308befa6e02990a2f3ffe551ec99fff7 Mon Sep 17 00:00:00 2001 From: Peter Kos Date: Mon, 21 Sep 2020 00:20:36 -0400 Subject: [PATCH 2/5] Add 2.0 migration docs, rename maintenance file --- docs/2.0-migration-guide.md | 73 +++++++++++++++++++++++++ docs/{maintenance.md => updating-hm.md} | 0 website/sidebars.json | 3 +- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 docs/2.0-migration-guide.md rename docs/{maintenance.md => updating-hm.md} (100%) diff --git a/docs/2.0-migration-guide.md b/docs/2.0-migration-guide.md new file mode 100644 index 000000000..c82f340c5 --- /dev/null +++ b/docs/2.0-migration-guide.md @@ -0,0 +1,73 @@ +--- +id: 2.0-migration-guide +title: 2.0 Migration Guide +--- + +HackathonManager 2.0 has a lot of new features, changes, and bug fixes! This page serves to detail the updates that may affect your existing instance of HackathonManager. + +## Updating +If you are not currently on v2.0, see the guide for [updating HM](updating-hm.md). + + +## New Features +- Dashboard map! + - This is an initial version of this feature, and we have many improvements planned for the next version. +- Dashboard sidebar navigation has been redesigned (now has groups!) +- Directors can view user accounts directly (**Users & Staff** page) +- Directors can block the ability to submit questionnaires +- Password reset screen has been redesigned +- Questionnaires can now be deleted without deleting the associated user + - This is useful if a staff member (volunteer/organizer/director) decides to no longer attend the hackathon. +- Phone number is now validated in questionnaire form + - We are planning to add a more robust implementation down the line, but for now, this prevents obvious errors in phone numbers (i.e., text). + +

+ Many variations are accepted (click to toggle) + ``` + (123) 456-7890 + (123)456-7890 + 123-456-7890 + 123.456.7890 + 1234567890 + +31636363634 + 075-63546725 + +123(203)1234567 + +011234567890 + +234-9-461-4000 + +234-09-461-4000 + ``` +
+- Directors (prev: admins) are now notified when a bus captain leaves their bus list, or they deny their RSVP. +- When sending a message, HM now prompts with a confirmation message indicating the number of recipients. +- More detailed [API Documentation](api-overview) is now available +- Added [Updating HackathonManager](updating-hm.md) documentation + +## Changes + +- "Convert to Admin" button removed on Questionnaire pages. + - Instead, go to the corresponding User (in the `Users & Staff` page) and change their role. +- Role updates + - Roles have been **renamed** as follows: + - | Old Role | New Role | + |----------------------|-----------| + | User | User | + | event_tracking | Volunteer | + | admin_limited_access | Organizer | + | Admin | Director | + + - Directors can modify the permissions of organizers, while organizers cannot modify other organizers' permissions. + - (Eventually, we plan to add [custom role support](https://github.com/codeRIT/hackathon-manager/issues/243)! Stay tuned.) + +- MyMLH has been updated to V3 + +- Documentation for [environment variables](deployment-environment-variables.md) has been updated +- Documentation for [messages](messages.md) has been updated +- 24hr event reminder wording addresses all attendees in the message, not just MyMLH attendees + +## Bug Fixes +- When editing a questionnaire, the school autocomplete dropdown now has a background +- "Please sign in or sign up to continue" message no longer flashes on sign-in page +- Long hackathon names no longer wrap on the account registration page + - Note that we do not support names longer than 31 characters; this limit will be strictly enforced in a future version of HM. +- When creating a questionnaire, the school dropdown now fits to the size of the form field, instead of stretching offscreen +- Trying to view a questionnaire modified by a deleted admin now communicates `(deleted user) \ No newline at end of file diff --git a/docs/maintenance.md b/docs/updating-hm.md similarity index 100% rename from docs/maintenance.md rename to docs/updating-hm.md diff --git a/website/sidebars.json b/website/sidebars.json index 614eea1c2..cb68f49f3 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -9,7 +9,8 @@ "customization" ], "Maintenance" : [ - "updating-hm" + "updating-hm", + "2.0-migration-guide" ], "Docs": ["docs-overview", "questionnaires", "messages", "busses"], "API": ["api-overview", "api-testing-setup"], From 88ce281cdbbfad27852993a9d2b9d8d9eb1a6a2a Mon Sep 17 00:00:00 2001 From: Peter Kos Date: Mon, 21 Sep 2020 00:29:03 -0400 Subject: [PATCH 3/5] Spacing fixes --- docs/2.0-migration-guide.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/2.0-migration-guide.md b/docs/2.0-migration-guide.md index c82f340c5..2f15b057a 100644 --- a/docs/2.0-migration-guide.md +++ b/docs/2.0-migration-guide.md @@ -5,11 +5,14 @@ title: 2.0 Migration Guide HackathonManager 2.0 has a lot of new features, changes, and bug fixes! This page serves to detail the updates that may affect your existing instance of HackathonManager. + ## Updating + If you are not currently on v2.0, see the guide for [updating HM](updating-hm.md). ## New Features + - Dashboard map! - This is an initial version of this feature, and we have many improvements planned for the next version. - Dashboard sidebar navigation has been redesigned (now has groups!) @@ -42,6 +45,7 @@ If you are not currently on v2.0, see the guide for [updating HM](updating-hm.md - More detailed [API Documentation](api-overview) is now available - Added [Updating HackathonManager](updating-hm.md) documentation + ## Changes - "Convert to Admin" button removed on Questionnaire pages. @@ -59,15 +63,16 @@ If you are not currently on v2.0, see the guide for [updating HM](updating-hm.md - (Eventually, we plan to add [custom role support](https://github.com/codeRIT/hackathon-manager/issues/243)! Stay tuned.) - MyMLH has been updated to V3 - - Documentation for [environment variables](deployment-environment-variables.md) has been updated - Documentation for [messages](messages.md) has been updated - 24hr event reminder wording addresses all attendees in the message, not just MyMLH attendees + ## Bug Fixes + - When editing a questionnaire, the school autocomplete dropdown now has a background - "Please sign in or sign up to continue" message no longer flashes on sign-in page - Long hackathon names no longer wrap on the account registration page - Note that we do not support names longer than 31 characters; this limit will be strictly enforced in a future version of HM. - When creating a questionnaire, the school dropdown now fits to the size of the form field, instead of stretching offscreen -- Trying to view a questionnaire modified by a deleted admin now communicates `(deleted user) \ No newline at end of file +- Trying to view a questionnaire modified by a deleted admin now communicates `(deleted user)` \ No newline at end of file From 7876dabee79a10efd68e2dda2462f66909c80d31 Mon Sep 17 00:00:00 2001 From: Peter Kos Date: Mon, 21 Sep 2020 01:18:33 -0400 Subject: [PATCH 4/5] 2.0 migration guide -> whats new in 2.0 --- docs/{2.0-migration-guide.md => 2.0-whats-new.md} | 4 ++-- website/sidebars.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename docs/{2.0-migration-guide.md => 2.0-whats-new.md} (98%) diff --git a/docs/2.0-migration-guide.md b/docs/2.0-whats-new.md similarity index 98% rename from docs/2.0-migration-guide.md rename to docs/2.0-whats-new.md index 2f15b057a..8d6e0091d 100644 --- a/docs/2.0-migration-guide.md +++ b/docs/2.0-whats-new.md @@ -1,6 +1,6 @@ --- -id: 2.0-migration-guide -title: 2.0 Migration Guide +id: 2.0-whats-new +title: What's New in v2.0 --- HackathonManager 2.0 has a lot of new features, changes, and bug fixes! This page serves to detail the updates that may affect your existing instance of HackathonManager. diff --git a/website/sidebars.json b/website/sidebars.json index cb68f49f3..b13d9cfc6 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -10,7 +10,7 @@ ], "Maintenance" : [ "updating-hm", - "2.0-migration-guide" + "2.0-whats-new" ], "Docs": ["docs-overview", "questionnaires", "messages", "busses"], "API": ["api-overview", "api-testing-setup"], From 9be882b1ea503f52446118594f6198c25e1dc264 Mon Sep 17 00:00:00 2001 From: Peter Kos Date: Mon, 21 Sep 2020 01:26:55 -0400 Subject: [PATCH 5/5] Add entry for reminder email + explanation --- docs/2.0-whats-new.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/2.0-whats-new.md b/docs/2.0-whats-new.md index 8d6e0091d..3ded484d9 100644 --- a/docs/2.0-whats-new.md +++ b/docs/2.0-whats-new.md @@ -41,6 +41,10 @@ If you are not currently on v2.0, see the guide for [updating HM](updating-hm.md ``` - Directors (prev: admins) are now notified when a bus captain leaves their bus list, or they deny their RSVP. +- Users who didn't finish their application are now sent a reminder email: + - 7 days after they were accepted (if signed up >2 weeks before event) + - 5 days before event (if signed up >10 days before event) + - 2 days before event (if signed up >3 days before event) - When sending a message, HM now prompts with a confirmation message indicating the number of recipients. - More detailed [API Documentation](api-overview) is now available - Added [Updating HackathonManager](updating-hm.md) documentation