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 34e50c4577e..586dee89c77 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 new file mode 100644 index 00000000000..036678431a3 --- /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 ||= User::NOBODY_LOGIN + # 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