X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a2107d5fc7982769c2d667e51656a6e2529d9bc9..28ed7a8f36a671b8c9e629ad923c904eecf08ac4:/apps/workbench/app/controllers/users_controller.rb diff --git a/apps/workbench/app/controllers/users_controller.rb b/apps/workbench/app/controllers/users_controller.rb index c33de2d034..1610653b87 100644 --- a/apps/workbench/app/controllers/users_controller.rb +++ b/apps/workbench/app/controllers/users_controller.rb @@ -1,7 +1,7 @@ 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 + before_filter :ensure_current_user_is_admin, only: [:sudo, :unsetup] def welcome if current_user @@ -10,6 +10,59 @@ class UsersController < ApplicationController end end + def activity + @breadcrumb_page_name = nil + @users = User.limit(params[:limit] || 1000).all + @user_activity = {} + @activity = { + logins: {}, + jobs: {}, + pipeline_instances: {} + } + @total_activity = {} + @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 + @total_activity[span + ' ' + type.to_s] ||= 0 + @total_activity[span + ' ' + type.to_s] += 1 + end + end + end + @users = @users.sort_by do |a| + [-@user_activity[a.uuid].values.inject(:+), a.full_name] + end + # Prepend a "Total" pseudo-user to the sorted list + @user_activity[nil] = @total_activity + @users = [OpenStruct.new(uuid: nil)] + @users + end + def show_pane_list if current_user.andand.is_admin super | %w(Admin) @@ -18,6 +71,14 @@ class UsersController < ApplicationController end end + def index_pane_list + if current_user.andand.is_admin + super | %w(Activity) + else + super + end + end + def sudo resp = $arvados_api_client.api(ApiClientAuthorization, '', { api_client_authorization: { @@ -76,4 +137,12 @@ class UsersController < ApplicationController f.html { render template: 'users/home' } end end + + def unsetup + if current_user.andand.is_admin + @object.unsetup + end + show + end + end