hackathon_manager 0.10.3 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99f475dde632563cf2d5c4adf80ad8b500b80a088dfcaa843386dae839fb23ae
4
- data.tar.gz: 4d28ed86f0e80eaccb6c08d66446f2bc37676d20522da0299b41c950edcd4d07
3
+ metadata.gz: de045d24ad6751129f094dc294549b9eb0931d8619d3873142f862ba286ba0c8
4
+ data.tar.gz: 43adf2336dce9187e1a430f99b6ae87cc82f827b06dbffdaa83cb974c69c1d92
5
5
  SHA512:
6
- metadata.gz: 9775467de28e6342a843871c6cd9c673d0f746d654a2144d2774ed0681cbecc5d7979d142dd99097817bf5b89bed366146c44814de601ffdcb4da091b7b07866
7
- data.tar.gz: c65519396f46cc143b198c41f45d8dead6ebe8fa9f0b6c26933282d5ad1d190c03b295ecdc38a8af0b6c4412201a47fcbff5ff7d4c5e414c83aae018459e6d15
6
+ metadata.gz: d29229b913d9af245341d9826308a6fcf53bd5c1c4bff7aacf2aad0e50f0a5351de3766b4571ebc3bd63867fd6f89d60cb6850179a912544dc8f5a1e4974491b
7
+ data.tar.gz: 1c33c481248ac95f4ae82ee9ab150e42aa812a6529c5a010a9886478495d1ae77ee1f428de676869e36a8fb01f6467445fdffe86968e754e6a681d4b412cbf57
@@ -1,6 +1,7 @@
1
1
  class Manage::ApplicationController < ApplicationController
2
2
  before_action :logged_in
3
3
  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
+ skip_before_action :verify_authenticity_token, if: :json_request?
4
5
 
5
6
  def logged_in
6
7
  authenticate_user!
@@ -10,4 +11,8 @@ class Manage::ApplicationController < ApplicationController
10
11
  def limit_admin_access
11
12
  redirect_to url_for(controller: controller_name, action: :index) if current_user.admin_limited_access
12
13
  end
14
+
15
+ def json_request?
16
+ request.format.json?
17
+ end
13
18
  end
@@ -0,0 +1,85 @@
1
+ class Manage::TrackableEventsController < Manage::ApplicationController
2
+ before_action :set_trackable_event, only: [:show, :edit, :update, :destroy]
3
+ before_action :scope_limited_admin_access, only: [:edit, :update, :destroy]
4
+
5
+ respond_to :html, :json
6
+
7
+ # GET /manage/trackable_events
8
+ def index
9
+ @trackable_events = TrackableEvent.all
10
+ respond_with(:manage, @trackable_events)
11
+ end
12
+
13
+ # GET /manage/trackable_events/1
14
+ def show
15
+ respond_with(:manage, @trackable_event)
16
+ end
17
+
18
+ # GET /manage/trackable_events/new
19
+ def new
20
+ trackable_tag_id = params[:trackable_tag_id]
21
+ @trackable_event = TrackableEvent.new(trackable_tag_id: trackable_tag_id)
22
+ respond_with(:manage, @trackable_event)
23
+ end
24
+
25
+ # GET /manage/trackable_events/1/edit
26
+ def edit
27
+ end
28
+
29
+ # POST /manage/trackable_events
30
+ def create
31
+ @trackable_event = TrackableEvent.new(trackable_event_params.merge(user_id: current_user.id))
32
+
33
+ if @trackable_event.save
34
+ respond_to do |format|
35
+ format.html { redirect_to manage_trackable_tag_path(@trackable_event.trackable_tag), notice: 'Trackable event was successfully created.' }
36
+ format.json { render json: @trackable_event }
37
+ end
38
+ else
39
+ render :new
40
+ end
41
+ end
42
+
43
+ # PATCH/PUT /manage/trackable_events/1
44
+ def update
45
+ if @trackable_event.update(trackable_event_params)
46
+ respond_to do |format|
47
+ format.html { redirect_to manage_trackable_tag_path(@trackable_event.trackable_tag), notice: 'Trackable event was successfully updated.' }
48
+ format.json { render json: @trackable_event }
49
+ end
50
+ else
51
+ render :edit
52
+ end
53
+ end
54
+
55
+ # DELETE /manage/trackable_events/1
56
+ def destroy
57
+ @trackable_event.destroy
58
+ respond_to do |format|
59
+ format.html { redirect_to manage_trackable_tag_url(@trackable_event.trackable_tag), notice: 'Trackable event was successfully destroyed.' }
60
+ format.json { render json: @trackable_event }
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ # Use callbacks to share common setup or constraints between actions.
67
+ def set_trackable_event
68
+ @trackable_event = TrackableEvent.find(params[:id])
69
+ end
70
+
71
+ # Only allow a trusted parameter "white list" through.
72
+ def trackable_event_params
73
+ params.require(:trackable_event).permit(:band_id, :trackable_tag_id)
74
+ end
75
+
76
+ # Permit limited-access admins (overrides Manage::ApplicationController#limit_admin_access)
77
+ def limit_admin_access
78
+ end
79
+
80
+ # If the admin is limited, scope changes only to those they created
81
+ def scope_limited_admin_access
82
+ return if !current_user.admin_limited_access || @trackable_event.blank? || @trackable_event.user.blank?
83
+ redirect_to manage_trackable_events_path, notice: 'You may not view events you did not create.' if @trackable_event.user != current_user
84
+ end
85
+ end
@@ -0,0 +1,67 @@
1
+ class Manage::TrackableTagsController < Manage::ApplicationController
2
+ before_action :set_trackable_tag, only: [:show, :edit, :update, :destroy]
3
+
4
+ respond_to :html, :json
5
+
6
+ # GET /manage/trackable_tags
7
+ def index
8
+ @trackable_tags = TrackableTag.all
9
+ respond_with(:manage, @trackable_tags)
10
+ end
11
+
12
+ # GET /manage/trackable_tags/1
13
+ def show
14
+ respond_with(:manage, @trackable_tag)
15
+ end
16
+
17
+ # GET /manage/trackable_tags/new
18
+ def new
19
+ @trackable_tag = TrackableTag.new
20
+ respond_with(:manage, @questionnaire)
21
+ end
22
+
23
+ # GET /manage/trackable_tags/1/edit
24
+ def edit
25
+ end
26
+
27
+ # POST /manage/trackable_tags
28
+ def create
29
+ @trackable_tag = TrackableTag.new(trackable_tag_params)
30
+
31
+ if @trackable_tag.save
32
+ flash[:notice] = 'Trackable tag was successfully created.'
33
+ respond_with(:manage, @trackable_tag)
34
+ else
35
+ render :new
36
+ end
37
+ end
38
+
39
+ # PATCH/PUT /manage/trackable_tags/1
40
+ def update
41
+ if @trackable_tag.update(trackable_tag_params)
42
+ flash[:notice] = 'Trackable tag was successfully updated.'
43
+ respond_with(:manage, @trackable_tag)
44
+ else
45
+ render :edit
46
+ end
47
+ end
48
+
49
+ # DELETE /manage/trackable_tags/1
50
+ def destroy
51
+ @trackable_tag.destroy
52
+ flash[:notice] = 'Trackable tag was successfully destroyed.'
53
+ respond_with(:manage, @trackable_tag)
54
+ end
55
+
56
+ private
57
+
58
+ # Use callbacks to share common setup or constraints between actions.
59
+ def set_trackable_tag
60
+ @trackable_tag = TrackableTag.find(params[:id])
61
+ end
62
+
63
+ # Only allow a trusted parameter "white list" through.
64
+ def trackable_tag_params
65
+ params.require(:trackable_tag).permit(:name)
66
+ end
67
+ end
@@ -0,0 +1,8 @@
1
+ class TrackableEvent < ApplicationRecord
2
+ validates_presence_of :band_id, :trackable_tag, :user
3
+
4
+ strip_attributes
5
+
6
+ belongs_to :trackable_tag
7
+ belongs_to :user
8
+ end
@@ -0,0 +1,10 @@
1
+ class TrackableTag < ApplicationRecord
2
+ validates_presence_of :name
3
+ validates_uniqueness_of :name
4
+ strip_attributes
5
+ has_many :trackable_events
6
+
7
+ def sorted_events
8
+ trackable_events.order(created_at: :desc)
9
+ end
10
+ end
@@ -55,6 +55,10 @@
55
55
  = active_link_to manage_stats_path, class: "nav-link" do
