From 2fc97dd86aecbd8c33dca0e8d9cd58b8b3bb7e70 Mon Sep 17 00:00:00 2001 From: Henne Vogelsang Date: Tue, 20 Feb 2018 16:25:02 +0100 Subject: [PATCH 1/2] [frontend] Migrate comment log entries to login All the ProjectLogEntries that have been generated by CommentEvent have their user_name set to a string with the content of User.id. While all other log entries have this field set to User.login. Unify this to User.login --- ...80214132015_project_log_entry_user_name.rb | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/api/db/data/20180214132015_project_log_entry_user_name.rb diff --git a/src/api/db/data/20180214132015_project_log_entry_user_name.rb b/src/api/db/data/20180214132015_project_log_entry_user_name.rb new file mode 100644 index 00000000000..52325a02321 --- /dev/null +++ b/src/api/db/data/20180214132015_project_log_entry_user_name.rb @@ -0,0 +1,21 @@ +class ProjectLogEntryUserName < ActiveRecord::Migration[5.1] + def up + ProjectLogEntry.where('event_type like "%comment_for%"').in_batches do |log_entry| + user = User.find_by(id: log_entry.user_name).try(:login) + user ||= '_nobody_' + # rubocop:disable Rails/SkipsModelValidations + log_entry.update_attribute(user_name: user) + # rubocop:enable Rails/SkipsModelValidations + end + end + + def down + ProjectLogEntry.where('event_type like "%comment_for%"').in_batches do |log_entry| + user = User.find_by(id: log_entry.user_name).try(:id) + user ||= User.find_nobody!.try(:id) + # rubocop:disable Rails/SkipsModelValidations + log_entry.update_attribute(user_name: user) + # rubocop:enable Rails/SkipsModelValidations + end + end +end From 328067fb82c2f97e158cd8bb549bb85f4abbba70 Mon Sep 17 00:00:00 2001 From: Henne Vogelsang Date: Tue, 20 Feb 2018 16:36:20 +0100 Subject: [PATCH 2/2] [frontend] Introduces ProjectLogEntry view If you just want to check what happened project wide in the last couple of hours to find the cause of some problem. There is already the RSS feed for this but it's harder to skim than a nice *cough* web view. --- .../webui/application/project.scss | 4 ++++ .../controllers/webui/project_controller.rb | 6 +++++- src/api/app/helpers/webui/webui_helper.rb | 2 +- src/api/app/models/project_log_entry.rb | 2 ++ .../app/views/webui/project/_tabs.html.erb | 1 + .../app/views/webui/project/pulse.html.haml | 19 +++++++++++++++++++ src/api/config/routes.rb | 1 + ...80214132015_project_log_entry_user_name.rb | 4 ++-- 8 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 src/api/app/views/webui/project/pulse.html.haml diff --git a/src/api/app/assets/stylesheets/webui/application/project.scss b/src/api/app/assets/stylesheets/webui/application/project.scss index a201ce83fc7..dfa20b4dc17 100644 --- a/src/api/app/assets/stylesheets/webui/application/project.scss +++ b/src/api/app/assets/stylesheets/webui/application/project.scss @@ -99,3 +99,7 @@ table.buildstatus { th.buildstatus img { margin-bottom: -3px; } + +nav.pagination { + text-align: center; +} diff --git a/src/api/app/controllers/webui/project_controller.rb b/src/api/app/controllers/webui/project_controller.rb index 7a6b1d966b5..bc600b81fe6 100644 --- a/src/api/app/controllers/webui/project_controller.rb +++ b/src/api/app/controllers/webui/project_controller.rb @@ -19,7 +19,7 @@ class Webui::ProjectController < Webui::WebuiController :status, :maintained_projects, :add_maintained_project_dialog, :add_maintained_project, :remove_maintained_project, :maintenance_incidents, :unlock_dialog, :unlock, :save_person, :save_group, :remove_role, - :move_path, :save_prjconf, :clear_failed_comment] + :move_path, :save_prjconf, :clear_failed_comment, :pulse] # TODO: check if get_by_name or set_by_name is used for save_prjconf before_action :set_project_by_name, only: [:save_meta, :save_prjconf] @@ -92,6 +92,10 @@ def subprojects @siblings = @project.siblingprojects end + def pulse + @pulse = @project.project_log_entries.page(params[:page]) + end + def new @project = Project.new @project.name = params[:name] if params[:name] diff --git a/src/api/app/helpers/webui/webui_helper.rb b/src/api/app/helpers/webui/webui_helper.rb index bc9b4a645e7..1088413ad9c 100644 --- a/src/api/app/helpers/webui/webui_helper.rb +++ b/src/api/app/helpers/webui/webui_helper.rb @@ -188,7 +188,7 @@ def description_wrapper(description) end def is_advanced_tab? - action_name.in?(['prjconf', 'index', 'meta', 'status']) + action_name.in?(['prjconf', 'index', 'meta', 'status', 'pulse']) end def sprite_tag(icon, opts = {}) diff --git a/src/api/app/models/project_log_entry.rb b/src/api/app/models/project_log_entry.rb index 0ea73d16e24..f977f57b57f 100644 --- a/src/api/app/models/project_log_entry.rb +++ b/src/api/app/models/project_log_entry.rb @@ -67,6 +67,8 @@ def additional_info def self.username_from(payload) USERNAME_KEYS.each do |key| username = payload[key] + # FIXME: Why is commenter `id`` when everything else is `login`? + username = User.find_by(id: payload[key]).try(:login) if key == 'commenter' return username unless username.blank? || username == 'unknown' end return diff --git a/src/api/app/views/webui/project/_tabs.html.erb b/src/api/app/views/webui/project/_tabs.html.erb index 4ce03fa3ec6..3d5ca68aa06 100644 --- a/src/api/app/views/webui/project/_tabs.html.erb +++ b/src/api/app/views/webui/project/_tabs.html.erb @@ -38,6 +38,7 @@ <%= tab 'attribute', 'Attributes', :controller => :attribute, :project => @project, :action => 'index' %> <%= tab 'meta', "Meta", :controller => :project, :action => :meta %> <%= tab 'status', 'Status', :controller => :project, :action => :status unless @project.defines_remote_instance? || @is_maintenance_project %> + <%= tab 'pulse', 'Pulse', :controller => :project, :action => :pulse %> <% end -%> diff --git a/src/api/app/views/webui/project/pulse.html.haml b/src/api/app/views/webui/project/pulse.html.haml new file mode 100644 index 00000000000..1b7b4f8d9c6 --- /dev/null +++ b/src/api/app/views/webui/project/pulse.html.haml @@ -0,0 +1,19 @@ +- @pagetitle = "Pulse of #{@project}" +- project_bread_crumb 'Pulse' + + += render partial: 'webui/project/tabs' +%h3 Pulse of #{@project} +- @pulse.each do |log_entry| + %p + • + = log_entry.event_type.camelcase.prepend('Event::').constantize.description + - if log_entry.package_name + (#{link_to(log_entry.package_name, package_show_path(@project.name, log_entry.package_name))}) + - if log_entry.user_name + by #{link_to(log_entry.user_name, user_show_path(log_entry.user_name))} + - if log_entry.bs_request + via request #{link_to("##{log_entry.bs_request.number}", request_show_path(log_entry.bs_request.number))} + = fuzzy_time(log_entry.datetime) + += paginate @pulse diff --git a/src/api/config/routes.rb b/src/api/config/routes.rb index e265cdb8999..d93d8c0d21c 100644 --- a/src/api/config/routes.rb +++ b/src/api/config/routes.rb @@ -283,6 +283,7 @@ def self.public_or_about_path?(request) post 'project/remove_maintained_project/:project' => :remove_maintained_project, constraints: cons get 'project/maintenance_incidents/:project' => :maintenance_incidents, constraints: cons get 'project/list_incidents/:project' => :list_incidents, constraints: cons + get 'project/pulse/:project' => :pulse, constraints: cons get 'project/unlock_dialog' => :unlock_dialog post 'project/unlock' => :unlock end diff --git a/src/api/db/data/20180214132015_project_log_entry_user_name.rb b/src/api/db/data/20180214132015_project_log_entry_user_name.rb index 52325a02321..036678431a3 100644 --- a/src/api/db/data/20180214132015_project_log_entry_user_name.rb +++ b/src/api/db/data/20180214132015_project_log_entry_user_name.rb @@ -2,7 +2,7 @@ class ProjectLogEntryUserName < ActiveRecord::Migration[5.1] def up ProjectLogEntry.where('event_type like "%comment_for%"').in_batches do |log_entry| user = User.find_by(id: log_entry.user_name).try(:login) - user ||= '_nobody_' + user ||= User::NOBODY_LOGIN # rubocop:disable Rails/SkipsModelValidations log_entry.update_attribute(user_name: user) # rubocop:enable Rails/SkipsModelValidations @@ -12,7 +12,7 @@ def up def down ProjectLogEntry.where('event_type like "%comment_for%"').in_batches do |log_entry| user = User.find_by(id: log_entry.user_name).try(:id) - user ||= User.find_nobody!.try(:id) + user ||= User.find_nobody!.try(:id) # rubocop:disable Rails/SkipsModelValidations log_entry.update_attribute(user_name: user) # rubocop:enable Rails/SkipsModelValidations