From 959c1e8d95a8982d998cd922fa73ed7c1d22fe1f Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 14 Feb 2022 13:55:34 +0800 Subject: [PATCH 1/5] add: user profile setting message --- .../users/template_message_settings_controller.rb | 2 ++ .../{issue_creator_expire.rb => issue_expire.rb} | 6 +++--- .../template_message_setting/create_or_assign.rb | 1 + app/models/template_message_setting/manage_project.rb | 4 ++++ app/models/user_template_message_setting.rb | 10 ++++++++++ 5 files changed, 20 insertions(+), 3 deletions(-) rename app/models/message_template/{issue_creator_expire.rb => issue_expire.rb} (80%) diff --git a/app/controllers/users/template_message_settings_controller.rb b/app/controllers/users/template_message_settings_controller.rb index 2234e7301..5421a29d5 100644 --- a/app/controllers/users/template_message_settings_controller.rb +++ b/app/controllers/users/template_message_settings_controller.rb @@ -22,6 +22,8 @@ class Users::TemplateMessageSettingsController < Users::BaseController def get_current_setting @current_setting = @_observed_user.user_template_message_setting + @current_setting.notification_body.merge!(UserTemplateMessageSetting.init_notification_body.except(*@current_setting.notification_body.keys)) + @current_setting.email_body.merge!(UserTemplateMessageSetting.init_email_body.except(*@current_setting.email_body.keys)) @current_setting = UserTemplateMessageSetting.build(@_observed_user.id) if @current_setting.nil? end diff --git a/app/models/message_template/issue_creator_expire.rb b/app/models/message_template/issue_expire.rb similarity index 80% rename from app/models/message_template/issue_creator_expire.rb rename to app/models/message_template/issue_expire.rb index 475c05ce0..882504dc2 100644 --- a/app/models/message_template/issue_creator_expire.rb +++ b/app/models/message_template/issue_expire.rb @@ -12,8 +12,8 @@ # email_title :string(255) # -# 我创建的疑修截止日期到达最后一天 -class MessageTemplate::IssueCreatorExpire < MessageTemplate +# 我创建或负责的疑修截止日期到达最后一天 +class MessageTemplate::IssueExpire < MessageTemplate # MessageTemplate::IssueCreatorExpire.get_message_content(User.where(login: 'yystopf'), Issue.last) def self.get_message_content(receivers, issue) @@ -23,7 +23,7 @@ class MessageTemplate::IssueCreatorExpire < MessageTemplate url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', issue&.id.to_s) return receivers_string(receivers), content, url rescue => e - Rails.logger.info("MessageTemplate::IssueAssignerExpire.get_message_content [ERROR] #{e}") + Rails.logger.info("MessageTemplate::IssueExpire.get_message_content [ERROR] #{e}") return '', '', '' end end diff --git a/app/models/template_message_setting/create_or_assign.rb b/app/models/template_message_setting/create_or_assign.rb index 50ef86433..4c392b4b7 100644 --- a/app/models/template_message_setting/create_or_assign.rb +++ b/app/models/template_message_setting/create_or_assign.rb @@ -27,5 +27,6 @@ class TemplateMessageSetting::CreateOrAssign < TemplateMessageSetting def self.build_init_data self.find_or_create_by(name: "疑修状态变更", key: "IssueChanged") self.find_or_create_by(name: "合并请求状态变更", key: "PullRequestChanged") + self.find_or_create_by(name: "疑修截止日期到达最后一天", key: "IssueExpire", notification_disabled: false) end end diff --git a/app/models/template_message_setting/manage_project.rb b/app/models/template_message_setting/manage_project.rb index 7a80c9999..978761f94 100644 --- a/app/models/template_message_setting/manage_project.rb +++ b/app/models/template_message_setting/manage_project.rb @@ -29,5 +29,9 @@ class TemplateMessageSetting::ManageProject < TemplateMessageSetting self.find_or_create_by(name: "有新的合并请求", key: "PullRequest") self.find_or_create_by(name: "有成员变动", key: "Member") self.find_or_create_by(name: "仓库设置被更改", key: "SettingChanged") + self.find_or_create_by(name: "被点赞", key: "Praised", notification_disabled: false, email_disabled: true) + self.find_or_create_by(name: "被fork", key: "Forked", notification_disabled: false, email_disabled: true) + self.find_or_create_by(name: "有新的里程碑", key: "Milestone", notification_disabled: false) + self.find_or_create_by(name: "有里程碑已完成", key: "MilestoneCompleted", notification_disabled: false) end end diff --git a/app/models/user_template_message_setting.rb b/app/models/user_template_message_setting.rb index 3a3416ee3..49db51d4d 100644 --- a/app/models/user_template_message_setting.rb +++ b/app/models/user_template_message_setting.rb @@ -35,10 +35,15 @@ class UserTemplateMessageSetting < ApplicationRecord "Normal::PullRequestAssigned": true, "CreateOrAssign::IssueChanged": true, "CreateOrAssign::PullRequestChanged": true, + "CreateOrAssign::IssueExpire": true, "ManageProject::Issue": true, "ManageProject::PullRequest": true, "ManageProject::Member": true, "ManageProject::SettingChanged": true, + "ManageProject::Praised": true, + "ManageProject::Forked": true, + "ManageProject::Milestone": true, + "ManageProject::MilestoneCompleted": true, }.stringify_keys! end @@ -51,10 +56,15 @@ class UserTemplateMessageSetting < ApplicationRecord "Normal::PullRequestAssigned": false, "CreateOrAssign::IssueChanged": false, "CreateOrAssign::PullRequestChanged": false, + "CreateOrAssign::IssueExpire": false, "ManageProject::Issue": false, "ManageProject::PullRequest": false, "ManageProject::Member": false, "ManageProject::SettingChanged": false, + "ManageProject::Praised": false, + "ManageProject::Forked": false, + "ManageProject::Milestone": false, + "ManageProject::MilestoneCompleted": false, }.stringify_keys! end From 22293572acea213c4e36f3b3758c175650b9e6b1 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 14 Feb 2022 17:02:59 +0800 Subject: [PATCH 2/5] fix: issue changed about version callback --- app/controllers/issues_controller.rb | 3 ++- app/models/issue.rb | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 5590d9e87..ad53a4b3f 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -180,6 +180,7 @@ class IssuesController < ApplicationController elsif params[:issue_tag_ids].is_a?(Array) && params[:issue_tag_ids].size == 1 @issue&.issue_tags_relates&.destroy_all params[:issue_tag_ids].each do |tag| + next if tag == [""] IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag) end else @@ -246,7 +247,7 @@ class IssuesController < ApplicationController end if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时 @issue.issue_times.update_all(end_time: Time.now) - @issue.update_closed_issues_count_in_project! + # @issue.update_closed_issues_count_in_project! if @issue.issue_type.to_s == "2" && last_status_id != 5 if @issue.assigned_to_id.present? && last_status_id == 3 #只有当用户完成100%时,才给token post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login)) diff --git a/app/models/issue.rb b/app/models/issue.rb index cecc4678c..c00f4e767 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -75,7 +75,7 @@ class Issue < ApplicationRecord scope :issue_index_includes, ->{includes(:tracker, :priority, :version, :issue_status, :journals,:issue_tags,user: :user_extension)} scope :closed, ->{where(status_id: 5)} after_create :incre_project_common, :incre_user_statistic, :incre_platform_statistic - after_update :change_versions_count + after_save :change_versions_count after_destroy :update_closed_issues_count_in_project!, :decre_project_common, :decre_user_statistic, :decre_platform_statistic def incre_project_common @@ -170,11 +170,25 @@ class Issue < ApplicationRecord end def change_versions_count - if self.version.present? && self.saved_change_to_status_id? + if self.saved_change_to_fixed_version_id? + before_version = Version.find_by_id(self.fixed_version_id_before_last_save) + Rails.logger.info self.fixed_version_id_before_last_save + if before_version.present? + Rails.logger.info self.status_id + Rails.logger.info self.status_id_before_last_save + # 更改前状态为完成 或者 更改前后都为完成状态 + if self.status_id_before_last_save == 5 + percent = before_version.issues_count == 0 ? 0.0 : ((before_version.closed_issues_count - 1).to_f / before_version.issues_count) + before_version.update_attributes(closed_issues_count: (before_version.closed_issues_count - 1), percent: percent) + end + end + end + + if self.version.present? && (self.saved_change_to_status_id? || self.saved_change_to_fixed_version_id?) if self.status_id == 5 percent = self.version.issues_count == 0 ? 0.0 : ((self.version.closed_issues_count + 1).to_f / self.version.issues_count) self.version.update_attributes(closed_issues_count: (self.version.closed_issues_count + 1), percent: percent) - elsif self.status_id_before_last_save == 5 + elsif self.status_id_before_last_save == 5 && !self.saved_change_to_fixed_version_id? percent = self.version.issues_count == 0 ? 0.0 : ((self.version.closed_issues_count - 1).to_f / self.version.issues_count) self.version.update_attributes(closed_issues_count: (self.version.closed_issues_count - 1), percent: percent) end @@ -182,7 +196,7 @@ class Issue < ApplicationRecord end def update_closed_issues_count_in_project! - self.project.decrement!(:closed_issues_count) + self.project.decrement!(:closed_issues_count) if self.status_id == 5 end end From b3bede308cdd470cb39081f0d80b5f87da363cec Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 15 Feb 2022 17:13:06 +0800 Subject: [PATCH 3/5] add: some new message rules --- app/controllers/praise_tread_controller.rb | 1 + app/docs/slate/source/includes/_users.md | 4 +- app/jobs/delay_expired_issue_job.rb | 3 +- app/jobs/send_template_message_job.rb | 52 ++++++++++++--- app/models/message_template.rb | 12 ++-- .../message_template/issue_creator_expire.rb | 3 + app/models/message_template/issue_expire.rb | 43 ++++++++++-- app/models/message_template/project_forked.rb | 12 +++- .../message_template/project_milestone.rb | 47 +++++++++++++- .../project_milestone_completed.rb | 65 +++++++++++++++++++ .../message_template/project_praised.rb | 12 +++- app/models/version.rb | 11 ++++ app/services/projects/fork_service.rb | 2 + public/docs/api.html | 12 ++-- public/message_template/issue_expire.html | 47 ++++++++++++++ .../message_template/project_milestone.html | 47 ++++++++++++++ .../project_milestone_completed.html | 47 ++++++++++++++ 17 files changed, 384 insertions(+), 36 deletions(-) create mode 100644 app/models/message_template/issue_creator_expire.rb create mode 100644 app/models/message_template/project_milestone_completed.rb create mode 100644 public/message_template/issue_expire.html create mode 100644 public/message_template/project_milestone.html create mode 100644 public/message_template/project_milestone_completed.html diff --git a/app/controllers/praise_tread_controller.rb b/app/controllers/praise_tread_controller.rb index c355e8fd2..77fa844b8 100644 --- a/app/controllers/praise_tread_controller.rb +++ b/app/controllers/praise_tread_controller.rb @@ -12,6 +12,7 @@ class PraiseTreadController < ApplicationController begin return normal_status(2, "你已点过赞了") if current_user.liked?(@project) current_user.like!(@project) + SendTemplateMessageJob.perform_later('ProjectPraised', current_user.id, @project.id) if Site.has_notice_menu? render_ok({praises_count: @project.praises_count, praised: current_user.liked?(@project)}) rescue Exception => e uid_logger_error(e.message) diff --git a/app/docs/slate/source/includes/_users.md b/app/docs/slate/source/includes/_users.md index f416d488d..dc3faea8e 100644 --- a/app/docs/slate/source/includes/_users.md +++ b/app/docs/slate/source/includes/_users.md @@ -91,10 +91,9 @@ await octokit.request('GET /api/users/:login/messages.json') 类型|说明 --------- | ----------- |IssueAssigned | 有新指派给我的疑修 | -|IssueAssignerExpire | 我负责的疑修截止日期到达最后一天 | +|IssueExpire | 我创建或负责的疑修截止日期到达最后一天 | |IssueAtme | 在疑修中@我 | |IssueChanged | 我创建或负责的疑修状态变更 | -|IssueCreatorExpire | 我创建的疑修截止日期到达最后一天 | |IssueDeleted | 我创建或负责的疑修删除 | |IssueJournal | 我创建或负责的疑修有新的评论 | |LoginIpTip | 登录异常提示 | @@ -109,6 +108,7 @@ await octokit.request('GET /api/users/:login/messages.json') |ProjectLeft | 账号被移出项目 | |ProjectMemberJoined | 我管理的仓库有成员加入 | |ProjectMemberLeft | 我管理的仓库有成员移出 | +|ProjectMilestoneCompleted | 我管理的仓库有里程碑完成度100% | |ProjectMilestone | 我管理的仓库有新的里程碑 | |ProjectPraised | 我管理的仓库被点赞 | |ProjectPullRequest | 我管理/关注的仓库有新的合并请求 | diff --git a/app/jobs/delay_expired_issue_job.rb b/app/jobs/delay_expired_issue_job.rb index bf0e1d2e4..ed390e15b 100644 --- a/app/jobs/delay_expired_issue_job.rb +++ b/app/jobs/delay_expired_issue_job.rb @@ -3,8 +3,7 @@ class DelayExpiredIssueJob < ApplicationJob def perform Issue.where(due_date: Date.today + 1.days).find_each do |issue| - SendTemplateMessageJob.perform_later('IssueAssignerExpire', issue.id) if Site.has_notice_menu? - SendTemplateMessageJob.perform_later('IssueCreatorExpire', issue.id) if Site.has_notice_menu? + SendTemplateMessageJob.perform_later('IssueExpire', issue.id) if Site.has_notice_menu? end end diff --git a/app/jobs/send_template_message_job.rb b/app/jobs/send_template_message_job.rb index f17755420..4cde94c4b 100644 --- a/app/jobs/send_template_message_job.rb +++ b/app/jobs/send_template_message_job.rb @@ -24,13 +24,6 @@ class SendTemplateMessageJob < ApplicationJob receivers_email_string, email_title, email_content = MessageTemplate::IssueAssigned.get_email_message_content(receiver, operator, issue) Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) end - when 'IssueAssignerExpire' - issue_id = args[0] - issue = Issue.find_by_id(issue_id) - return unless issue.present? - receivers = User.where(id: issue&.assigned_to_id) - receivers_string, content, notification_url = MessageTemplate::IssueAssignerExpire.get_message_content(receivers, issue) - Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {issue_id: issue.id}) when 'IssueAtme' receivers, operator_id, issue_id = args[0], args[1], args[2] operator = User.find_by_id(operator_id) @@ -52,12 +45,12 @@ class SendTemplateMessageJob < ApplicationJob receivers_email_string, email_title, email_content = MessageTemplate::IssueChanged.get_email_message_content(receiver, operator, issue, change_params) Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) end - when 'IssueCreatorExpire' + when 'IssueExpire' issue_id = args[0] issue = Issue.find_by_id(issue_id) return unless issue.present? - receivers = User.where(id: issue&.author_id) - receivers_string, content, notification_url = MessageTemplate::IssueCreatorExpire.get_message_content(receivers, issue) + receivers = User.where(id: [issue&.assigned_to_id, issue&.author_id]) + receivers_string, content, notification_url = MessageTemplate::IssueExpire.get_message_content(receivers, issue) Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {issue_id: issue.id}) when 'IssueDeleted' operator_id, issue_title, issue_assigned_to_id, issue_author_id = args[0], args[1], args[2], args[3] @@ -94,6 +87,14 @@ class SendTemplateMessageJob < ApplicationJob receivers_email_string, email_title, email_content = MessageTemplate::OrganizationLeft.get_email_message_content(receiver, organization) Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) end + when 'ProjectForked' + operator_id, project_id = args[0], args[1] + operator = User.find_by_id(operator_id) + project = Project.find_by_id(project_id) + return unless operator.present? && project.present? + receivers = project&.all_managers.where.not(id: operator&.id) + receivers_string, content, notification_url = MessageTemplate::ProjectForked.get_message_content(receivers, operator, project) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {operator_id: operator.id, project_id: project.id}) when 'ProjectIssue' operator_id, issue_id = args[0], args[1] operator = User.find_by_id(operator_id) @@ -163,6 +164,37 @@ class SendTemplateMessageJob < ApplicationJob receivers_email_string, email_title, email_content = MessageTemplate::ProjectMemberLeft.get_email_message_content(receiver, user, project) Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) end + when 'ProjectMilestoneCompleted' + milestone_id = args[0] + milestone = Version.find_by_id(milestone_id) + return unless milestone.present? && milestone&.project.present? + receivers = milestone&.project&.all_managers + receivers_string, content, notification_url = MessageTemplate::ProjectMilestoneCompleted.get_message_content(receivers, milestone) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {milestone_id: milestone_id}) + receivers.find_each do |receiver| + receivers_email_string, email_title, email_content = MessageTemplate::ProjectMilestoneCompleted.get_email_message_content(receiver, milestone) + Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) + end + when 'ProjectMilestone' + milestone_id, operator_id = args[0], args[1] + milestone = Version.find_by_id(milestone_id) + operator = User.find_by_id(operator_id) + return unless milestone.present? && milestone&.project.present? && operator.present? + receivers = milestone&.project&.all_managers.where.not(id: operator_id) + receivers_string, content, notification_url = MessageTemplate::ProjectMilestone.get_message_content(receivers, operator, milestone) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {milestone_id: milestone_id, operator_id: operator_id}) + receivers.find_each do |receiver| + receivers_email_string, email_title, email_content = MessageTemplate::ProjectMilestone.get_email_message_content(receiver, operator, milestone) + Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) + end + when 'ProjectPraised' + operator_id, project_id = args[0], args[1] + operator = User.find_by_id(operator_id) + project = Project.find_by_id(project_id) + return unless operator.present? && project.present? + receivers = project&.all_managers.where.not(id: operator&.id) + receivers_string, content, notification_url = MessageTemplate::ProjectPraised.get_message_content(receivers, operator, project) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {operator_id: operator.id, project_id: project.id}) when 'ProjectPullRequest' operator_id, pull_request_id = args[0], args[1] operator = User.find_by_id(operator_id) diff --git a/app/models/message_template.rb b/app/models/message_template.rb index c9812e511..48b1b69c6 100644 --- a/app/models/message_template.rb +++ b/app/models/message_template.rb @@ -22,7 +22,8 @@ class MessageTemplate < ApplicationRecord self.create(type: 'MessageTemplate::IssueAtme', sys_notice: '{nickname} 在疑修 {title} 中@我', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') email_html = File.read("#{email_template_html_dir}/issue_changed.html") self.create(type: 'MessageTemplate::IssueChanged', sys_notice: '在项目 {nickname2}/{repository} 的疑修 {title} 中:{ifassigner}{nickname1}将负责人从 {assigner1} 修改为 {assigner2} {endassigner}{ifstatus}{nickname1}将状态从 {status1} 修改为 {status2} {endstatus}{iftracker}{nickname1}将类型从 {tracker1} 修改为 {tracker2} {endtracker}{ifpriority}{nickname1}将优先级从 {priority1} 修改为 {priority2} {endpriority}{ifmilestone}{nickname1}将里程碑从 {milestone1} 修改为 {milestone2} {endmilestone}{iftag}{nickname1}将标记从 {tag1} 修改为 {tag2} {endtag}{ifdoneratio}{nickname1}将完成度从 {doneratio1} 修改为 {doneratio2} {enddoneratio}{ifbranch}{nickname1}将指定分支从 {branch1} 修改为 {branch2} {endbranch}{ifstartdate}{nickname1}将开始日期从 {startdate1} 修改为 {startdate2} {endstartdate}{ifduedate}{nickname1}将结束日期从 {duedate1} 修改为 {duedate2} {endduedate}', email: email_html, email_title: 'GitLink: 疑修 {title} 有状态变更', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') - self.create(type: 'MessageTemplate::IssueCreatorExpire', sys_notice: '您发布的疑修 {title} 已临近截止日期,请尽快处理', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') + email_html = File.read("#{email_template_html_dir}/issue_expire.html") + self.create(type: 'MessageTemplate::IssueExpire', sys_notice: '疑修 {title} 已临近截止日期,请尽快处理', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}', email: email_html, email_title: 'GitLink: 疑修截止日期到达最后一天') email_html = File.read("#{email_template_html_dir}/issue_deleted.html") self.create(type: 'MessageTemplate::IssueDeleted', sys_notice: '{nickname}已将疑修 {title} 删除', email: email_html, email_title: 'GitLink: 疑修 {title} 有状态变更', notification_url: '') self.create(type: 'MessageTemplate::IssueJournal', sys_notice: '{nickname}评论疑修{title}:{notes}', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') @@ -33,7 +34,7 @@ class MessageTemplate < ApplicationRecord self.create(type: 'MessageTemplate::OrganizationLeft', sys_notice: '你已被移出 {organization} 组织', notification_url: '', email: email_html, email_title: 'GitLink: 你已被移出 {organization} 组织') self.create(type: 'MessageTemplate::ProjectDeleted', sys_notice: '你关注的仓库{nickname}/{repository}已被删除', notification_url: '') self.create(type: 'MessageTemplate::ProjectFollowed', sys_notice: '{nickname} 关注了你管理的仓库', notification_url: '{baseurl}/{login}') - self.create(type: 'MessageTemplate::ProjectForked', sys_notice: '{nickname1} 复刻了你管理的仓库{nickname1}/{repository1}到{nickname2}/{repository2}', notification_url: '{baseurl}/{owner}/{identifier}') + self.create(type: 'MessageTemplate::ProjectForked', sys_notice: '{nickname1} 复刻了你管理的仓库 {nickname2}/{repository}{nickname1}/{repository}', notification_url: '{baseurl}/{owner}/{identifier}') email_html = File.read("#{email_template_html_dir}/project_issue.html") self.create(type: 'MessageTemplate::ProjectIssue', sys_notice: '{nickname1}在 {nickname2}/{repository} 新建疑修:{title}', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}', email: email_html, email_title: 'GitLink: {nickname1} 在 {nickname2}/{repository} 新建了一个疑修') email_html = File.read("#{email_template_html_dir}/project_joined.html") @@ -44,8 +45,11 @@ class MessageTemplate < ApplicationRecord self.create(type: 'MessageTemplate::ProjectMemberJoined', sys_notice: '{nickname1} 已加入项目 {nickname2}/{repository}', notification_url: '{baseurl}/{owner}/{identifier}', email: email_html, email_title: 'GitLink: {nickname1} 已加入项目 {nickname2}/{repository}') email_html = File.read("#{email_template_html_dir}/project_member_left.html") self.create(type: 'MessageTemplate::ProjectMemberLeft', sys_notice: '{nickname1} 已被移出项目 {nickname2}/{repository}', notification_url: '{baseurl}/{owner}/{identifier}', email: email_html, email_title: 'GitLink: {nickname1} 已被移出项目 {nickname2}/{repository}') - self.create(type: 'MessageTemplate::ProjectMilestone', sys_notice: '{nickname1}在 {nickname2}/{repository} 创建了一个里程碑:{title}', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}') - self.create(type: 'MessageTemplate::ProjectPraised', sys_notice: '{nickname} 点赞了你管理的仓库', notification_url: '{baseurl}/{login}') + email_html = File.read("#{email_template_html_dir}/project_milestone.html") + self.create(type: 'MessageTemplate::ProjectMilestone', sys_notice: '{nickname1}在 {nickname2}/{repository} 创建了一个里程碑:{name}', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: 'GitLink: {nickname1} 在 {nickname2}/{repository} 新建了一个里程碑') + email_html = File.read("#{email_template_html_dir}/project_milestone_completed.html") + self.create(type: 'MessageTemplate::ProjectMilestoneCompleted', sys_notice: '在 {nickname}/{repository} 仓库,里程碑 {name} 的完成度已达到100%', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: 'GitLink: 仓库 {nickname}/{repository} 有里程碑已完成') + self.create(type: 'MessageTemplate::ProjectPraised', sys_notice: '{nickname1} 点赞了你管理的仓库 {nickname2}/{repository}', notification_url: '{baseurl}/{login}') email_html = File.read("#{email_template_html_dir}/project_pull_request.html") self.create(type: 'MessageTemplate::ProjectPullRequest', sys_notice: '{nickname1}在 {nickname2}/{repository} 提交了一个合并请求:{title}', notification_url: '{baseurl}/{owner}/{identifier}/pulls/{id}', email: email_html, email_title: 'GitLink: {nickname1} 在 {nickname2}/{repository} 提交了一个合并请求') email_html = File.read("#{email_template_html_dir}/project_role.html") diff --git a/app/models/message_template/issue_creator_expire.rb b/app/models/message_template/issue_creator_expire.rb new file mode 100644 index 000000000..e6f42fcc4 --- /dev/null +++ b/app/models/message_template/issue_creator_expire.rb @@ -0,0 +1,3 @@ +class MessageTemplate::IssueCreatorExpire < MessageTemplate + +end \ No newline at end of file diff --git a/app/models/message_template/issue_expire.rb b/app/models/message_template/issue_expire.rb index 882504dc2..1f48c5637 100644 --- a/app/models/message_template/issue_expire.rb +++ b/app/models/message_template/issue_expire.rb @@ -16,14 +16,45 @@ class MessageTemplate::IssueExpire < MessageTemplate # MessageTemplate::IssueCreatorExpire.get_message_content(User.where(login: 'yystopf'), Issue.last) - def self.get_message_content(receivers, issue) - project = issue&.project - owner = project&.owner - content = sys_notice.gsub('{title}', issue&.subject) - url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', issue&.id.to_s) - return receivers_string(receivers), content, url + def self.get_message_content(receiver, issue) + if receiver.user_template_message_setting.present? + return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::IssueExpire"] + project = issue&.project + owner = project&.owner + content = sys_notice.gsub('{title}', issue&.subject) + url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', issue&.id.to_s) + + return receivers_string(receivers), content, url + else + return '', '', '' + end rescue => e Rails.logger.info("MessageTemplate::IssueExpire.get_message_content [ERROR] #{e}") return '', '', '' end + + def self.get_email_message_content(receiver, issue) + if receiver.user_template_message_setting.present? + return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::IssueExpire"] + project = issue&.project + owner = project&.owner + + content = email + content.gsub!('{receiver}', receiver&.real_name) + content.gsub!('{nickname}', owner&.real_name) + content.gsub!('{login}', owner&.login) + content.gsub!('{identifier}', project&.identifier) + content.gsub!('{repository}', project&.name) + content.gsub!('{baseurl}', base_url) + content.gsub!('{title}', issue&.subject) + content.gsub!('{id}', issue&.id.to_s) + + return receiver&.mail, title, content + else + return '', '', '' + end + rescue => e + Rails.logger.info("MessageTemplate::IssueExpire.get_email_message_content [ERROR] #{e}") + return '', '', '' + end end diff --git a/app/models/message_template/project_forked.rb b/app/models/message_template/project_forked.rb index 7cd17222d..a395d0db6 100644 --- a/app/models/message_template/project_forked.rb +++ b/app/models/message_template/project_forked.rb @@ -12,11 +12,19 @@ # email_title :string(255) # -# TODO 我管理的仓库被复刻 +# 我管理的仓库被复刻 class MessageTemplate::ProjectForked < MessageTemplate # MessageTemplate::ProjectForked.get_message_content(User.where(login: 'yystopf')) - def self.get_message_content(receivers) + def self.get_message_content(receivers, user, project) + receivers.each do |receiver| + if receiver.user_template_message_setting.present? + receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["ManageProject::Forked"] + end + end + return '', '', '' if receivers.blank? + content = sys_notice.gsub('{nickname1}', user&.real_name).gsub('{nickname2}', project&.owner&.real_name).gsub('{repository}', project&.name) + url = notification_url.gsub('{login}', user&.login).gsub('{identifier}', project&.identifier) return receivers_string(receivers), content, url rescue => e Rails.logger.info("MessageTemplate::ProjectForked.get_message_content [ERROR] #{e}") diff --git a/app/models/message_template/project_milestone.rb b/app/models/message_template/project_milestone.rb index 14f992cdd..c2560c0a9 100644 --- a/app/models/message_template/project_milestone.rb +++ b/app/models/message_template/project_milestone.rb @@ -12,14 +12,57 @@ # email_title :string(255) # -# TODO 我管理的仓库有新的里程碑 +# 我管理的仓库有新的里程碑 class MessageTemplate::ProjectMilestone < MessageTemplate # MessageTemplate::ProjectMilestone.get_message_content(User.where(login: 'yystopf')) - def self.get_message_content(receivers) + def self.get_message_content(receivers, operator, milestone) + receivers.each do |receiver| + if receiver.user_template_message_setting.present? + receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["ManageProject::Milestone"] + end + end + return '', '', '' if receivers.blank? + project = milestone&.project + owner = project&.owner + content = sys_notice.gsub('{nickname1}', operator&.real_name).gsub('{nickname2}', owner&.real_name).gsub('{repository}', project&.name).gsub('{name}', milestone&.name) + url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', milestone&.id.to_s) + return receivers_string(receivers), content, url rescue => e Rails.logger.info("MessageTemplate::ProjectMilestone.get_message_content [ERROR] #{e}") return '', '', '' end + + def self.get_email_message_content(receiver, operator, milestone) + if receiver.user_template_message_setting.present? + return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Milestone"] + project = milestone&.project + owner = project&.owner + title = email_title + title.gsub!('{nickname1}', operator&.real_name) + title.gsub!('{nickname2}', owner&.real_name) + title.gsub!('{repository}', project&.name) + + content = email + content.gsub!('{receiver}', receiver&.real_name) + content.gsub!('{baseurl}', base_url) + content.gsub!('{login1}', operator&.login) + content.gsub!('{nickname1}', operator&.real_name) + content.gsub!('{nickname2}', owner&.real_name) + content.gsub!('{repository}', project&.name) + content.gsub!('{login2}', owner&.login) + content.gsub!('{identifier}', project&.identifier) + content.gsub!('{id}', milestone&.id.to_s) + content.gsub!('{name}', milestone&.name) + + return receiver&.mail, title, content + else + return '', '', '' + end + + rescue => e + Rails.logger.info("MessageTemplate::ProjectMilestone.get_email_message_content [ERROR] #{e}") + return '', '', '' + end end diff --git a/app/models/message_template/project_milestone_completed.rb b/app/models/message_template/project_milestone_completed.rb new file mode 100644 index 000000000..877bf0335 --- /dev/null +++ b/app/models/message_template/project_milestone_completed.rb @@ -0,0 +1,65 @@ +# == Schema Information +# +# Table name: message_templates +# +# id :integer not null, primary key +# type :string(255) +# sys_notice :text(65535) +# email :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# notification_url :string(255) +# email_title :string(255) +# + +# 我管理的仓库有里程碑完成 +class MessageTemplate::ProjectMilestoneCompleted < MessageTemplate + + # MessageTemplate::ProjectMilestoneCompleted.get_message_content(User.where(login: 'yystopf')) + def self.get_message_content(receivers, milestone) + receivers.each do |receiver| + if receiver.user_template_message_setting.present? + receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["ManageProject::MilestoneCompleted"] + end + end + return '', '', '' if receivers.blank? + project = milestone&.project + owner = project&.owner + content = sys_notice.gsub('{nickname}', owner&.real_name).gsub('{repository}', project&.name).gsub('{name}', milestone&.name) + url = notification_url.gsub('{owner}', owner&.login).gsub('{identifier}', project&.identifier).gsub('{id}', milestone&.id.to_s) + + return receivers_string(receivers), content, url + rescue => e + Rails.logger.info("MessageTemplate::ProjectMilestoneCompleted.get_message_content [ERROR] #{e}") + return '', '', '' + end + + def self.get_email_message_content(receiver, milestone) + if receiver.user_template_message_setting.present? + return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::MilestoneCompleted"] + project = milestone&.project + owner = project&.owner + title = email_title + title.gsub!('{nickname}', owner&.real_name) + title.gsub!('{repository}', project&.name) + + content = email + content.gsub!('{receiver}', receiver&.real_name) + content.gsub!('{baseurl}', base_url) + content.gsub!('{nickname}', owner&.real_name) + content.gsub!('{repository}', project&.name) + content.gsub!('{login}', owner&.login) + content.gsub!('{identifier}', project&.identifier) + content.gsub!('{id}', milestone&.id.to_s) + content.gsub!('{name}', milestone&.name) + + return receiver&.mail, title, content + else + return '', '', '' + end + + rescue => e + Rails.logger.info("MessageTemplate::ProjectMilestoneCompleted.get_email_message_content [ERROR] #{e}") + return '', '', '' + end +end diff --git a/app/models/message_template/project_praised.rb b/app/models/message_template/project_praised.rb index e6acee6f5..35af6148f 100644 --- a/app/models/message_template/project_praised.rb +++ b/app/models/message_template/project_praised.rb @@ -12,11 +12,19 @@ # email_title :string(255) # -# TODO 我管理的仓库被点赞 +# 我管理的仓库被点赞 class MessageTemplate::ProjectPraised < MessageTemplate # MessageTemplate::ProjectPraised.get_message_content(User.where(login: 'yystopf')) - def self.get_message_content(receivers) + def self.get_message_content(receivers, user, project) + receivers.each do |receiver| + if receiver.user_template_message_setting.present? + receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["ManageProject::Praised"] + end + end + return '', '', '' if receivers.blank? + content = sys_notice.gsub('{nickname1}', user&.real_name).gsub('{nickname2}', project&.owner&.real_name).gsub('{repository}', project&.name) + url = notification_url.gsub('{login}', user&.login) return receivers_string(receivers), content, url rescue => e Rails.logger.info("MessageTemplate::ProjectPraised.get_message_content [ERROR] #{e}") diff --git a/app/models/version.rb b/app/models/version.rb index 77cb58a7e..41256833a 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -40,8 +40,19 @@ class Version < ApplicationRecord # issues.select(:id,:status_id).where(status_id: 5).size # end + after_create :send_create_message_to_notice_system + after_save :send_update_message_to_notice_system + def version_user User.select(:login, :lastname,:firstname, :nickname)&.find_by_id(self.user_id) end + private + def send_create_message_to_notice_system + SendTemplateMessageJob.perform_later('ProjectMilestone', self.id, self.user_id) if Site.has_notice_menu? + end + + def send_update_message_to_notice_system + SendTemplateMessageJob.perform_later('ProjectMilestoneCompleted', self.id) if Site.has_notice_menu? && self.percent == 1.0 + end end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 84b80f50f..5ae26d6bb 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -35,6 +35,8 @@ class Projects::ForkService < ApplicationService ForkUser.create(project_id: @project.id, fork_project_id: clone_project.id, user_id: clone_project.user_id) clone_project + + SendTemplateMessageJob.perform_later('ProjectForked', @target_owner.id, @project.id) if Site.has_notice_menu? end rescue => e puts "clone project service error: #{e.message}" diff --git a/public/docs/api.html b/public/docs/api.html index 1df920eef..45da64400 100644 --- a/public/docs/api.html +++ b/public/docs/api.html @@ -1141,8 +1141,8 @@ Success — a happy kitten is an authenticated kitten! 有新指派给我的疑修 -IssueAssignerExpire -我负责的疑修截止日期到达最后一天 +IssueExpire +我创建或负责的疑修截止日期到达最后一天 IssueAtme @@ -1153,10 +1153,6 @@ Success — a happy kitten is an authenticated kitten! 我创建或负责的疑修状态变更 -IssueCreatorExpire -我创建的疑修截止日期到达最后一天 - - IssueDeleted 我创建或负责的疑修删除 @@ -1213,6 +1209,10 @@ Success — a happy kitten is an authenticated kitten! 我管理的仓库有成员移出 +ProjectMilestoneCompleted +我管理的仓库有里程碑完成度100% + + ProjectMilestone 我管理的仓库有新的里程碑 diff --git a/public/message_template/issue_expire.html b/public/message_template/issue_expire.html new file mode 100644 index 000000000..641742bb0 --- /dev/null +++ b/public/message_template/issue_expire.html @@ -0,0 +1,47 @@ + + + 疑修截止日期到达最后一天 + + + + +
+
+
+ +

确实开源,协同创新

+
+
+
+

+ {receiver},您好!
+ 疑修 {title} 已临近截止日期,请尽快处理
+

+
+
+
+

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
+ QQ群:1071514693

+

GitLink团队

+
+
+
+
+ + \ No newline at end of file diff --git a/public/message_template/project_milestone.html b/public/message_template/project_milestone.html new file mode 100644 index 000000000..6f1a4b112 --- /dev/null +++ b/public/message_template/project_milestone.html @@ -0,0 +1,47 @@ + + + 管理的仓库有新的里程碑 + + + + +
+
+
+ +

确实开源,协同创新

+
+
+
+

+ {receiver},您好!
+ {nickname1}在仓库 {nickname2}/{repository} 新建了一个里程碑:{name}
+

+
+
+
+

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
+ QQ群:1071514693

+

GitLink团队

+
+
+
+
+ + \ No newline at end of file diff --git a/public/message_template/project_milestone_completed.html b/public/message_template/project_milestone_completed.html new file mode 100644 index 000000000..89960e3c9 --- /dev/null +++ b/public/message_template/project_milestone_completed.html @@ -0,0 +1,47 @@ + + + 管理的仓库有里程碑已完成 + + + + +
+
+
+ +

确实开源,协同创新

+
+
+
+

+ {receiver},您好!
+ 在 {nickname}/{repository} 里程碑{name}的完成度已达到100%
+

+
+
+
+

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
+ QQ群:1071514693

+

GitLink团队

+
+
+
+
+ + \ No newline at end of file From b223abe229197b03b7f2e24bd41ffb197fc5af33 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 15 Feb 2022 17:26:46 +0800 Subject: [PATCH 4/5] fix: init data --- app/models/message_template.rb | 2 ++ app/models/template_message_setting.rb | 1 + 2 files changed, 3 insertions(+) diff --git a/app/models/message_template.rb b/app/models/message_template.rb index 48b1b69c6..87b76a596 100644 --- a/app/models/message_template.rb +++ b/app/models/message_template.rb @@ -15,6 +15,8 @@ class MessageTemplate < ApplicationRecord def self.build_init_data + MessageTemplate::IssueAssignerExpire.destroy_all + MessageTemplate::IssueCreatorExpire.destroy_all self.create(type: 'MessageTemplate::FollowedTip', sys_notice: '{nickname} 关注了你', notification_url: '{baseurl}/{login}') email_html = File.read("#{email_template_html_dir}/issue_assigned.html") self.create(type: 'MessageTemplate::IssueAssigned', sys_notice: '{nickname1}在 {nickname2}/{repository} 指派给你一个疑修:{title}', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}', email: email_html, email_title: 'GitLink: {nickname1} 在 {nickname2}/{repository} 指派给你一个疑修') diff --git a/app/models/template_message_setting.rb b/app/models/template_message_setting.rb index a9c81500b..67f9586d0 100644 --- a/app/models/template_message_setting.rb +++ b/app/models/template_message_setting.rb @@ -22,6 +22,7 @@ class TemplateMessageSetting < ApplicationRecord end def self.build_init_data + TemplateMessageSetting.destroy_all TemplateMessageSetting::CreateOrAssign.build_init_data TemplateMessageSetting::ManageProject.build_init_data TemplateMessageSetting::Normal.build_init_data From e3f4313c80d68bc5ee0e2fd179693f56ebf7e3e5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 15 Feb 2022 17:29:13 +0800 Subject: [PATCH 5/5] fix --- app/models/message_template.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/message_template.rb b/app/models/message_template.rb index 87b76a596..bc1c80033 100644 --- a/app/models/message_template.rb +++ b/app/models/message_template.rb @@ -20,7 +20,6 @@ class MessageTemplate < ApplicationRecord self.create(type: 'MessageTemplate::FollowedTip', sys_notice: '{nickname} 关注了你', notification_url: '{baseurl}/{login}') email_html = File.read("#{email_template_html_dir}/issue_assigned.html") self.create(type: 'MessageTemplate::IssueAssigned', sys_notice: '{nickname1}在 {nickname2}/{repository} 指派给你一个疑修:{title}', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}', email: email_html, email_title: 'GitLink: {nickname1} 在 {nickname2}/{repository} 指派给你一个疑修') - self.create(type: 'MessageTemplate::IssueAssignerExpire', sys_notice: '您负责的疑修 {title} 已临近截止日期,请尽快处理', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') self.create(type: 'MessageTemplate::IssueAtme', sys_notice: '{nickname} 在疑修 {title} 中@我', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}') email_html = File.read("#{email_template_html_dir}/issue_changed.html") self.create(type: 'MessageTemplate::IssueChanged', sys_notice: '在项目 {nickname2}/{repository} 的疑修 {title} 中:{ifassigner}{nickname1}将负责人从 {assigner1} 修改为 {assigner2} {endassigner}{ifstatus}{nickname1}将状态从 {status1} 修改为 {status2} {endstatus}{iftracker}{nickname1}将类型从 {tracker1} 修改为 {tracker2} {endtracker}{ifpriority}{nickname1}将优先级从 {priority1} 修改为 {priority2} {endpriority}{ifmilestone}{nickname1}将里程碑从 {milestone1} 修改为 {milestone2} {endmilestone}{iftag}{nickname1}将标记从 {tag1} 修改为 {tag2} {endtag}{ifdoneratio}{nickname1}将完成度从 {doneratio1} 修改为 {doneratio2} {enddoneratio}{ifbranch}{nickname1}将指定分支从 {branch1} 修改为 {branch2} {endbranch}{ifstartdate}{nickname1}将开始日期从 {startdate1} 修改为 {startdate2} {endstartdate}{ifduedate}{nickname1}将结束日期从 {duedate1} 修改为 {duedate2} {endduedate}', email: email_html, email_title: 'GitLink: 疑修 {title} 有状态变更', notification_url: '{baseurl}/{owner}/{identifier}/issues/{id}')