56
56
  .fa.fa-table.fa-fw.icon-space-r-half
57
57
  Stats
58
+ %li.nav-item
59
+ = active_link_to manage_trackable_tags_path, class: "nav-link" do
60
+ .fa.fa-tag.fa-fw.icon-space-r-half
61
+ Trackable Tags
58
62
  - unless current_user.admin_limited_access?
59
63
  %h6.sidebar-heading.d-flex.justify-content-between.align-items-center.px-3.mt-4.mb-1.text-muted
60
64
  %span Advanced
@@ -0,0 +1,14 @@
1
+ .form-container
2
+ = bs_horizontal_simple_form_for @trackable_event, url: url_for(action: @trackable_event.new_record? ? "create" : "update", controller: "trackable_events"), html: { "data-validate" => "form" } do |f|
3
+ = f.error_notification
4
+
5
+ .form-inputs
6
+ = f.input :band_id
7
+ = f.input :trackable_tag_id, collection: TrackableTag.all, required: true
8
+ %p
9
+ User:
10
+ = current_user.email
11
+ (current user, this can't be changed)
12
+
13
+ .form-actions
14
+ = f.button :submit, class: 'btn-primary'
@@ -0,0 +1,11 @@
1
+ = render "layouts/manage/page_title", title: "Edit Trackable Event", subtitle: @trackable_event.id
2
+
3
+ = render 'form'
4
+
5
+ %br
6
+
7
+ = link_to 'Show', manage_trackable_event_path(@trackable_event)
8
+ \|
9
+ = link_to 'Back', manage_trackable_events_path
10
+ \|
11
+ = link_to 'Destroy', manage_trackable_event_path(@trackable_event), method: :delete, data: { confirm: 'Are you sure?' }
@@ -0,0 +1,29 @@
1
+ = render "layouts/manage/page_title", title: "Trackable Events"
2
+
3
+ %table.table.table-striped
4
+ %thead
5
+ %tr
6
+ %th Band
7
+ %th Trackable tag
8
+ %th User
9
+ %th
10
+ %th
11
+ %th
12
+
13
+ %tbody
14
+ - @trackable_events.each do |trackable_event|
15
+ %tr
16
+ %td= trackable_event.band_id
17
+ %td= trackable_event.trackable_tag.name
18
+ %td= trackable_event.user.email
19
+ %td= link_to 'Show', manage_trackable_event_path(trackable_event)
20
+ - unless current_user.admin_limited_access && current_user != trackable_event.user
21
+ %td= link_to 'Edit', edit_manage_trackable_event_path(trackable_event)
22
+ %td= link_to 'Destroy', manage_trackable_event_path(trackable_event), method: :delete, data: { confirm: 'Are you sure?' }
23
+ - else
24
+ %td
25
+ %td
26
+
27
+ %br
28
+
29
+ = link_to 'New Trackable event', new_manage_trackable_event_path
@@ -0,0 +1,3 @@
1
+ = render "layouts/manage/page_title", title: "New Trackable Event"
2
+
3
+ = render 'form'
@@ -0,0 +1,18 @@
1
+ = render "layouts/manage/page_title", title: "Trackable Event", subtitle: @trackable_event.id
2
+
3
+ %p
4
+ %b Band:
5
+ = @trackable_event.band_id
6
+ %p
7
+ %b Created:
8
+ = display_datetime(@trackable_event.created_at)
9
+ %p
10
+ %b Trackable tag:
11
+ = link_to @trackable_event.trackable_tag.name, manage_trackable_tag_path(@trackable_event.trackable_tag)
12
+ %p
13
+ %b User:
14
+ = link_to @trackable_event.user.email, manage_admin_path(@trackable_event.user)
15
+
16
+ = link_to 'Edit', edit_manage_trackable_event_path(@trackable_event)
17
+ \|
18
+ = link_to 'Back', manage_trackable_events_path
@@ -0,0 +1,9 @@
1
+ .form-container
2
+ = bs_horizontal_simple_form_for @trackable_tag, url: url_for(action: @trackable_tag.new_record? ? "create" : "update", controller: "trackable_tags"), html: { "data-validate" => "form" } do |f|
3
+ = f.error_notification
4
+
5
+ .form-inputs
6
+ = f.input :name
7
+
8
+ .form-actions
9
+ = f.button :submit, class: 'btn-primary'
@@ -0,0 +1,4 @@
1
+ = render "layouts/manage/page_title", title: "Edit Trackable Tag", subtitle: @trackable_tag.name do
2
+ = link_to 'Cancel', manage_trackable_tag_path(@trackable_tag), class: 'btn btn-sm btn-outline-secondary'
3
+
4
+ = render 'form'
@@ -0,0 +1,20 @@
1
+ = render "layouts/manage/page_title", title: "Trackable Tags" do
2
+ = link_to "New Tag", new_manage_trackable_tag_path, class: "btn btn-sm btn-outline-secondary"
3
+
4
+ %table.table.table-striped
5
+ %thead
6
+ %tr
7
+ %th Name
8
+ %th Events
9
+ %th Last event
10
+ %th Add event
11
+
12
+ %tbody
13
+ - @trackable_tags.each do |trackable_tag|
14
+ %tr
15
+ %td= link_to trackable_tag.name, manage_trackable_tag_path(trackable_tag)
16
+ %td= pluralize(trackable_tag.trackable_events.count, "event")
17
+ %td= trackable_tag.trackable_events.any? ? display_datetime(trackable_tag.sorted_events.first.created_at) : ''
18
+ %td= link_to 'Add event', new_manage_trackable_event_path(trackable_tag_id: trackable_tag.id)
19
+
20
+ %br
@@ -0,0 +1,4 @@
1
+ = render "layouts/manage/page_title", title: "New Trackable Tag" do
2
+ = link_to 'Cancel', manage_trackable_tags_path, class: 'btn btn-sm btn-outline-secondary'
3
+
4
+ = render 'form'
@@ -0,0 +1,31 @@
1
+ = render "layouts/manage/page_title", title: @trackable_tag.name, subtitle: "Trackable Tag" do
2
+ .btn-group
3
+ = link_to 'Edit', edit_manage_trackable_tag_path(@trackable_tag), class: 'btn btn-sm btn-outline-secondary'
4
+ = link_to 'Delete', manage_trackable_tag_path(@trackable_tag), method: :delete, data: { confirm: "Are you sure? The trackable tag \"#{@trackable_tag.name}\" will be permanently erased. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
5
+
6
+ %p
7
+ %b Name:
8
+ = @trackable_tag.name
9
+
10
+ %p
11
+ %b= link_to 'Add event', new_manage_trackable_event_path(trackable_tag_id: @trackable_tag.id)
12
+
13
+ = area_chart @trackable_tag.trackable_events.group_by_minute(:created_at).count
14
+
15
+ %table.table.table-striped
16
+ %thead
17
+ %tr
18
+ %th Date
19
+ %th Band
20
+ %th Entered by
21
+ %th
22
+
23
+ %tbody
24
+ - @trackable_tag.sorted_events.each do |trackable_event|
25
+ %tr
26
+ %td= display_datetime(trackable_event.created_at)
27
+ %td= trackable_event.band_id
28
+ %td= trackable_event.user.email
29
+ %td
30
+ - unless current_user.admin_limited_access && current_user != trackable_event.user
31
+ = link_to 'Edit', edit_manage_trackable_event_path(trackable_event)
data/config/routes.rb CHANGED
@@ -77,5 +77,7 @@ Rails.application.routes.draw do
77
77
  end
78
78
  resource :config do
79
79
  end
80
+ resources :trackable_events
81
+ resources :trackable_tags
80
82
  end
81
83
  end
@@ -0,0 +1,10 @@
1
+ class CreateTrackableTags < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :trackable_tags do |t|
4
+ t.string :name
5
+
6
+ t.timestamps
7
+ end
8
+ add_index :trackable_tags, :name, unique: true
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateTrackableEvents < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :trackable_events do |t|
4
+ t.string :band_id
5
+ t.references :trackable_tag, foreign_key: true
6
+ t.references :user, type: :integer, foreign_key: true
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module HackathonManager
2
- VERSION = '0.10.3'.freeze
2
+ VERSION = '0.11.0'.freeze
3
3
  end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :trackable_event do
3
+ band_id { "foo" }
4
+ association :user
5
+ association :trackable_tag
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :trackable_tag do
3
+ sequence :name do |n|
4
+ "Tag #{n}"
5
+ end
6
+ end
7
+ 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.10.3
4
+ version: 0.11.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-06 00:00:00.000000000 Z
11
+ date: 2019-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -531,6 +531,8 @@ files:
531
531
  - app/controllers/manage/questionnaires_controller.rb
532
532
  - app/controllers/manage/schools_controller.rb
533
533
  - app/controllers/manage/stats_controller.rb
534
+ - app/controllers/manage/trackable_events_controller.rb
535
+ - app/controllers/manage/trackable_tags_controller.rb
534
536
  - app/controllers/questionnaires_controller.rb
535
537
  - app/controllers/rsvps_controller.rb
536
538
  - app/controllers/users/omniauth_callbacks_controller.rb
@@ -557,6 +559,8 @@ files:
557
559
  - app/models/questionnaire.rb
558
560
  - app/models/school.rb
559
561
  - app/models/school_name_duplicate.rb
562
+ - app/models/trackable_event.rb
563
+ - app/models/trackable_tag.rb
560
564
  - app/models/user.rb
561
565
  - app/views/application/_bus_list_info.html.haml
562
566
  - app/views/application/_bus_list_stats.html.haml
@@ -622,6 +626,16 @@ files:
622
626
  - app/views/manage/schools/new.html.haml
623
627
  - app/views/manage/schools/show.html.haml
624
628
  - app/views/manage/stats/index.html.haml
629
+ - app/views/manage/trackable_events/_form.html.haml
630
+ - app/views/manage/trackable_events/edit.html.haml
631
+ - app/views/manage/trackable_events/index.html.haml
632
+ - app/views/manage/trackable_events/new.html.haml
633
+ - app/views/manage/trackable_events/show.html.haml
634
+ - app/views/manage/trackable_tags/_form.html.haml
635
+ - app/views/manage/trackable_tags/edit.html.haml
636
+ - app/views/manage/trackable_tags/index.html.haml
637
+ - app/views/manage/trackable_tags/new.html.haml
638
+ - app/views/manage/trackable_tags/show.html.haml
625
639
  - app/views/questionnaires/_form.html.haml
626
640
  - app/views/questionnaires/edit.html.haml
627
641
  - app/views/questionnaires/new.html.haml
@@ -692,6 +706,8 @@ files:
692
706
  - db/migrate/20181125213158_add_grad_year_and_race_ethnicity_to_questionnaires.rb
693
707
  - db/migrate/20181221194407_create_doorkeeper_tables.rb
694
708
  - db/migrate/20181221195241_enable_pkce.rb
709
+ - db/migrate/20190107232955_create_trackable_tags.rb
710
+ - db/migrate/20190107233210_create_trackable_events.rb
695
711
  - db/schools.csv
696
712
  - db/seed_messages/questionnaire--accepted.md
697
713
  - db/seed_messages/questionnaire--denied.md
@@ -711,6 +727,8 @@ files:
711
727
  - test/factories/school.rb
712
728
  - test/factories/school_name_duplicate.rb
713
729
  - test/factories/temp_doorkeeper.rb
730
+ - test/factories/trackable_event.rb
731
+ - test/factories/trackable_tag.rb
714
732
  - test/factories/users.rb
715
733
  homepage: https://github.com/sman591/hackathon_manager
716
734
  licenses: