hackathon_manager 0.12.2 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/hackathon_manager/manage/lib/setupDataTables.js +2 -1
- data/app/controllers/manage/admins_controller.rb +2 -3
- data/app/controllers/manage/application_controller.rb +6 -2
- data/app/controllers/manage/configs_controller.rb +1 -1
- data/app/controllers/manage/dashboard_controller.rb +1 -1
- data/app/controllers/manage/questionnaires_controller.rb +1 -1
- data/app/controllers/manage/trackable_events_controller.rb +8 -3
- data/app/datatables/admin_datatable.rb +6 -4
- data/app/datatables/questionnaire_datatable.rb +2 -2
- data/app/mailers/mailer.rb +1 -1
- data/app/models/user.rb +12 -1
- data/app/views/layouts/manage/_page_title.html.haml +1 -1
- data/app/views/layouts/manage/application.html.haml +1 -1
- data/app/views/manage/admins/_form.html.haml +1 -1
- data/app/views/manage/admins/index.html.haml +2 -1
- data/app/views/manage/admins/show.html.haml +10 -6
- data/app/views/manage/bus_lists/show.html.haml +5 -7
- data/app/views/manage/dashboard/index.html.haml +6 -5
- data/app/views/manage/questionnaires/_checkin.html.haml +1 -1
- data/app/views/manage/questionnaires/index.html.haml +1 -1
- data/app/views/manage/questionnaires/show.html.haml +3 -3
- data/app/views/manage/trackable_events/index.html.haml +5 -3
- data/app/views/manage/trackable_tags/show.html.haml +1 -1
- data/app/workers/bulk_message_worker.rb +2 -2
- data/config/locales/en.yml +1 -1
- data/config/routes.rb +1 -1
- data/db/migrate/20190118204143_add_role_to_users.rb +16 -0
- data/lib/hackathon_manager/version.rb +1 -1
- data/test/factories/users.rb +3 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac76ddc635787194b110815a1d4644597c6764de671879e922f6aa16cdb95c4f
|
4
|
+
data.tar.gz: 322bfb6e07da66de298b84d5340c27b2955ce4e70b63a612809f66e05d1c973a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ebb6b641937dc02641948d780a63a6e4bbd62537883eee58f98d09e3e329ea4d19a5fb77e70a36eb0110c70b2d5e652d56effee3528ccd476fa57190f9b5a83
|
7
|
+
data.tar.gz: 839c8439546cffd2efba661f119b1fbdbff1c834944296cdaea6ce12b3427adfccdf37c6c591cc65f5c245fd465e004dd6e578069c281bb90453c7733cacb4e1
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ Steps to get the basic flow working:
|
|
35
35
|
|
36
36
|
2. Once you have at least one user in the system, you can promote them to an admin to access the management interface. Open up a console session with `bin/rails console`:
|
37
37
|
```ruby
|
38
|
-
>> User.last.update_attribute(:
|
38
|
+
>> User.last.update_attribute(:role, :admin)
|
39
39
|
=> true
|
40
40
|
```
|
41
41
|
|
@@ -27,7 +27,8 @@ var setupDataTables = function() {
|
|
27
27
|
columns : [
|
28
28
|
{ orderable: true, data: 'id', visible: false },
|
29
29
|
{ orderable: true, data: 'email' },
|
30
|
-
{ orderable: true, data: '
|
30
|
+
{ orderable: true, data: 'role' },
|
31
|
+
{ orderable: true, data: 'created_at' }
|
31
32
|
]
|
32
33
|
});
|
33
34
|
|
@@ -4,7 +4,7 @@ class Manage::AdminsController < Manage::ApplicationController
|
|
4
4
|
respond_to :html, :json
|
5
5
|
|
6
6
|
def index
|
7
|
-
respond_with(:manage, User.where(admin:
|
7
|
+
respond_with(:manage, User.where(role: [:admin, :admin_limited_access, :event_tracking]))
|
8
8
|
end
|
9
9
|
|
10
10
|
def datatable
|
@@ -26,7 +26,6 @@ class Manage::AdminsController < Manage::ApplicationController
|
|
26
26
|
def create
|
27
27
|
@user = ::User.new(user_params.merge(password: Devise.friendly_token.first(10)))
|
28
28
|
if @user.save
|
29
|
-
@user.update_attribute(:admin, true)
|
30
29
|
@user.send_reset_password_instructions
|
31
30
|
end
|
32
31
|
respond_with(:manage, @user, location: manage_admins_path)
|
@@ -46,7 +45,7 @@ class Manage::AdminsController < Manage::ApplicationController
|
|
46
45
|
|
47
46
|
def user_params
|
48
47
|
params.require(:user).permit(
|
49
|
-
:email, :password, :password_confirmation, :remember_me, :
|
48
|
+
:email, :password, :password_confirmation, :remember_me, :role
|
50
49
|
)
|
51
50
|
end
|
52
51
|
|
@@ -1,15 +1,19 @@
|
|
1
1
|
class Manage::ApplicationController < ApplicationController
|
2
2
|
before_action :logged_in
|
3
|
+
before_action :require_admin_or_limited_admin
|
3
4
|
before_action :limit_admin_access, only: ["edit", "update", "new", "create", "destroy", "convert_to_admin", "deliver", "merge", "perform_merge", "toggle_bus_captain", "duplicate", "update_acc_status", "send_update_email", "live_preview"]
|
4
5
|
skip_before_action :verify_authenticity_token, if: :json_request?
|
5
6
|
|
6
7
|
def logged_in
|
7
8
|
authenticate_user!
|
8
|
-
|
9
|
+
end
|
10
|
+
|
11
|
+
def require_admin_or_limited_admin
|
12
|
+
return redirect_to root_path unless current_user.try(:admin?) || current_user.try(:admin_limited_access?)
|
9
13
|
end
|
10
14
|
|
11
15
|
def limit_admin_access
|
12
|
-
redirect_to url_for(controller: controller_name, action: :index)
|
16
|
+
redirect_to url_for(controller: controller_name, action: :index) unless current_user.try(:admin?)
|
13
17
|
end
|
14
18
|
|
15
19
|
def json_request?
|
@@ -32,7 +32,7 @@ class Manage::DashboardController < Manage::ApplicationController
|
|
32
32
|
total_stats_data = {}
|
33
33
|
total_count = Questionnaire.count
|
34
34
|
rit_count = Questionnaire.where("school_id = \"2304\"").count
|
35
|
-
total_stats_data["Non-Applied Users"] = User.
|
35
|
+
total_stats_data["Non-Applied Users"] = User.without_questionnaire.count
|
36
36
|
total_stats_data["Non-RIT Applications"] = total_count - rit_count
|
37
37
|
total_stats_data["RIT Applications"] = rit_count
|
38
38
|
render json: total_stats_data
|
@@ -86,7 +86,7 @@ class Manage::QuestionnairesController < Manage::ApplicationController
|
|
86
86
|
def convert_to_admin
|
87
87
|
user = @questionnaire.user
|
88
88
|
@questionnaire.destroy
|
89
|
-
user.update_attributes(
|
89
|
+
user.update_attributes(role: :admin)
|
90
90
|
redirect_to edit_manage_admin_path(user)
|
91
91
|
end
|
92
92
|
|
@@ -9,7 +9,7 @@ class Manage::TrackableEventsController < Manage::ApplicationController
|
|
9
9
|
@trackable_events = TrackableEvent.all
|
10
10
|
@params = {}
|
11
11
|
if params[:trackable_event]
|
12
|
-
@params = params.require(:trackable_event).permit(:user_id, :band_id).reject{|_, v| v.blank?}
|
12
|
+
@params = params.require(:trackable_event).permit(:user_id, :band_id, :trackable_tag_id).reject { |_, v| v.blank? }
|
13
13
|
@trackable_events = @trackable_events.where(@params)
|
14
14
|
end
|
15
15
|
respond_with(:manage, @trackable_events)
|
@@ -78,13 +78,18 @@ class Manage::TrackableEventsController < Manage::ApplicationController
|
|
78
78
|
params.require(:trackable_event).permit(:band_id, :trackable_tag_id)
|
79
79
|
end
|
80
80
|
|
81
|
+
# Permit everyone but regular users to access this controller
|
82
|
+
def require_admin_or_limited_admin
|
83
|
+
redirect_to root_path if current_user.try(:user?)
|
84
|
+
end
|
85
|
+
|
81
86
|
# Permit limited-access admins (overrides Manage::ApplicationController#limit_admin_access)
|
82
87
|
def limit_admin_access
|
83
88
|
end
|
84
89
|
|
85
|
-
# If the
|
90
|
+
# If the user isn't a full admin, scope changes only to those they created
|
86
91
|
def scope_limited_admin_access
|
87
|
-
return if
|
92
|
+
return if current_user.admin? || @trackable_event.blank? || @trackable_event.user.blank?
|
88
93
|
redirect_to manage_trackable_events_path, notice: 'You may not view events you did not create.' if @trackable_event.user != current_user
|
89
94
|
end
|
90
95
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
class AdminDatatable < AjaxDatatablesRails::Base
|
2
|
-
def_delegators :@view, :link_to, :manage_admin_path, :bold
|
2
|
+
def_delegators :@view, :link_to, :manage_admin_path, :bold, :display_datetime
|
3
3
|
|
4
4
|
def view_columns
|
5
5
|
@view_columns ||= {
|
6
6
|
id: { source: 'User.id' },
|
7
7
|
email: { source: 'User.email' },
|
8
|
-
|
8
|
+
role: { source: 'User.role', searchable: false },
|
9
|
+
created_at: { source: 'User.created_at', searchable: false }
|
9
10
|
}
|
10
11
|
end
|
11
12
|
|
@@ -16,14 +17,15 @@ class AdminDatatable < AjaxDatatablesRails::Base
|
|
16
17
|
{
|
17
18
|
id: record.id,
|
18
19
|
email: link_to(bold(record.email), manage_admin_path(record)),
|
19
|
-
|
20
|
+
role: record.role.titleize,
|
21
|
+
created_at: display_datetime(record.created_at)
|
20
22
|
}
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
# rubocop:disable Naming/AccessorMethodName
|
25
27
|
def get_raw_records
|
26
|
-
User.where(admin:
|
28
|
+
User.where(role: [:admin, :admin_limited_access, :event_tracking])
|
27
29
|
end
|
28
30
|
# rubocop:enable Naming/AccessorMethodName
|
29
31
|
end
|
@@ -10,7 +10,7 @@ class QuestionnaireDatatable < AjaxDatatablesRails::Base
|
|
10
10
|
phone: { source: 'Questionnaire.phone' },
|
11
11
|
gender: { source: 'Questionnaire.gender' },
|
12
12
|
date_of_birth: { source: 'Questionnaire.date_of_birth', searchable: false },
|
13
|
-
|
13
|
+
role: { source: 'User.role', cond: :eq, searchable: false },
|
14
14
|
acc_status: { source: 'Questionnaire.acc_status', searchable: true },
|
15
15
|
checked_in: { source: 'Questionnaire.checked_in_at', searchable: false },
|
16
16
|
school: { source: 'School.name' },
|
@@ -34,7 +34,7 @@ class QuestionnaireDatatable < AjaxDatatablesRails::Base
|
|
34
34
|
def data
|
35
35
|
records.map do |record|
|
36
36
|
{
|
37
|
-
bulk: current_user.
|
37
|
+
bulk: current_user.admin? ? "<input type=\"checkbox\" data-bulk-row-edit=\"#{record.id}\">".html_safe : '',
|
38
38
|
link: link_to('<i class="fa fa-search"></i>'.html_safe, manage_questionnaire_path(record)),
|
39
39
|
note: note(record),
|
40
40
|
id: record.id,
|
data/app/mailers/mailer.rb
CHANGED
@@ -16,7 +16,7 @@ class Mailer < ApplicationMailer
|
|
16
16
|
|
17
17
|
def incomplete_reminder_email(user_id)
|
18
18
|
@user = User.find_by_id(user_id)
|
19
|
-
return if @user.blank? || @user.admin || @user.questionnaire || Time.now.to_date > Rails.configuration.hackathon['last_day_to_apply']
|
19
|
+
return if @user.blank? || @user.admin? || @user.questionnaire || Time.now.to_date > Rails.configuration.hackathon['last_day_to_apply']
|
20
20
|
mail(
|
21
21
|
to: @user.email,
|
22
22
|
subject: "Incomplete Application"
|
data/app/models/user.rb
CHANGED
@@ -13,6 +13,13 @@ class User < ApplicationRecord
|
|
13
13
|
|
14
14
|
after_create :queue_reminder_email
|
15
15
|
|
16
|
+
enum role: { user: 0, event_tracking: 1, admin_limited_access: 2, admin: 3 }
|
17
|
+
after_initialize :set_default_role, if: :new_record?
|
18
|
+
|
19
|
+
def set_default_role
|
20
|
+
self.role ||= :user
|
21
|
+
end
|
22
|
+
|
16
23
|
def active_for_authentication?
|
17
24
|
true
|
18
25
|
end
|
@@ -56,7 +63,11 @@ class User < ApplicationRecord
|
|
56
63
|
end
|
57
64
|
end
|
58
65
|
|
66
|
+
def self.non_admins
|
67
|
+
User.where.not(role: :admin).where.not(role: :admin_limited_access)
|
68
|
+
end
|
69
|
+
|
59
70
|
def self.without_questionnaire
|
60
|
-
|
71
|
+
non_admins.left_outer_joins(:questionnaire).where(questionnaires: { id: nil })
|
61
72
|
end
|
62
73
|
end
|
@@ -59,7 +59,7 @@
|
|
59
59
|
= active_link_to manage_trackable_tags_path, class: "nav-link" do
|
60
60
|
.fa.fa-tag.fa-fw.icon-space-r-half
|
61
61
|
Trackable Tags
|
62
|
-
-
|
62
|
+
- if current_user.admin?
|
63
63
|
%h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted
|
64
64
|
%span Advanced
|
65
65
|
%ul.nav.flex-column.mb-2
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
.form-inputs
|
13
13
|
= f.input :email, input_html: { "data-validate" => "presence" }, required: true
|
14
|
-
= f.input :
|
14
|
+
= f.input :role, collection: User.roles.to_a.collect{|c| [c[0].titleize, c[0]]}, include_blank: false
|
15
15
|
|
16
16
|
.center
|
17
17
|
= f.button :submit, value: ( @user.new_record? ? 'Create' : 'Save' ), class: 'btn-primary'
|
@@ -1,13 +1,17 @@
|
|
1
1
|
= render "layouts/manage/page_title", title: @user.email do
|
2
|
-
-
|
3
|
-
|
4
|
-
|
5
|
-
= link_to 'Delete', manage_admin_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
|
2
|
+
.btn-group
|
3
|
+
= link_to 'Edit', edit_manage_admin_path(@user), class: 'btn btn-sm btn-outline-secondary'
|
4
|
+
= link_to 'Delete', manage_admin_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
|
6
5
|
|
7
6
|
%div
|
8
7
|
%p
|
9
8
|
%b Email address:
|
10
9
|
= @user.email
|
10
|
+
|
11
|
+
%p
|
12
|
+
%b Role:
|
13
|
+
= @user.role.titleize
|
14
|
+
|
11
15
|
%p
|
12
|
-
%b
|
13
|
-
= @user.
|
16
|
+
%b Registered:
|
17
|
+
= display_datetime(@user.created_at)
|
@@ -9,8 +9,6 @@
|
|
9
9
|
.dropdown-menu.dropdown-menu-right{"aria-labelledby" => "title-actions"}
|
10
10
|
= link_to 'Send Bus Notes Update', send_update_email_manage_bus_list_path(@bus_list), method: :patch, data: { confirm: "Are you sure? All passengers for \"#{@bus_list.name}\" will be immediatley emailed the current bus notes." }, class: 'dropdown-item'
|
11
11
|
= link_to 'Create message (signed up passengers)', new_manage_message_path(type: 'bulk', recipients: ["bus-list::#{@bus_list.id}"]), class: 'dropdown-item'
|
12
|
-
= link_to 'Create message (eligible, not signed up)', new_manage_message_path(type: 'bulk', recipients: ["bus-list::#{@bus_list.id}"]), class: 'dropdown-item'
|
13
|
-
= link_to 'Create message (applied/not yet accepted)', new_manage_message_path(type: 'bulk', recipients: ["bus-list::#{@bus_list.id}"]), class: 'dropdown-item'
|
14
12
|
|
15
13
|
.row
|
16
14
|
.col-lg-6
|
@@ -71,14 +69,14 @@
|
|
71
69
|
%td= link_to p.school.name, manage_school_path(p.school)
|
72
70
|
%td= p.boarded_bus? ? '<span class="text-success">Yes</span>'.html_safe : 'No'
|
73
71
|
%td= p.checked_in? ? '<span class="text-success">Yes</span>'.html_safe : 'No'
|
74
|
-
- if current_user.
|
75
|
-
%td= p.is_bus_captain? ? "Yes" : "No"
|
76
|
-
- else
|
72
|
+
- if current_user.admin?
|
77
73
|
%td
|
78
74
|
- if p.is_bus_captain?
|
79
75
|
= link_to "Remove", toggle_bus_captain_manage_bus_list_path(@bus_list, questionnaire_id: p.id, bus_captain: '0'), method: 'post', class: 'text-danger'
|
80
76
|
- else
|
81
77
|
= link_to "Promote", toggle_bus_captain_manage_bus_list_path(@bus_list, questionnaire_id: p.id, bus_captain: '1'), method: 'post', data: { confirm: "Are you sure you want to make #{p.full_name} a bus captain? They will receive a confirmation email." }
|
78
|
+
- else
|
79
|
+
%td= p.is_bus_captain? ? "Yes" : "No"
|
82
80
|
|
83
81
|
- if @bus_list.needs_bus_captain
|
84
82
|
%h4.mt-4.pb-2 Possible Bus Captains
|
@@ -91,7 +89,7 @@
|
|
91
89
|
%th Email
|
92
90
|
%th Phone Number
|
93
91
|
%th School
|
94
|
-
-
|
92
|
+
- if current_user.admin?
|
95
93
|
%th Actions
|
96
94
|
%tbody
|
97
95
|
- @bus_list.passengers.select { |q| q.bus_captain_interest }.each do |p|
|
@@ -102,7 +100,7 @@
|
|
102
100
|
%td= p.email
|
103
101
|
%td= phone_link_to p.phone
|
104
102
|
%td= link_to p.school.name, manage_school_path(p.school)
|
105
|
-
-
|
103
|
+
- if current_user.admin?
|
106
104
|
%td
|
107
105
|
- if p.is_bus_captain?
|
108
106
|
= 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'
|
@@ -8,7 +8,7 @@
|
|
8
8
|
%small
|
9
9
|
= @questionnaire.acc_status_author_id ? @questionnaire.acc_status_author.email : "(no author)"
|
10
10
|
= @questionnaire.acc_status_date ? display_datetime(@questionnaire.acc_status_date, in_sentence: true) : "(no date)"
|
11
|
-
-
|
11
|
+
- if current_user.admin?
|
12
12
|
= bs_vertical_simple_form @questionnaire, url: url_for(action: "update_acc_status", controller: "questionnaires") do |f|
|
13
13
|
= 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
|
14
14
|
= f.button :submit, value: "Update Status", class: 'btn-primary'
|
@@ -9,14 +9,14 @@
|
|
9
9
|
= render 'check_in_badge'
|
10
10
|
|
11
11
|
.btn-group{role: "group"}
|
12
|
-
-
|
12
|
+
- if current_user.admin?
|
13
13
|
= link_to 'Edit', edit_manage_questionnaire_path(@questionnaire), class: 'btn btn-sm btn-outline-secondary'
|
14
|
-
-
|
14
|
+
- if current_user.admin?
|
15
15
|
.btn-group{role: "group"}
|
16
16
|
%button.btn.btn-sm.btn-outline-secondary.dropdown-toggle#title-actions{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button"}
|
17
17
|
.fa.fa-cog
|
18
18
|
.dropdown-menu.dropdown-menu-right{"aria-labelledby" => "title-actions"}
|
19
|
-
= link_to 'Convert to Admin', convert_to_admin_manage_questionnaire_path(@questionnaire), method: :patch, data: { confirm: "Are you sure? The questionnaire for \"#{@questionnaire.full_name}\" will be permanently erased. This action is irreversible." }, class: 'dropdown-item'
|
19
|
+
= link_to 'Convert to Admin', convert_to_admin_manage_questionnaire_path(@questionnaire), method: :patch, data: { confirm: "Are you sure? The questionnaire for \"#{@questionnaire.full_name}\" will be permanently erased, and \"#{@questionnaire.email}\" will become an admin. This action is irreversible." }, class: 'dropdown-item'
|
20
20
|
|
21
21
|
= render 'overview'
|
22
22
|
|
@@ -2,10 +2,12 @@
|
|
2
2
|
|
3
3
|
= bs_horizontal_simple_form_for :trackable_event, method: 'get' do |f|
|
4
4
|
.form-row
|
5
|
-
.col-auto
|
6
|
-
= f.input :user_id, collection: User.where(admin: true), label_method: :email, value_method: :id, include_blank: '(show all)', required: false, selected: @params['user_id']
|
7
5
|
.col-auto
|
8
6
|
= f.input :band_id, as: :string, required: false, input_html: { value: @params['band_id'] }, placeholder: '(show all)'
|
7
|
+
.col-auto
|
8
|
+
= f.input :trackable_tag_id, collection: TrackableTag.all, label_method: :name, value_method: :id, include_blank: '(show all)', required: false, selected: @params['trackable_tag_id']
|
9
|
+
.col-auto
|
10
|
+
= f.input :user_id, collection: User.where.not(role: :user), label_method: :email, value_method: :id, include_blank: '(show all)', required: false, selected: @params['user_id']
|
9
11
|
.col-auto
|
10
12
|
= f.button :submit, 'Filter', class: 'btn btn-primary'
|
11
13
|
|
@@ -26,7 +28,7 @@
|
|
26
28
|
%td= trackable_event.trackable_tag.name
|
27
29
|
%td= trackable_event.user.email
|
28
30
|
%td= link_to 'Show', manage_trackable_event_path(trackable_event)
|
29
|
-
-
|
31
|
+
- if current_user.admin? || current_user == trackable_event.user
|
30
32
|
%td= link_to 'Edit', edit_manage_trackable_event_path(trackable_event)
|
31
33
|
%td= link_to 'Destroy', manage_trackable_event_path(trackable_event), method: :delete, data: { confirm: 'Are you sure?' }
|
32
34
|
- else
|
@@ -27,5 +27,5 @@
|
|
27
27
|
%td= trackable_event.band_id
|
28
28
|
%td= trackable_event.user.email
|
29
29
|
%td
|
30
|
-
-
|
30
|
+
- if current_user.admin? || current_user == trackable_event.user
|
31
31
|
= link_to 'Edit', edit_manage_trackable_event_path(trackable_event)
|
@@ -27,9 +27,9 @@ class BulkMessageWorker
|
|
27
27
|
def self.user_ids(type)
|
28
28
|
case type
|
29
29
|
when "all"
|
30
|
-
User.
|
30
|
+
User.non_admins.pluck(:id)
|
31
31
|
when "incomplete"
|
32
|
-
User.
|
32
|
+
User.non_admins.pluck(:id) - Questionnaire.pluck(:user_id)
|
33
33
|
when "complete"
|
34
34
|
Questionnaire.pluck(:user_id)
|
35
35
|
when "accepted"
|
data/config/locales/en.yml
CHANGED
@@ -39,7 +39,7 @@ en:
|
|
39
39
|
If many people have already RSVP'd, consider sending a message out to this bus list asking for interest as well.
|
40
40
|
notes: Notes are shared with applicants. Supports Markdown and HTML.
|
41
41
|
user:
|
42
|
-
|
42
|
+
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.
|
43
43
|
message:
|
44
44
|
type: Bulk emails are sent once, manually. Automated emails are sent upon a desired trigger/event.
|
45
45
|
name: A friendly name to recognize this email. Applicants won't see this.
|
data/config/routes.rb
CHANGED
@@ -8,7 +8,7 @@ Rails.application.routes.draw do
|
|
8
8
|
|
9
9
|
mount MailPreview => 'mail_view' if Rails.env.development?
|
10
10
|
|
11
|
-
authenticate :user, ->(u) { u.admin?
|
11
|
+
authenticate :user, ->(u) { u.admin? } do
|
12
12
|
mount Sidekiq::Web => '/sidekiq'
|
13
13
|
mount Blazer::Engine, at: "blazer"
|
14
14
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class AddRoleToUsers < ActiveRecord::Migration[5.2]
|
2
|
+
def up
|
3
|
+
add_column :users, :role, :integer, default: 0
|
4
|
+
|
5
|
+
User.where(admin: true).each do |user|
|
6
|
+
user.update_attribute(:role, :admin)
|
7
|
+
end
|
8
|
+
|
9
|
+
User.where(admin_limited_access: true).each do |user|
|
10
|
+
user.update_attribute(:role, :admin_limited_access)
|
11
|
+
end
|
12
|
+
|
13
|
+
remove_column :users, :admin, :boolean
|
14
|
+
remove_column :users, :admin_limited_access, :boolean
|
15
|
+
end
|
16
|
+
end
|
data/test/factories/users.rb
CHANGED
@@ -4,21 +4,20 @@ FactoryBot.define do
|
|
4
4
|
"foo#{n}@example.com"
|
5
5
|
end
|
6
6
|
password { "password" }
|
7
|
+
role { :user }
|
7
8
|
|
8
9
|
factory :admin do
|
9
10
|
sequence :email do |n|
|
10
11
|
"admin#{n}@example.com"
|
11
12
|
end
|
12
|
-
|
13
|
-
admin_limited_access { false }
|
13
|
+
role { :admin }
|
14
14
|
end
|
15
15
|
|
16
16
|
factory :limited_access_admin do
|
17
17
|
sequence :email do |n|
|
18
18
|
"limited_admin#{n}@example.com"
|
19
19
|
end
|
20
|
-
|
21
|
-
admin_limited_access { true }
|
20
|
+
role { :admin_limited_access }
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hackathon_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stuart Olivera
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -707,6 +707,7 @@ files:
|
|
707
707
|
- db/migrate/20190107232955_create_trackable_tags.rb
|
708
708
|
- db/migrate/20190107233210_create_trackable_events.rb
|
709
709
|
- db/migrate/20190113231044_refactor_bus_lists.rb
|
710
|
+
- db/migrate/20190118204143_add_role_to_users.rb
|
710
711
|
- db/schools.csv
|
711
712
|
- db/seed_messages/questionnaire--accepted.md
|
712
713
|
- db/seed_messages/questionnaire--denied.md
|