From 4c764c104d4b54c09d8f79e18ecf87fd9a0904fb Mon Sep 17 00:00:00 2001 From: An Ju Date: Wed, 10 Apr 2019 16:38:56 -0700 Subject: [PATCH] Analysis (#35) * show all activities * Fix user recording. * Infer meetings. * Added tests for session inference. * Fixed rspec tests. * Updated UI. * Updated UI and added some basic numbers for a meeting. --- .ruby-version | 2 +- Gemfile | 1 + Gemfile.lock | 2 + app/controllers/activities_controller.rb | 5 + app/controllers/application_controller.rb | 2 +- app/helpers/activities_helper.rb | 20 ++++ app/models/activity.rb | 18 +++- app/views/activities/index.html.erb | 24 +++++ app/views/activities/meetings.html.erb | 94 ++++++++++++++++++ config/routes.rb | 6 +- db/development | Bin 108544 -> 0 bytes ...20190409034843_add_username_to_activity.rb | 5 + db/schema.rb | 3 +- db/test | Bin 12288 -> 0 bytes spec/controllers/dashboard_controller_spec.rb | 16 +-- spec/factories.rb | 3 + spec/models/activity_spec.rb | 23 ++++- spec/routing/activities_routing_spec.rb | 12 +-- 18 files changed, 212 insertions(+), 24 deletions(-) create mode 100644 app/views/activities/index.html.erb create mode 100644 app/views/activities/meetings.html.erb delete mode 100644 db/development create mode 100644 db/migrate/20190409034843_add_username_to_activity.rb delete mode 100644 db/test diff --git a/.ruby-version b/.ruby-version index b1b25a5..bc4abe8 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.2.2 +2.3.8 diff --git a/Gemfile b/Gemfile index 998fb63..9997fca 100644 --- a/Gemfile +++ b/Gemfile @@ -33,6 +33,7 @@ gem "omniauth-google-oauth2" gem 'omniauth-oauth2', '~> 1.3.1' gem 'rspec-rails', '~> 3.6.1', group: [:test, :development] +gem 'rb-readline' group :test do gem 'factory_bot_rails' diff --git a/Gemfile.lock b/Gemfile.lock index 714eefb..8dec7d4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -285,6 +285,7 @@ GEM rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) + rb-readline (0.5.5) rdoc (4.3.0) ref (2.0.0) representable (3.0.4) @@ -431,6 +432,7 @@ DEPENDENCIES rack_session_access rails (~> 4.2.10) rails_12factor + rb-readline responders (~> 2.0) rest-client rspec-rails (~> 3.6.1) diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb index de893a2..c7e096d 100644 --- a/app/controllers/activities_controller.rb +++ b/app/controllers/activities_controller.rb @@ -1,4 +1,5 @@ class ActivitiesController < ApplicationController + layout false before_action :set_activity, only: [:show, :destroy] # GET /activities @@ -12,6 +13,10 @@ def index def show end + def meetings + @meetings = Activity.infer_meetings + end + # POST /activities.json def create @activity = Activity.new(activity_params) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 92d097f..f57ae67 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -36,7 +36,7 @@ def rescue_steps(message) def record_activity activity_param = { activity_type: "#{params[:controller]}\##{params[:action]}", - user_id: current_user.nil? ? nil : current_user[:id], + username: current_user.nil? ? nil : current_user['username'] } if params[:action].eql? 'project' diff --git a/app/helpers/activities_helper.rb b/app/helpers/activities_helper.rb index 4e9784c..1466b35 100644 --- a/app/helpers/activities_helper.rb +++ b/app/helpers/activities_helper.rb @@ -1,2 +1,22 @@ module ActivitiesHelper + def meeting_start(meetings) + meetings.first.created_at + end + + def meeting_length(meetings) + ((meetings.last.created_at - meetings.first.created_at) / 60.0).round(2) + end + + def num_stories_updated(meetings) + meetings.select { |act| act.activity_type.eql? 'dashboard#update' } + .map(&:story_id).uniq.length + end + + def num_votes(meetings) + meetings.select { |act| act.activity_type.eql? 'dashboard#vote' }.length + end + + def num_participants(meetings) + meetings.map(&:username).uniq.length + end end diff --git a/app/models/activity.rb b/app/models/activity.rb index 6fb8a9e..a3303a8 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -1,4 +1,20 @@ class Activity < ActiveRecord::Base - belongs_to :user belongs_to :vote, required: false + + def self.infer_meetings + prev_time = Activity.first.created_at + meetings = [] + current_meeting = [] + Activity.all.each do |activity| + if (activity.created_at - prev_time) > 60 * 60 + meetings.push(current_meeting.clone) + current_meeting = [activity] + else + current_meeting.push(activity) + end + prev_time = activity.created_at + end + meetings.push(current_meeting.clone) + meetings + end end diff --git a/app/views/activities/index.html.erb b/app/views/activities/index.html.erb new file mode 100644 index 0000000..8babf62 --- /dev/null +++ b/app/views/activities/index.html.erb @@ -0,0 +1,24 @@ + + + + + + + + + + + + + <%- @activities.each do |activity| %> + + + + + + + + + <% end %> + +
Project IDStory IDUserActivity TypeActivity DataTimestamp
<%= activity.project_id %><%= activity.story_id %><%= activity.username %><%= activity.activity_type %><%= activity.activity_data %><%= activity.created_at %>
diff --git a/app/views/activities/meetings.html.erb b/app/views/activities/meetings.html.erb new file mode 100644 index 0000000..4dee37f --- /dev/null +++ b/app/views/activities/meetings.html.erb @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + <%- @meetings.each_with_index do |meeting, ind| %> + + + + + + + + + + <% end %> + + +
Meeting NumberStarted AtLength of the meetingParticipantsStory updatedVotesSee more
+ Meeting <%= ind %> + + <%= meeting_start(meeting) %> + + <%= meeting_length(meeting) %> minutes + + <%= num_participants(meeting) %> participants + + <%= num_stories_updated(meeting) %> stories updated + + <%= num_votes(meeting) %> votes + + +
+ +<%- @meetings.each_with_index do |meeting, ind| %> + + +<% end %> + diff --git a/config/routes.rb b/config/routes.rb index 36624e0..dfcb226 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,5 +28,9 @@ get 'discussion/:story_id', action: :discussion, as: :discussion end - resources :activities, only: [:index, :show, :create, :destroy] + resources :activities, only: [:index] do + collection do + get 'meetings' + end + end end \ No newline at end of file diff --git a/db/development b/db/development deleted file mode 100644 index f251d365a2f0f854de44bce87cfb6ce924c82924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108544 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 UT!|b_=^hg^QuY zc=8MQF^nP6Z(uxnRL>qcdhz1ScDvh_QV>lcFq?E|<~Q^H%zi_RZY^wiy0qYla$4_vIYr3~&be z$-p4I%FMM^bwAB>Tbu#Tz?m}8tbh0m{)FGo)D>==Gr$@6pA1}UQ5I?Gv+i(X>^A)V z?;wW{IRlr20bc)?BhGx6oPll(H2?p1o8uT~fHQEh8Q}GQvE$2k#~J9w0IPo}h6VAf zxGRRiTj7)NzSsH_&DEC&BzbHM>^a1ETE-i8^*JsQr`d)VPNan|>Kg;wP?8s-pnk)& zN_g9S=|+*5HItaw(W{oeK$fc6`6iR0wq@Ez9hm3-jvPcOe6*R7R>J)WZ z49l??SalP{*(}qK(Yk{-x3E>j9Yg3@%qQ<>QmA8c+%hV7f=a4;F(Ap&D0m%pbq02W zp4g_T!!@&{&`sr24^ug`oJ%hzbF1i4Y8535`K5H0N-n0dd6ZqEzd|N6f&9H7(;|2c z+Z3u*={A_60P>Q*19eE%-s!+RKX-Jpvw;;7Z{E_RtWzxv&PH`Pq z483Bm*#yH755Dxa7nD^uSl&E5^eab8w!S}H-FJ4Tu2axf;<7ufOv_1N2`aWFNG38i`I zoXX>Wsx7uVlX7m9-2xBxgKO9#t(dwUI_~^sv7;iv88+ZWrN{Z}$#gq^n^SK6^Y8zC zJMg$6&cL~1fZhKg_)&ld@CW=tJN)4ca0bpj1CfxZPQ|sk_^g)D=CwIZi$EWlpNc2u z6N!lEBXrG_HWQBk51ET=@jKJAGjr_wUkL6Ca36k$pW(r|-#B-WGjQ1%xDHj&Ui_gJ U$g6(X0(s>xjzV?F74+->53Y6)hyVZp diff --git a/spec/controllers/dashboard_controller_spec.rb b/spec/controllers/dashboard_controller_spec.rb index 9e6f082..856f785 100644 --- a/spec/controllers/dashboard_controller_spec.rb +++ b/spec/controllers/dashboard_controller_spec.rb @@ -20,7 +20,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) - .with({user_id: user.id, activity_type: 'dashboard#index'}) + .with({username: user.username, activity_type: 'dashboard#index'}) get :index, {}, valid_session end end @@ -42,7 +42,7 @@ def valid_session it 'should create an acvitiy' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#project', project_id: params[:id] }) @@ -79,7 +79,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#vote', story_id: '123', activity_data: { @@ -120,7 +120,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#reset', story_id: '123', activity_data: {story_id: '123', user: decoded_user(params['user'])}.to_json @@ -149,7 +149,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#detail', story_id: '123', activity_data: { @@ -181,7 +181,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#reveal', story_id: '123', activity_data: {story_id: '123'}.to_json @@ -230,7 +230,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#update', story_id: '1', activity_data: fake_return.to_json @@ -259,7 +259,7 @@ def valid_session it 'should create an activity' do Activity.expects(:create) .with({ - user_id: user.id, + username: user.username, activity_type: 'dashboard#select', story_id: '123', activity_data: {story_id: '123', username: 'username'}.to_json diff --git a/spec/factories.rb b/spec/factories.rb index a70c9d6..c88d6db 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -13,4 +13,7 @@ vote { Forgery::Basic.number(at_least: 1, at_most: 5) } end + factory :activity do + end + end \ No newline at end of file diff --git a/spec/models/activity_spec.rb b/spec/models/activity_spec.rb index 24e659a..4641ed7 100644 --- a/spec/models/activity_spec.rb +++ b/spec/models/activity_spec.rb @@ -1,4 +1,25 @@ -require 'rails_helper' +require 'spec_helper' RSpec.describe Activity, type: :model do + + describe 'self.infer_meetings' do + before :each do + t = Time.now + FactoryBot.create(:activity, created_at: t) + FactoryBot.create(:activity, created_at: t+1.minute) + FactoryBot.create(:activity, created_at: t+1.hour+2.minute) + FactoryBot.create(:activity, created_at: t+1.day) + FactoryBot.create(:activity, created_at: t+1.day+1.minute) + end + it 'groups activities together' do + expect(Activity.infer_meetings.length).to eql(3) + end + + it 'divides activities correctly' do + meetings = Activity.infer_meetings + expect(meetings[0].length).to eql(2) + expect(meetings[1].length).to eql(1) + expect(meetings[2].length).to eql(2) + end + end end diff --git a/spec/routing/activities_routing_spec.rb b/spec/routing/activities_routing_spec.rb index 3bdea6e..50611e0 100644 --- a/spec/routing/activities_routing_spec.rb +++ b/spec/routing/activities_routing_spec.rb @@ -7,16 +7,8 @@ expect(:get => "/activities").to route_to("activities#index") end - it "routes to #show" do - expect(:get => "/activities/1").to route_to("activities#show", :id => "1") - end - - it "routes to #create" do - expect(:post => "/activities").to route_to("activities#create") - end - - it "routes to #destroy" do - expect(:delete => "/activities/1").to route_to("activities#destroy", :id => "1") + it "routes to #meetings" do + expect(get: '/activities/meetings').to route_to('activities#meetings') end end