From 01fb509e75ff61233918db2909d5c1ad6d6e4479 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Mon, 6 Jan 2020 14:14:25 +0800 Subject: [PATCH] =?UTF-8?q?issue=E7=9A=84=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- app/controllers/issues_controller.rb | 4 +- app/controllers/journals_controller.rb | 2 + app/controllers/project_trends_controller.rb | 49 +++++++++++++++++++ app/models/issue.rb | 6 +++ app/models/project.rb | 10 ++++ app/models/project_trend.rb | 5 ++ app/models/user.rb | 2 + .../issues/_simple_issue_item.json.jbuilder | 18 +++++++ app/views/project_trends/index.json.jbuilder | 24 +++++++++ config/locales/zh-CN.yml | 9 ++++ config/routes.rb | 1 + .../20200106022157_create_project_trends.rb | 12 +++++ spec/models/project_trend_spec.rb | 5 ++ 14 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 app/controllers/project_trends_controller.rb create mode 100644 app/models/project_trend.rb create mode 100644 app/views/issues/_simple_issue_item.json.jbuilder create mode 100644 app/views/project_trends/index.json.jbuilder create mode 100644 db/migrate/20200106022157_create_project_trends.rb create mode 100644 spec/models/project_trend_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index aa0b0188f..d3f65a6bc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base def current_user # User.current - User.find_by_id 36401 + User.find_by_id 1 end ## 默认输出json diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 5d515b36e..436e56702 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -49,7 +49,7 @@ class IssuesController < ApplicationController order_name = params[:order_name] || "created_on" #或者"updated_on" @page = params[:page] - @limit = params[:limit] || "15" + @limit = params[:limit] || 15 @issues = issues.order("#{order_name} #{order_type}") @issues_size = issues.size @issues = issues.order("#{order_name} #{order_type}").page(@page).per(@limit) @@ -175,6 +175,7 @@ class IssuesController < ApplicationController parent_container_id: @project.id, parent_container_type: "Project", tiding_type: 'issue', status: 0) end + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create") normal_status(0, "创建成功") else normal_status(-1, "创建失败") @@ -300,6 +301,7 @@ class IssuesController < ApplicationController end if @issue.update_attribute(:status_id, type) if type == 5 + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "close") @issue.issue_times.update_all(end_time: Time.now) end @issue.create_journal_detail(false, [], []) diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6c3bc49ed..edcec73cd 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -35,6 +35,8 @@ class JournalsController < ApplicationController end end end + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal") + normal_status(0, "评论成功") else normal_status(-1, "评论失败") diff --git a/app/controllers/project_trends_controller.rb b/app/controllers/project_trends_controller.rb new file mode 100644 index 000000000..84821ba65 --- /dev/null +++ b/app/controllers/project_trends_controller.rb @@ -0,0 +1,49 @@ +class ProjectTrendsController < ApplicationController + before_action :set_project + before_action :check_project_public + + def index + @project_issues_count = @project.get_issues_count(nil) + @project_open_issues_count = @project.get_issues_count([1,2,3,4,6]) + @project_close_issues_count = @project.get_issues_count(5) + + project_trends = @project.project_trends.includes(:user, trend: :user) + check_time = params[:time] #时间的筛选 + check_type = params[:type] #动态类型的筛选,目前已知的有 Issue, PullRequest, Version + check_status = params[:status] #类型的选择 "create", "close", "journal", + + if check_time.present? + check_time = check_time.to_i + project_trends = project_trends.where("created_at between ? and ?",(Time.now.beginning_of_day - check_time.days), Time.now.end_of_day) + end + + if check_type.present? + project_trends = project_trends.where(trend_type: check_type.to_s.titleize) + end + + if check_status.present? + project_trends = project_trends.where(action_type: check_status.to_s) + end + project_trends = project_trends.order("created_at desc") + + @page = params[:page] + @limit = params[:limit] || 15 + @project_trends_size = project_trends.size + @project_trends = project_trends.page(@page).per(@limit) + end + + private + + def set_project + @project = Project.find_by_id(params[:project_id]) + unless @project.present? + normal_status(-1, "项目不存在") + end + end + + def check_project_public + unless @project.is_public || @project.member?(current_user) || current_user.admin? + normal_status(-1, "您没有权限") + end + end +end \ No newline at end of file diff --git a/app/models/issue.rb b/app/models/issue.rb index 4c995be55..64fa4c368 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -2,6 +2,7 @@ class Issue < ApplicationRecord #issue_type 1为普通,2为悬赏 belongs_to :project belongs_to :tracker + has_many :project_trends, as: :trend, dependent: :destroy # belongs_to :issue_tag,optional: true belongs_to :priority, :class_name => 'IssuePriority', foreign_key: :priority_id,optional: true # belongs_to :version, foreign_key: :fixed_version_id,optional: true @@ -17,6 +18,7 @@ class Issue < ApplicationRecord has_many :issue_times, dependent: :destroy has_many :issue_depends, dependent: :destroy scope :issue_includes, ->{includes(:user)} + scope :issue_many_includes, ->{includes(journals: :user)} def get_assign_user @@ -78,4 +80,8 @@ class Issue < ApplicationRecord end end + def only_reply_journals + journals.where.not(notes: [nil, ""]).journal_includes.limit(2) + end + end \ No newline at end of file diff --git a/app/models/project.rb b/app/models/project.rb index 6c3938d6c..7a3df8e2b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -9,6 +9,7 @@ class Project < ApplicationRecord belongs_to :owner, class_name: 'User', foreign_key: :user_id belongs_to :project_category , :counter_cache => true belongs_to :project_language , :counter_cache => true + has_many :project_trends, dependent: :destroy has_many :commits @@ -51,4 +52,13 @@ class Project < ApplicationRecord self.identifier.parameterize end + def get_issues_count(status_id) + if status_id.present? + self&.issues.select(:id, :status_id).where(status_id: status_id)&.pluck(:id).size + else + self&.issues.select(:id)&.pluck(:id).size + end + + end + end diff --git a/app/models/project_trend.rb b/app/models/project_trend.rb new file mode 100644 index 000000000..28fd0ffad --- /dev/null +++ b/app/models/project_trend.rb @@ -0,0 +1,5 @@ +class ProjectTrend < ApplicationRecord + belongs_to :project + belongs_to :trend, polymorphic: true, optional: true + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb index b136db2a8..45c20e6e7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -166,6 +166,8 @@ class User < ApplicationRecord has_many :composes, dependent: :destroy has_many :compose_users, dependent: :destroy + has_many :project_trends, dependent: :destroy + # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/views/issues/_simple_issue_item.json.jbuilder b/app/views/issues/_simple_issue_item.json.jbuilder new file mode 100644 index 000000000..e701d179e --- /dev/null +++ b/app/views/issues/_simple_issue_item.json.jbuilder @@ -0,0 +1,18 @@ +json.name issue.subject +json.created_at format_time(issue.created_on) +json.updated_at format_time(issue.updated_on) +json.assign_user_name issue.get_assign_user.try(:show_real_name) +json.assign_user_login issue.get_assign_user.try(:login) +json.issue_journal_size issue.get_journals_size +journals = issue.only_reply_journals + +json.issue_journals do + json.array! journals.to_a.each do |j| + json.user_name j.user.try(:show_real_name) + json.user_login j.user.try(:login) + json.user_picture url_to_avatar(j.user) + json.content j.try(:notes) + json.created_at time_from_now(j.created_on) + end +end + diff --git a/app/views/project_trends/index.json.jbuilder b/app/views/project_trends/index.json.jbuilder new file mode 100644 index 000000000..1a573007f --- /dev/null +++ b/app/views/project_trends/index.json.jbuilder @@ -0,0 +1,24 @@ +json.partial! "commons/success" +json.issues_count @project_issues_count +json.open_issues_count @project_open_issues_count +json.close_issues_count @project_close_issues_count +json.limit @limit +json.project_trends_size @project_trends_size +json.project_trends do + json.array! @project_trends.to_a.each do |trend| + json.id trend.id + json.trend_type trend.trend_type + json.action_type l("trend.#{trend.action_type}") + l("trend.#{trend.trend_type}") + json.trend_id trend.trend_id + json.user_login trend.user.login + json.user_avatar url_to_avatar(trend.user) + + if trend.trend_type == "Issue" + json.partial! "issues/simple_issue_item", locals: {issue: trend.trend} + end + + #后续需要天际pullrequest 和 版本的内容 + + end +end + diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 0b1cdf0fe..5d24def63 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -14,6 +14,15 @@ zh-CN: 'processed': '已审批' 'refused': '已拒绝' 'agreed': '已同意' + trend: + Issue: 工单 + PullRequest: 合并请求 + Version: 版本发布 + create: 创建了 + journal: 回复了 + close: 关闭了 + merge: 合并了 + push: 发布了 journal_detail: issue_tags_value: 标签 diff --git a/config/routes.rb b/config/routes.rb index 675c00683..5cc9a565e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -45,6 +45,7 @@ Rails.application.routes.draw do resources :licenses, only: [:index, :show] resources :projects, only: [:index, :create, :show] do + resources :project_trends, only: [:index, :create] resources :issues do collection do get :commit_issues diff --git a/db/migrate/20200106022157_create_project_trends.rb b/db/migrate/20200106022157_create_project_trends.rb new file mode 100644 index 000000000..70bcb8cdc --- /dev/null +++ b/db/migrate/20200106022157_create_project_trends.rb @@ -0,0 +1,12 @@ +class CreateProjectTrends < ActiveRecord::Migration[5.2] + def change + create_table :project_trends do |t| + t.integer :user_id + t.integer :project_id + t.references :trend, polymorphic: true, index: true + t.string :action_type + t.timestamps + end + add_index :project_trends, [:user_id, :project_id] + end +end diff --git a/spec/models/project_trend_spec.rb b/spec/models/project_trend_spec.rb new file mode 100644 index 000000000..06d3dac5c --- /dev/null +++ b/spec/models/project_trend_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ProjectTrend, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end