From: Tom Clegg Date: Fri, 14 Mar 2014 15:12:16 +0000 (-0400) Subject: Merge branch '2257-inequality-conditions' into 2290-user-activity X-Git-Tag: 1.1.0~2709^2~41^2~5^2~3 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/cf7e30873ef4b92cc8ec099b2bb344391a070e93?hp=1dec6cc7093bcc565bed2baba17c8a892b7e2633 Merge branch '2257-inequality-conditions' into 2290-user-activity Conflicts: apps/workbench/app/controllers/users_controller.rb apps/workbench/app/models/arvados_base.rb apps/workbench/config/routes.rb --- diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb index 61351d6449..6b0492a90f 100644 --- a/apps/workbench/app/controllers/application_controller.rb +++ b/apps/workbench/app/controllers/application_controller.rb @@ -149,7 +149,8 @@ class ApplicationController < ActionController::Base def breadcrumb_page_name (@breadcrumb_page_name || - (@object.friendly_link_name if @object.respond_to? :friendly_link_name)) + (@object.friendly_link_name if @object.respond_to? :friendly_link_name) || + action_name) end def index_pane_list diff --git a/apps/workbench/app/controllers/users_controller.rb b/apps/workbench/app/controllers/users_controller.rb index c33de2d034..b9f43ba76a 100644 --- a/apps/workbench/app/controllers/users_controller.rb +++ b/apps/workbench/app/controllers/users_controller.rb @@ -1,5 +1,5 @@ class UsersController < ApplicationController - skip_before_filter :find_object_by_uuid, :only => :welcome + skip_before_filter :find_object_by_uuid, :only => [:welcome, :activity] skip_around_filter :thread_with_mandatory_api_token, :only => :welcome before_filter :ensure_current_user_is_admin, only: :sudo @@ -10,6 +10,53 @@ class UsersController < ApplicationController end end + def activity + @breadcrumb_page_name = nil + @users = User.all + @user_activity = {} + @activity = { + logins: {}, + jobs: {}, + pipeline_instances: {} + } + @spans = [['This week', Time.now.beginning_of_week, Time.now], + ['Last week', + Time.now.beginning_of_week.advance(weeks:-1), + Time.now.beginning_of_week], + ['This month', Time.now.beginning_of_month, Time.now], + ['Last month', + 1.month.ago.beginning_of_month, + Time.now.beginning_of_month]] + @spans.each do |span, threshold_start, threshold_end| + @activity[:logins][span] = Log. + filter([[:event_type, '=', 'login'], + [:object_kind, '=', 'arvados#user'], + [:created_at, '>=', threshold_start], + [:created_at, '<', threshold_end]]) + @activity[:jobs][span] = Job. + filter([[:created_at, '>=', threshold_start], + [:created_at, '<', threshold_end]]) + @activity[:pipeline_instances][span] = PipelineInstance. + filter([[:created_at, '>=', threshold_start], + [:created_at, '<', threshold_end]]) + @activity.each do |type, act| + records = act[span] + @users.each do |u| + @user_activity[u.uuid] ||= {} + @user_activity[u.uuid][span + ' ' + type.to_s] ||= 0 + end + records.each do |record| + @user_activity[record.modified_by_user_uuid] ||= {} + @user_activity[record.modified_by_user_uuid][span + ' ' + type.to_s] ||= 0 + @user_activity[record.modified_by_user_uuid][span + ' ' + type.to_s] += 1 + end + end + end + @users = @users.sort_by do |a| + [-@user_activity[a.uuid].values.inject(:+), a.full_name] + end + end + def show_pane_list if current_user.andand.is_admin super | %w(Admin) diff --git a/apps/workbench/app/helpers/application_helper.rb b/apps/workbench/app/helpers/application_helper.rb index e608572f05..9066224b7e 100644 --- a/apps/workbench/app/helpers/application_helper.rb +++ b/apps/workbench/app/helpers/application_helper.rb @@ -59,11 +59,15 @@ module ApplicationHelper link_name = link_uuid if opts[:friendly_name] - begin - link_name = resource_class.find(link_uuid).friendly_link_name - rescue RuntimeError - # If that lookup failed, the link will too. So don't make one. - return attrvalue + if attrvalue.respond_to? :friendly_link_name + link_name = attrvalue.friendly_link_name + else + begin + link_name = resource_class.find(link_uuid).friendly_link_name + rescue RuntimeError + # If that lookup failed, the link will too. So don't make one. + return attrvalue + end end end if opts[:with_class_name] diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb index fbf7ee5e79..4ba53b9529 100644 --- a/apps/workbench/app/models/arvados_base.rb +++ b/apps/workbench/app/models/arvados_base.rb @@ -92,6 +92,10 @@ class ArvadosBase < ActiveRecord::Base ArvadosResourceList.new(self).order(*args) end + def self.filter(*args) + ArvadosResourceList.new(self).filter(*args) + end + def self.where(*args) ArvadosResourceList.new(self).where(*args) end diff --git a/apps/workbench/app/models/arvados_resource_list.rb b/apps/workbench/app/models/arvados_resource_list.rb index 72495cfdb9..ebea76cb83 100644 --- a/apps/workbench/app/models/arvados_resource_list.rb +++ b/apps/workbench/app/models/arvados_resource_list.rb @@ -20,6 +20,12 @@ class ArvadosResourceList self end + def filter _filters + @filters ||= [] + @filters += _filters + self + end + def where(cond) cond = cond.dup cond.keys.each do |uuid_key| @@ -52,6 +58,7 @@ class ArvadosResourceList api_params[:eager] = '1' if @eager api_params[:limit] = @limit if @limit api_params[:order] = @orderby_spec if @orderby_spec + api_params[:filters] = @filters if @filters res = $arvados_api_client.api @resource_class, '', api_params @results = $arvados_api_client.unpack_api_response res self diff --git a/apps/workbench/app/views/users/activity.html.erb b/apps/workbench/app/views/users/activity.html.erb new file mode 100644 index 0000000000..4517b7d57c --- /dev/null +++ b/apps/workbench/app/views/users/activity.html.erb @@ -0,0 +1,64 @@ +<% content_for :css do %> +table#users-activity-table th { + overflow-x: hidden; +} +<% end %> + + + + + <% @spans.each do |_| %> + + <% 3.times do %> + + <% end %> + + <% end %> + + + + <% @spans.each do |span, start_at, end_at| %> + + <% end %> + + + <% @spans.each do |span, _| %> + + + + <% end %> + + + <% @users.each do |user| %> + + + + <% @spans.each do |span, _| %> + <% ['logins', 'jobs', 'pipeline_instances'].each do |type| %> + + <% end %> + <% end %> + + <% end %> +
User + <%= span %> +
+ <%= start_at.strftime('%b %-d') %> + - + <%= (end_at-1.second).strftime('%b %-d') %> +
LoginsJobsPipelines
+ + <%= link_to_if_arvados_object user, friendly_name: true %> + + + + <%= @user_activity[user.uuid][span + " " + type].to_s %> + +
+ +<% content_for :footer_js do %> +$('#users-activity-table td small').each(function(){ + if ($(this).html().trim() == '0') + $(this).css('opacity', '0.3'); +}); +<% end %> diff --git a/apps/workbench/config/routes.rb b/apps/workbench/config/routes.rb index 523771c0b1..0981d2ea37 100644 --- a/apps/workbench/config/routes.rb +++ b/apps/workbench/config/routes.rb @@ -21,6 +21,7 @@ ArvadosWorkbench::Application.routes.draw do resources :users do get 'home', :on => :member get 'welcome', :on => :collection + get 'activity', :on => :collection post 'sudo', :on => :member end resources :logs