hackathon_manager 0.10.3 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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: