| @@ -43,7 +43,7 @@ class CompareController < ApplicationController | |||||
| def load_compare_params | def load_compare_params | ||||
| @base = Addressable::URI.unescape(params[:base]) | @base = Addressable::URI.unescape(params[:base]) | ||||
| @head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head] | |||||
| @head = params[:head].include?('.json') ? params[:head][0..-6] : params[:head] | |||||
| end | end | ||||
| @@ -13,7 +13,7 @@ class ForksController < ApplicationController | |||||
| if current_user&.id == @project.user_id | if current_user&.id == @project.user_id | ||||
| render_result(-1, "自己不能fork自己的项目") | render_result(-1, "自己不能fork自己的项目") | ||||
| elsif Project.exists?(user_id: current_user.id, identifier: @project.identifier) | elsif Project.exists?(user_id: current_user.id, identifier: @project.identifier) | ||||
| render_result(-1, "fork失败,你已拥有了这个项目") | |||||
| render_result(0, "fork失败,你已拥有了这个项目") | |||||
| end | end | ||||
| # return if current_user != @project.owner | # return if current_user != @project.owner | ||||
| # render_result(-1, "自己不能fork自己的项目") | # render_result(-1, "自己不能fork自己的项目") | ||||
| @@ -2,7 +2,7 @@ class IssueTagsController < ApplicationController | |||||
| before_action :require_login, except: [:index] | before_action :require_login, except: [:index] | ||||
| before_action :load_repository | before_action :load_repository | ||||
| before_action :set_user | before_action :set_user | ||||
| before_action :check_issue_permission, except: :index | |||||
| before_action :check_issue_tags_permission | |||||
| before_action :set_issue_tag, only: [:edit, :update, :destroy] | before_action :set_issue_tag, only: [:edit, :update, :destroy] | ||||
| @@ -122,9 +122,9 @@ class IssueTagsController < ApplicationController | |||||
| @user = @project.owner | @user = @project.owner | ||||
| end | end | ||||
| def check_issue_permission | |||||
| unless @project.member?(current_user) || current_user.admin? | |||||
| normal_status(-1, "您没有权限") | |||||
| def check_issue_tags_permission | |||||
| unless @project.manager?(current_user) || current_user.admin? | |||||
| return render_forbidden('你不是管理员,没有权限操作') | |||||
| end | end | ||||
| end | end | ||||
| @@ -3,7 +3,7 @@ class MembersController < ApplicationController | |||||
| before_action :load_project | before_action :load_project | ||||
| before_action :find_user_with_id, only: %i[create remove change_role] | before_action :find_user_with_id, only: %i[create remove change_role] | ||||
| before_action :check_user_profile_completed, only: [:create] | before_action :check_user_profile_completed, only: [:create] | ||||
| before_action :operate!, except: %i[index] | |||||
| before_action :operate! | |||||
| before_action :check_member_exists!, only: %i[create] | before_action :check_member_exists!, only: %i[create] | ||||
| before_action :check_member_not_exists!, only: %i[remove change_role] | before_action :check_member_not_exists!, only: %i[remove change_role] | ||||
| @@ -46,7 +46,7 @@ class Organizations::OrganizationsController < Organizations::BaseController | |||||
| @organization.save! | @organization.save! | ||||
| sync_organization_extension! | sync_organization_extension! | ||||
| Gitea::Organization::UpdateService.call(@organization.gitea_token, login, @organization.reload) | |||||
| Gitea::Organization::UpdateService.call(current_user.gitea_token, login, @organization.reload) | |||||
| Util.write_file(@image, avatar_path(@organization)) if params[:image].present? | Util.write_file(@image, avatar_path(@organization)) if params[:image].present? | ||||
| end | end | ||||
| rescue Exception => e | rescue Exception => e | ||||
| @@ -57,10 +57,14 @@ class Organizations::OrganizationsController < Organizations::BaseController | |||||
| def destroy | def destroy | ||||
| tip_exception("密码不正确") unless current_user.check_password?(password) | tip_exception("密码不正确") unless current_user.check_password?(password) | ||||
| ActiveRecord::Base.transaction do | ActiveRecord::Base.transaction do | ||||
| Gitea::Organization::DeleteService.call(@organization.gitea_token, @organization.login) | |||||
| @organization.destroy! | |||||
| gitea_status, gitea_message = Gitea::Organization::DeleteService.call(current_user.gitea_token, @organization.login) | |||||
| if gitea_status == 204 | |||||
| @organization.destroy! | |||||
| render_ok | |||||
| else | |||||
| tip_exception("当组织内含有仓库时,无法删除此组织") | |||||
| end | |||||
| end | end | ||||
| render_ok | |||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| tip_exception(e.message) | tip_exception(e.message) | ||||
| @@ -56,6 +56,7 @@ class PullRequestsController < ApplicationController | |||||
| end | end | ||||
| def create | def create | ||||
| return render_forbidden("你没有权限操作.") unless @project.operator?(current_user) | |||||
| ActiveRecord::Base.transaction do | ActiveRecord::Base.transaction do | ||||
| @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) | @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) | ||||
| if @gitea_pull_request[:status] == :success | if @gitea_pull_request[:status] == :success | ||||
| @@ -78,6 +79,7 @@ class PullRequestsController < ApplicationController | |||||
| end | end | ||||
| def update | def update | ||||
| return render_forbidden("你没有权限操作.") unless @project.operator?(current_user) | |||||
| if params[:title].nil? | if params[:title].nil? | ||||
| normal_status(-1, "名称不能为空") | normal_status(-1, "名称不能为空") | ||||
| elsif params[:issue_tag_ids].nil? | elsif params[:issue_tag_ids].nil? | ||||
| @@ -197,7 +199,7 @@ class PullRequestsController < ApplicationController | |||||
| def check_can_merge | def check_can_merge | ||||
| target_head = params[:head] #源分支 | target_head = params[:head] #源分支 | ||||
| target_base = params[:base] #目标分支 | target_base = params[:base] #目标分支 | ||||
| is_original = params[:is_original] | |||||
| is_original = params[:is_original] || false | |||||
| if target_head.blank? || target_base.blank? | if target_head.blank? || target_base.blank? | ||||
| normal_status(-2, "请选择分支") | normal_status(-2, "请选择分支") | ||||
| elsif target_head === target_base && !is_original | elsif target_head === target_base && !is_original | ||||
| @@ -228,11 +230,11 @@ class PullRequestsController < ApplicationController | |||||
| private | private | ||||
| def load_pull_request | def load_pull_request | ||||
| @pull_request = PullRequest.find params[:id] | |||||
| @pull_request = @project.pull_requests.where(gitea_number: params[:id]).where.not(id: params[:id]).take || PullRequest.find_by_id(params[:id]) | |||||
| end | end | ||||
| def find_pull_request | def find_pull_request | ||||
| @pull_request = PullRequest.find_by_id(params[:id]) | |||||
| @pull_request = @project.pull_requests.where(gitea_number: params[:id]).where.not(id: params[:id]).take || PullRequest.find_by_id(params[:id]) | |||||
| @issue = @pull_request&.issue | @issue = @pull_request&.issue | ||||
| if @pull_request.blank? | if @pull_request.blank? | ||||
| normal_status(-1, "合并请求不存在") | normal_status(-1, "合并请求不存在") | ||||
| @@ -32,7 +32,8 @@ class UsersController < ApplicationController | |||||
| @waiting_applied_messages = @user.applied_messages.waiting | @waiting_applied_messages = @user.applied_messages.waiting | ||||
| @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common | @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common | ||||
| @common_applied_projects = AppliedProject.where(project_id: @user.full_admin_projects).common | @common_applied_projects = AppliedProject.where(project_id: @user.full_admin_projects).common | ||||
| @undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size | |||||
| #@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size | |||||
| @undo_events = @common_applied_transfer_projects.size + @common_applied_projects.size | |||||
| else | else | ||||
| @waiting_applied_messages = AppliedMessage.none | @waiting_applied_messages = AppliedMessage.none | ||||
| @common_applied_transfer_projects = AppliedTransferProject.none | @common_applied_transfer_projects = AppliedTransferProject.none | ||||
| @@ -8,4 +8,11 @@ class Organizations::CreateForm < BaseForm | |||||
| validates :description, length: { maximum: 200 } | validates :description, length: { maximum: 200 } | ||||
| validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } | validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } | ||||
| validate do | |||||
| check_name(name) unless name.blank? | |||||
| end | |||||
| def check_name(name) | |||||
| raise "组织账号已被使用." if Owner.where(login: name.strip).exists? | |||||
| end | |||||
| end | end | ||||
| @@ -36,26 +36,28 @@ class MessageTemplate::IssueAssigned < MessageTemplate | |||||
| def self.get_email_message_content(receiver, operator, issue) | def self.get_email_message_content(receiver, operator, issue) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::IssueAssigned"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::IssueAssigned"] | ||||
| project = issue&.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!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', 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 | end | ||||
| project = issue&.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!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', 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 | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::IssueAssigned.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::IssueAssigned.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -191,177 +191,180 @@ class MessageTemplate::IssueChanged < MessageTemplate | |||||
| return '', '', '' if change_params.blank? | return '', '', '' if change_params.blank? | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::IssueChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::IssueChanged"] | ||||
| end | |||||
| project = issue&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', issue&.subject) | |||||
| 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!('{login2}', owner&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{title}', issue&.subject) | |||||
| content.gsub!('{id}', issue&.id.to_s) | |||||
| change_count = change_params.keys.size | |||||
| # 易修负责人修改 | |||||
| if change_params[:assigned_to_id].present? | |||||
| assigner1 = User.find_by_id(change_params[:assigned_to_id][0]) | |||||
| assigner2 = User.find_by_id(change_params[:assigned_to_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifassigner}', '<br/>') | |||||
| project = issue&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', issue&.subject) | |||||
| 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!('{login2}', owner&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{title}', issue&.subject) | |||||
| content.gsub!('{id}', issue&.id.to_s) | |||||
| change_count = change_params.keys.size | |||||
| # 易修负责人修改 | |||||
| if change_params[:assigned_to_id].present? | |||||
| assigner1 = User.find_by_id(change_params[:assigned_to_id][0]) | |||||
| assigner2 = User.find_by_id(change_params[:assigned_to_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifassigner}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifassigner}', '') | |||||
| end | |||||
| content.sub!('{endassigner}', '') | |||||
| content.gsub!('{assigner1}', assigner1.present? ? assigner1&.real_name : '未指派成员') | |||||
| content.gsub!('{assigner2}', assigner2.present? ? assigner2&.real_name : '未指派成员') | |||||
| else | else | ||||
| content.sub!('{ifassigner}', '') | |||||
| content.gsub!(/({ifassigner})(.*)({endassigner})/, '') | |||||
| end | end | ||||
| content.sub!('{endassigner}', '') | |||||
| content.gsub!('{assigner1}', assigner1.present? ? assigner1&.real_name : '未指派成员') | |||||
| content.gsub!('{assigner2}', assigner2.present? ? assigner2&.real_name : '未指派成员') | |||||
| else | |||||
| content.gsub!(/({ifassigner})(.*)({endassigner})/, '') | |||||
| end | |||||
| # 易修状态修改 | |||||
| if change_params[:status_id].present? | |||||
| status1 = IssueStatus.find_by_id(change_params[:status_id][0]) | |||||
| status2 = IssueStatus.find_by_id(change_params[:status_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifstatus}', '<br/>') | |||||
| # 易修状态修改 | |||||
| if change_params[:status_id].present? | |||||
| status1 = IssueStatus.find_by_id(change_params[:status_id][0]) | |||||
| status2 = IssueStatus.find_by_id(change_params[:status_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifstatus}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifstatus}', '') | |||||
| end | |||||
| content.sub!('{endstatus}', '') | |||||
| content.gsub!('{status1}', status1&.name) | |||||
| content.gsub!('{status2}', status2&.name) | |||||
| else | else | ||||
| content.sub!('{ifstatus}', '') | |||||
| content.gsub!(/({ifstatus})(.*)({endstatus})/, '') | |||||
| end | end | ||||
| content.sub!('{endstatus}', '') | |||||
| content.gsub!('{status1}', status1&.name) | |||||
| content.gsub!('{status2}', status2&.name) | |||||
| else | |||||
| content.gsub!(/({ifstatus})(.*)({endstatus})/, '') | |||||
| end | |||||
| # 易修类型修改 | |||||
| if change_params[:tracker_id].present? | |||||
| tracker1 = Tracker.find_by_id(change_params[:tracker_id][0]) | |||||
| tracker2 = Tracker.find_by_id(change_params[:tracker_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{iftracker}', '<br/>') | |||||
| # 易修类型修改 | |||||
| if change_params[:tracker_id].present? | |||||
| tracker1 = Tracker.find_by_id(change_params[:tracker_id][0]) | |||||
| tracker2 = Tracker.find_by_id(change_params[:tracker_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{iftracker}', '<br/>') | |||||
| else | |||||
| content.sub!('{iftracker}', '') | |||||
| end | |||||
| content.sub!('{endtracker}', '') | |||||
| content.gsub!('{tracker1}', tracker1&.name) | |||||
| content.gsub!('{tracker2}', tracker2&.name) | |||||
| else | else | ||||
| content.sub!('{iftracker}', '') | |||||
| content.gsub!(/({iftracker})(.*)({endtracker})/, '') | |||||
| end | end | ||||
| content.sub!('{endtracker}', '') | |||||
| content.gsub!('{tracker1}', tracker1&.name) | |||||
| content.gsub!('{tracker2}', tracker2&.name) | |||||
| else | |||||
| content.gsub!(/({iftracker})(.*)({endtracker})/, '') | |||||
| end | |||||
| # 易修里程碑修改 | |||||
| if change_params[:fixed_version_id].present? | |||||
| fix_version1 = Version.find_by_id(change_params[:fixed_version_id][0]) | |||||
| fix_version2 = Version.find_by_id(change_params[:fixed_version_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifmilestone}', '<br/>') | |||||
| # 易修里程碑修改 | |||||
| if change_params[:fixed_version_id].present? | |||||
| fix_version1 = Version.find_by_id(change_params[:fixed_version_id][0]) | |||||
| fix_version2 = Version.find_by_id(change_params[:fixed_version_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifmilestone}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifmilestone}', '') | |||||
| end | |||||
| content.sub!('{endmilestone}', '') | |||||
| content.gsub!('{milestone1}', fix_version1.present? ? fix_version1&.name : '未选择里程碑') | |||||
| content.gsub!('{milestone2}', fix_version2.present? ? fix_version2&.name : '未选择里程碑') | |||||
| else | else | ||||
| content.sub!('{ifmilestone}', '') | |||||
| content.gsub!(/({ifmilestone})(.*)({endmilestone})/, '') | |||||
| end | end | ||||
| content.sub!('{endmilestone}', '') | |||||
| content.gsub!('{milestone1}', fix_version1.present? ? fix_version1&.name : '未选择里程碑') | |||||
| content.gsub!('{milestone2}', fix_version2.present? ? fix_version2&.name : '未选择里程碑') | |||||
| else | |||||
| content.gsub!(/({ifmilestone})(.*)({endmilestone})/, '') | |||||
| end | |||||
| # 易修标记修改 | |||||
| if change_params[:issue_tags_value].present? | |||||
| issue_tags1 = IssueTag.where(id: change_params[:issue_tags_value][0]).distinct | |||||
| issue_tags2 = IssueTag.where(id: change_params[:issue_tags_value][1]).distinct | |||||
| tag1 = issue_tags1.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags1.pluck(:name).join(",") | |||||
| tag2 = issue_tags2.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags2.pluck(:name).join(",") | |||||
| if change_count > 1 | |||||
| content.sub!('{iftag}', '<br/>') | |||||
| # 易修标记修改 | |||||
| if change_params[:issue_tags_value].present? | |||||
| issue_tags1 = IssueTag.where(id: change_params[:issue_tags_value][0]).distinct | |||||
| issue_tags2 = IssueTag.where(id: change_params[:issue_tags_value][1]).distinct | |||||
| tag1 = issue_tags1.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags1.pluck(:name).join(",") | |||||
| tag2 = issue_tags2.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags2.pluck(:name).join(",") | |||||
| if change_count > 1 | |||||
| content.sub!('{iftag}', '<br/>') | |||||
| else | |||||
| content.sub!('{iftag}', '') | |||||
| end | |||||
| content.sub!('{endtag}', '') | |||||
| content.gsub!('{tag1}', tag1) | |||||
| content.gsub!('{tag2}', tag2) | |||||
| else | else | ||||
| content.sub!('{iftag}', '') | |||||
| content.gsub!(/({iftag})(.*)({endtag})()/, '') | |||||
| end | end | ||||
| content.sub!('{endtag}', '') | |||||
| content.gsub!('{tag1}', tag1) | |||||
| content.gsub!('{tag2}', tag2) | |||||
| else | |||||
| content.gsub!(/({iftag})(.*)({endtag})()/, '') | |||||
| end | |||||
| # 易修优先级修改 | |||||
| if change_params[:priority_id].present? | |||||
| priority1 = IssuePriority.find_by_id(change_params[:priority_id][0]) | |||||
| priority2 = IssuePriority.find_by_id(change_params[:priority_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifpriority}', '<br/>') | |||||
| # 易修优先级修改 | |||||
| if change_params[:priority_id].present? | |||||
| priority1 = IssuePriority.find_by_id(change_params[:priority_id][0]) | |||||
| priority2 = IssuePriority.find_by_id(change_params[:priority_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifpriority}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifpriority}', '') | |||||
| end | |||||
| content.sub!('{endpriority}', '') | |||||
| content.gsub!('{priority1}', priority1&.name) | |||||
| content.gsub!('{priority2}', priority2&.name) | |||||
| else | else | ||||
| content.sub!('{ifpriority}', '') | |||||
| content.gsub!(/({ifpriority})(.*)({endpriority})/, '') | |||||
| end | end | ||||
| content.sub!('{endpriority}', '') | |||||
| content.gsub!('{priority1}', priority1&.name) | |||||
| content.gsub!('{priority2}', priority2&.name) | |||||
| else | |||||
| content.gsub!(/({ifpriority})(.*)({endpriority})/, '') | |||||
| end | |||||
| # 易修完成度修改 | |||||
| if change_params[:done_ratio].present? | |||||
| doneratio1 = change_params[:done_ratio][0] | |||||
| doneratio2 = change_params[:done_ratio][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifdoneratio}', '<br/>') | |||||
| # 易修完成度修改 | |||||
| if change_params[:done_ratio].present? | |||||
| doneratio1 = change_params[:done_ratio][0] | |||||
| doneratio2 = change_params[:done_ratio][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifdoneratio}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifdoneratio}', '') | |||||
| end | |||||
| content.sub!('{enddoneratio}', '') | |||||
| content.gsub!('{doneratio1}', "#{doneratio1}%") | |||||
| content.gsub!('{doneratio2}', "#{doneratio2}%") | |||||
| else | else | ||||
| content.sub!('{ifdoneratio}', '') | |||||
| content.gsub!(/({ifdoneratio})(.*)({enddoneratio})/, '') | |||||
| end | end | ||||
| content.sub!('{enddoneratio}', '') | |||||
| content.gsub!('{doneratio1}', "#{doneratio1}%") | |||||
| content.gsub!('{doneratio2}', "#{doneratio2}%") | |||||
| else | |||||
| content.gsub!(/({ifdoneratio})(.*)({enddoneratio})/, '') | |||||
| end | |||||
| # 易修指定分支修改 | |||||
| if change_params[:branch_name].present? | |||||
| branch1 = change_params[:branch_name][0].blank? ? '分支未指定' : change_params[:branch_name][0] | |||||
| branch2 = change_params[:branch_name][1].blank? ? '分支未指定' : change_params[:branch_name][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifbranch}', '<br/>') | |||||
| # 易修指定分支修改 | |||||
| if change_params[:branch_name].present? | |||||
| branch1 = change_params[:branch_name][0].blank? ? '分支未指定' : change_params[:branch_name][0] | |||||
| branch2 = change_params[:branch_name][1].blank? ? '分支未指定' : change_params[:branch_name][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifbranch}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifbranch}', '') | |||||
| end | |||||
| content.sub!('{endbranch}', '') | |||||
| content.gsub!('{branch1}', branch1) | |||||
| content.gsub!('{branch2}', branch2) | |||||
| else | else | ||||
| content.sub!('{ifbranch}', '') | |||||
| content.gsub!(/({ifbranch})(.*)({endbranch})/, '') | |||||
| end | end | ||||
| content.sub!('{endbranch}', '') | |||||
| content.gsub!('{branch1}', branch1) | |||||
| content.gsub!('{branch2}', branch2) | |||||
| else | |||||
| content.gsub!(/({ifbranch})(.*)({endbranch})/, '') | |||||
| end | |||||
| # 易修开始日期修改 | |||||
| if change_params[:start_date].present? | |||||
| startdate1 = change_params[:start_date][0].blank? ? "未选择开始日期" : change_params[:start_date][0] | |||||
| startdate2 = change_params[:start_date][1].blank? ? "未选择开始日期" : change_params[:start_date][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifstartdate}', '<br/>') | |||||
| # 易修开始日期修改 | |||||
| if change_params[:start_date].present? | |||||
| startdate1 = change_params[:start_date][0].blank? ? "未选择开始日期" : change_params[:start_date][0] | |||||
| startdate2 = change_params[:start_date][1].blank? ? "未选择开始日期" : change_params[:start_date][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifstartdate}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifstartdate}', '') | |||||
| end | |||||
| content.sub!('{endstartdate}', '') | |||||
| content.gsub!('{startdate1}', startdate1 ) | |||||
| content.gsub!('{startdate2}', startdate2) | |||||
| else | else | ||||
| content.sub!('{ifstartdate}', '') | |||||
| content.gsub!(/({ifstartdate})(.*)({endstartdate})/, '') | |||||
| end | end | ||||
| content.sub!('{endstartdate}', '') | |||||
| content.gsub!('{startdate1}', startdate1 ) | |||||
| content.gsub!('{startdate2}', startdate2) | |||||
| else | |||||
| content.gsub!(/({ifstartdate})(.*)({endstartdate})/, '') | |||||
| end | |||||
| # 易修结束日期修改 | |||||
| if change_params[:due_date].present? | |||||
| duedate1 = change_params[:due_date][0].blank? ? '未选择结束日期' : change_params[:due_date][0] | |||||
| duedate2 = change_params[:due_date][1].blank? ? '未选择结束日期' : change_params[:due_date][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifduedate}', '<br/>') | |||||
| # 易修结束日期修改 | |||||
| if change_params[:due_date].present? | |||||
| duedate1 = change_params[:due_date][0].blank? ? '未选择结束日期' : change_params[:due_date][0] | |||||
| duedate2 = change_params[:due_date][1].blank? ? '未选择结束日期' : change_params[:due_date][1] | |||||
| if change_count > 1 | |||||
| content.sub!('{ifduedate}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifduedate}', '') | |||||
| end | |||||
| content.sub!('{endduedate}', '') | |||||
| content.gsub!('{duedate1}', duedate1) | |||||
| content.gsub!('{duedate2}', duedate2) | |||||
| else | else | ||||
| content.sub!('{ifduedate}', '') | |||||
| content.gsub!(/({ifduedate})(.*)({endduedate})/, '') | |||||
| end | end | ||||
| content.sub!('{endduedate}', '') | |||||
| content.gsub!('{duedate1}', duedate1) | |||||
| content.gsub!('{duedate2}', duedate2) | |||||
| return receiver&.mail, title, content | |||||
| else | else | ||||
| content.gsub!(/({ifduedate})(.*)({endduedate})/, '') | |||||
| return '', '', '' | |||||
| end | end | ||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::IssueChanged.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::IssueChanged.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -33,17 +33,19 @@ class MessageTemplate::IssueDeleted < MessageTemplate | |||||
| def self.get_email_message_content(receiver, operator, issue_title) | def self.get_email_message_content(receiver, operator, issue_title) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::IssueChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::IssueChanged"] | ||||
| end | |||||
| title = email_title | |||||
| title.gsub!('{title}', issue_title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname}', operator&.real_name) | |||||
| content.gsub!('{login}', operator&.login) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', issue_title) | |||||
| title = email_title | |||||
| title.gsub!('{title}', issue_title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname}', operator&.real_name) | |||||
| content.gsub!('{login}', operator&.login) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', issue_title) | |||||
| return receiver&.mail, title, content | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::IssueDeleted.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::IssueDeleted.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,16 +34,19 @@ class MessageTemplate::OrganizationJoined < MessageTemplate | |||||
| def self.get_email_message_content(receiver, organization) | def self.get_email_message_content(receiver, organization) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Organization"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Organization"] | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::OrganizationJoined.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::OrganizationJoined.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,16 +34,19 @@ class MessageTemplate::OrganizationLeft < MessageTemplate | |||||
| def self.get_email_message_content(receiver, organization) | def self.get_email_message_content(receiver, organization) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Organization"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Organization"] | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::OrganizationLeft.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::OrganizationLeft.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,18 +34,21 @@ class MessageTemplate::OrganizationRole < MessageTemplate | |||||
| def self.get_email_message_content(receiver, organization, role) | def self.get_email_message_content(receiver, organization, role) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| title.gsub!('{role}', role) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| content.gsub!('{role}', role) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{organization}', organization&.real_name) | |||||
| title.gsub!('{role}', role) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', organization&.login) | |||||
| content.gsub!('{organization}', organization&.real_name) | |||||
| content.gsub!('{role}', role) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::OrganizationRole.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::OrganizationRole.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -38,27 +38,30 @@ class MessageTemplate::ProjectIssue < MessageTemplate | |||||
| def self.get_email_message_content(receiver, is_manager, operator, issue) | def self.get_email_message_content(receiver, is_manager, operator, issue) | ||||
| if receiver.user_template_message_setting.present? && is_manager | if receiver.user_template_message_setting.present? && is_manager | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Issue"] | return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Issue"] | ||||
| project = issue&.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}', issue&.id.to_s) | |||||
| content.gsub!('{title}', issue&.subject) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| project = issue&.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}', issue&.id.to_s) | |||||
| content.gsub!('{title}', issue&.subject) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectIssue.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectIssue.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,19 +34,22 @@ class MessageTemplate::ProjectJoined < MessageTemplate | |||||
| def self.get_email_message_content(receiver, project) | def self.get_email_message_content(receiver, project) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Project"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Project"] | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectJoined.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectJoined.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -33,19 +33,22 @@ class MessageTemplate::ProjectLeft < MessageTemplate | |||||
| def self.get_email_message_content(receiver, project) | def self.get_email_message_content(receiver, project) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Project"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Project"] | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectLeft.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectLeft.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,23 +34,25 @@ class MessageTemplate::ProjectMemberJoined < MessageTemplate | |||||
| def self.get_email_message_content(receiver, user, project) | def self.get_email_message_content(receiver, user, project) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Member"] | return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Member"] | ||||
| end | |||||
| title = email_title | |||||
| title.gsub!('{nickname1}', user&.real_name) | |||||
| title.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login1}', user&.login) | |||||
| content.gsub!('{login2}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname1}', user&.real_name) | |||||
| content.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| title = email_title | |||||
| title.gsub!('{nickname1}', user&.real_name) | |||||
| title.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login1}', user&.login) | |||||
| content.gsub!('{login2}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname1}', user&.real_name) | |||||
| content.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectMemberJoined.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectMemberJoined.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,23 +34,26 @@ class MessageTemplate::ProjectMemberLeft < MessageTemplate | |||||
| def self.get_email_message_content(receiver, user, project) | def self.get_email_message_content(receiver, user, project) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Member"] | return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::Member"] | ||||
| title = email_title | |||||
| title.gsub!('{nickname1}', user&.real_name) | |||||
| title.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login1}', user&.login) | |||||
| content.gsub!('{login2}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname1}', user&.real_name) | |||||
| content.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{nickname1}', user&.real_name) | |||||
| title.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| title.gsub!('{repository}', project&.name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login1}', user&.login) | |||||
| content.gsub!('{login2}', project&.owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{nickname1}', user&.real_name) | |||||
| content.gsub!('{nickname2}', project&.owner&.real_name) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectMemberLeft.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectMemberLeft.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -38,27 +38,29 @@ class MessageTemplate::ProjectPullRequest < MessageTemplate | |||||
| def self.get_email_message_content(receiver, is_manager, operator, pull_request) | def self.get_email_message_content(receiver, is_manager, operator, pull_request) | ||||
| if receiver.user_template_message_setting.present? && is_manager | if receiver.user_template_message_setting.present? && is_manager | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::PullRequest"] | return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::PullRequest"] | ||||
| project = pull_request&.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}', pull_request&.id.to_s) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| project = pull_request&.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}', pull_request&.id.to_s) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectPullRequest.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectPullRequest.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -34,21 +34,24 @@ class MessageTemplate::ProjectRole < MessageTemplate | |||||
| def self.get_email_message_content(receiver, project, role) | def self.get_email_message_content(receiver, project, role) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| title.gsub!('{role}', role) | |||||
| title.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{role}', role) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| title = email_title | |||||
| title.gsub!('{repository}', project&.name) | |||||
| title.gsub!('{role}', role) | |||||
| title.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{login}', project&.owner&.login) | |||||
| content.gsub!('{nickname}', project&.owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{role}', role) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectRole.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectRole.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -159,150 +159,152 @@ class MessageTemplate::ProjectSettingChanged < MessageTemplate | |||||
| end | end | ||||
| def self.get_email_message_content(receiver, operator, project, change_params) | def self.get_email_message_content(receiver, operator, project, change_params) | ||||
| return '', '', '' if change_params.blank? | |||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::SettingChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["ManageProject::SettingChanged"] | ||||
| end | |||||
| return '', '', '' if change_params.blank? | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| 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!('{login2}', owner&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| change_count = change_params.keys.size | |||||
| # 项目名称更改 | |||||
| if change_params[:name].present? | |||||
| if change_count > 1 | |||||
| content.sub!('{ifname}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifname}', '') | |||||
| end | |||||
| content.sub!('{endname}', '') | |||||
| content.gsub!('{name}', change_params[:name][1]) | |||||
| else | |||||
| content.gsub!(/({ifname})(.*)({endname})/, '') | |||||
| end | |||||
| # 项目标识更改 | |||||
| if change_params[:identifier].present? | |||||
| if change_count > 1 | |||||
| content.sub!('{ifidentifier}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifidentifier}', '') | |||||
| end | |||||
| content.sub!('{endidentifier}', '') | |||||
| content.gsub!('{identifier}', change_params[:identifier][1]) | |||||
| else | |||||
| content.gsub!(/({ifidentifier})(.*)({endidentifier})/, '') | |||||
| end | |||||
| # 项目简介更改 | |||||
| if change_params[:description].present? | |||||
| if change_params[:description][1].blank? | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| 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!('{login2}', owner&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| change_count = change_params.keys.size | |||||
| # 项目名称更改 | |||||
| if change_params[:name].present? | |||||
| if change_count > 1 | if change_count > 1 | ||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '<br/>删除了项目简介') | |||||
| content.sub!('{ifname}', '<br/>') | |||||
| else | else | ||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '删除了项目简介') | |||||
| content.sub!('{ifname}', '') | |||||
| end | end | ||||
| content.sub!('{endname}', '') | |||||
| content.gsub!('{name}', change_params[:name][1]) | |||||
| else | else | ||||
| content.gsub!(/({ifname})(.*)({endname})/, '') | |||||
| end | |||||
| # 项目标识更改 | |||||
| if change_params[:identifier].present? | |||||
| if change_count > 1 | if change_count > 1 | ||||
| content.sub!('{ifdescription}', '<br/>') | |||||
| content.sub!('{ifidentifier}', '<br/>') | |||||
| else | else | ||||
| content.sub!('{ifdescription}', '') | |||||
| content.sub!('{ifidentifier}', '') | |||||
| end | end | ||||
| content.sub!('{enddescription}', '') | |||||
| content.gsub!('{description}', change_params[:description][1]) | |||||
| content.sub!('{endidentifier}', '') | |||||
| content.gsub!('{identifier}', change_params[:identifier][1]) | |||||
| else | |||||
| content.gsub!(/({ifidentifier})(.*)({endidentifier})/, '') | |||||
| end | end | ||||
| else | |||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '') | |||||
| end | |||||
| # 项目类别更改 | |||||
| if change_params[:project_category_id].present? | |||||
| category = ProjectCategory.find_by_id(change_params[:project_category_id][1]) | |||||
| if category.present? | |||||
| if change_count > 1 | |||||
| content.sub!('{ifcategory}', '<br/>') | |||||
| # 项目简介更改 | |||||
| if change_params[:description].present? | |||||
| if change_params[:description][1].blank? | |||||
| if change_count > 1 | |||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '<br/>删除了项目简介') | |||||
| else | |||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '删除了项目简介') | |||||
| end | |||||
| else | else | ||||
| content.sub!('{ifcategory}', '') | |||||
| if change_count > 1 | |||||
| content.sub!('{ifdescription}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifdescription}', '') | |||||
| end | |||||
| content.sub!('{enddescription}', '') | |||||
| content.gsub!('{description}', change_params[:description][1]) | |||||
| end | end | ||||
| content.sub!('{endcategory}', '') | |||||
| content.gsub!('{category}', category&.name) | |||||
| else | else | ||||
| if change_count > 1 | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '<br/>删除了项目类别') | |||||
| else | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '删除了项目类别') | |||||
| content.gsub!(/({ifdescription})(.*)({enddescription})/, '') | |||||
| end | |||||
| # 项目类别更改 | |||||
| if change_params[:project_category_id].present? | |||||
| category = ProjectCategory.find_by_id(change_params[:project_category_id][1]) | |||||
| if category.present? | |||||
| if change_count > 1 | |||||
| content.sub!('{ifcategory}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifcategory}', '') | |||||
| end | |||||
| content.sub!('{endcategory}', '') | |||||
| content.gsub!('{category}', category&.name) | |||||
| else | |||||
| if change_count > 1 | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '<br/>删除了项目类别') | |||||
| else | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '删除了项目类别') | |||||
| end | |||||
| end | end | ||||
| else | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '') | |||||
| end | end | ||||
| else | |||||
| content.gsub!(/({ifcategory})(.*)({endcategory})/, '') | |||||
| end | |||||
| # 项目语言更改 | |||||
| if change_params[:project_language_id].present? | |||||
| language = ProjectLanguage.find_by_id(change_params[:project_language_id][1]) | |||||
| if language.present? | |||||
| if change_count > 1 | |||||
| content.sub!('{iflanguage}', '<br/>') | |||||
| # 项目语言更改 | |||||
| if change_params[:project_language_id].present? | |||||
| language = ProjectLanguage.find_by_id(change_params[:project_language_id][1]) | |||||
| if language.present? | |||||
| if change_count > 1 | |||||
| content.sub!('{iflanguage}', '<br/>') | |||||
| else | |||||
| content.sub!('{iflanguage}', '') | |||||
| end | |||||
| content.sub!('{endlanguage}', '') | |||||
| content.gsub!('{language}', language&.name) | |||||
| else | else | ||||
| content.sub!('{iflanguage}', '') | |||||
| if change_count > 1 | |||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '<br/>删除了项目语言') | |||||
| else | |||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '删除了项目语言') | |||||
| end | |||||
| end | end | ||||
| content.sub!('{endlanguage}', '') | |||||
| content.gsub!('{language}', language&.name) | |||||
| else | else | ||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '') | |||||
| end | |||||
| # 项目公私有更改 | |||||
| if change_params[:is_public].present? | |||||
| permission = change_params[:is_public][1] ? '公有' : '私有' | |||||
| if change_count > 1 | if change_count > 1 | ||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '<br/>删除了项目语言') | |||||
| content.sub!('{ifpermission}', '<br/>') | |||||
| else | else | ||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '删除了项目语言') | |||||
| content.sub!('{ifpermission}', '') | |||||
| end | end | ||||
| end | |||||
| else | |||||
| content.gsub!(/({iflanguage})(.*)({endlanguage})/, '') | |||||
| end | |||||
| # 项目公私有更改 | |||||
| if change_params[:is_public].present? | |||||
| permission = change_params[:is_public][1] ? '公有' : '私有' | |||||
| if change_count > 1 | |||||
| content.sub!('{ifpermission}', '<br/>') | |||||
| content.sub!('{endpermission}', '') | |||||
| content.gsub!('{permission}', permission) | |||||
| else | else | ||||
| content.sub!('{ifpermission}', '') | |||||
| content.gsub!(/({ifpermission})(.*)({endpermission})/, '') | |||||
| end | end | ||||
| content.sub!('{endpermission}', '') | |||||
| content.gsub!('{permission}', permission) | |||||
| else | |||||
| content.gsub!(/({ifpermission})(.*)({endpermission})/, '') | |||||
| end | |||||
| # 项目导航更改 | |||||
| if change_params[:navbar].present? | |||||
| unit_types = project.project_units.order(unit_type: :asc).pluck(:unit_type) | |||||
| unit_types.delete('code') | |||||
| unit_types.unshift('代码库') | |||||
| unit_types.unshift('主页') | |||||
| unit_types.append('动态') | |||||
| navbar = unit_types.join(',') | |||||
| navbar.gsub!('issues', '易修') | |||||
| navbar.gsub!('pulls', '合并请求') | |||||
| navbar.gsub!('wiki', 'Wiki') | |||||
| navbar.gsub!('devops', '工作流') | |||||
| navbar.gsub!('versions', '里程碑') | |||||
| navbar.gsub!('resources', '资源库') | |||||
| if change_count > 1 | |||||
| content.sub!('{ifnavbar}', '<br/>') | |||||
| # 项目导航更改 | |||||
| if change_params[:navbar].present? | |||||
| unit_types = project.project_units.order(unit_type: :asc).pluck(:unit_type) | |||||
| unit_types.delete('code') | |||||
| unit_types.unshift('代码库') | |||||
| unit_types.unshift('主页') | |||||
| unit_types.append('动态') | |||||
| navbar = unit_types.join(',') | |||||
| navbar.gsub!('issues', '易修') | |||||
| navbar.gsub!('pulls', '合并请求') | |||||
| navbar.gsub!('wiki', 'Wiki') | |||||
| navbar.gsub!('devops', '工作流') | |||||
| navbar.gsub!('versions', '里程碑') | |||||
| navbar.gsub!('resources', '资源库') | |||||
| if change_count > 1 | |||||
| content.sub!('{ifnavbar}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifnavbar}', '') | |||||
| end | |||||
| content.sub!('{endnavbar}', '') | |||||
| content.gsub!('{navbar}', navbar) | |||||
| else | else | ||||
| content.sub!('{ifnavbar}', '') | |||||
| content.gsub!(/({ifnavbar})(.*)({endnavbar})/, '') | |||||
| end | end | ||||
| content.sub!('{endnavbar}', '') | |||||
| content.gsub!('{navbar}', navbar) | |||||
| return receiver&.mail, title, content | |||||
| else | else | ||||
| content.gsub!(/({ifnavbar})(.*)({endnavbar})/, '') | |||||
| return '', '', '' | |||||
| end | end | ||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::ProjectSettingChanged.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::ProjectSettingChanged.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -36,26 +36,28 @@ class MessageTemplate::PullRequestAssigned < MessageTemplate | |||||
| def self.get_email_message_content(receiver, operator, pull_request) | def self.get_email_message_content(receiver, operator, pull_request) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::PullRequestAssigned"] | return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::PullRequestAssigned"] | ||||
| end | |||||
| project = pull_request&.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!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| project = pull_request&.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!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| return receiver&.mail, title, content | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::PullRequestAssigned.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::PullRequestAssigned.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -103,89 +103,92 @@ class MessageTemplate::PullRequestChanged < MessageTemplate | |||||
| return '', '', '' if change_params.blank? | return '', '', '' if change_params.blank? | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | ||||
| end | |||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| change_count = change_params.keys.size | |||||
| # 合并请求审查成员修改 | |||||
| if change_params[:assigned_to_id].present? | |||||
| assigner1 = User.find_by_id(change_params[:assigned_to_id][0]) | |||||
| assigner2 = User.find_by_id(change_params[:assigned_to_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifassigner}', '<br/>') | |||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| change_count = change_params.keys.size | |||||
| # 合并请求审查成员修改 | |||||
| if change_params[:assigned_to_id].present? | |||||
| assigner1 = User.find_by_id(change_params[:assigned_to_id][0]) | |||||
| assigner2 = User.find_by_id(change_params[:assigned_to_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifassigner}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifassigner}', '') | |||||
| end | |||||
| content.sub!('{endassigner}', '') | |||||
| content.gsub!('{assigner1}', assigner1.present? ? assigner1&.real_name : '未指派成员') | |||||
| content.gsub!('{assigner2}', assigner2.present? ? assigner2&.real_name : '未指派成员') | |||||
| else | else | ||||
| content.sub!('{ifassigner}', '') | |||||
| content.gsub!(/({ifassigner})(.*)({endassigner})/, '') | |||||
| end | end | ||||
| content.sub!('{endassigner}', '') | |||||
| content.gsub!('{assigner1}', assigner1.present? ? assigner1&.real_name : '未指派成员') | |||||
| content.gsub!('{assigner2}', assigner2.present? ? assigner2&.real_name : '未指派成员') | |||||
| else | |||||
| content.gsub!(/({ifassigner})(.*)({endassigner})/, '') | |||||
| end | |||||
| # 合并请求里程碑修改 | |||||
| if change_params[:fixed_version_id].present? | |||||
| fix_version1 = Version.find_by_id(change_params[:fixed_version_id][0]) | |||||
| fix_version2 = Version.find_by_id(change_params[:fixed_version_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifmilestone}', '<br/>') | |||||
| # 合并请求里程碑修改 | |||||
| if change_params[:fixed_version_id].present? | |||||
| fix_version1 = Version.find_by_id(change_params[:fixed_version_id][0]) | |||||
| fix_version2 = Version.find_by_id(change_params[:fixed_version_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifmilestone}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifmilestone}', '') | |||||
| end | |||||
| content.sub!('{endmilestone}', '') | |||||
| content.gsub!('{milestone1}', fix_version1.present? ? fix_version1&.name : '未选择里程碑') | |||||
| content.gsub!('{milestone2}', fix_version2.present? ? fix_version2&.name : '未选择里程碑') | |||||
| else | else | ||||
| content.sub!('{ifmilestone}', '') | |||||
| content.gsub!(/({ifmilestone})(.*)({endmilestone})/, '') | |||||
| end | end | ||||
| content.sub!('{endmilestone}', '') | |||||
| content.gsub!('{milestone1}', fix_version1.present? ? fix_version1&.name : '未选择里程碑') | |||||
| content.gsub!('{milestone2}', fix_version2.present? ? fix_version2&.name : '未选择里程碑') | |||||
| else | |||||
| content.gsub!(/({ifmilestone})(.*)({endmilestone})/, '') | |||||
| end | |||||
| # 合并请求标记修改 | |||||
| if change_params[:issue_tags_value].present? | |||||
| issue_tags1 = IssueTag.where(id: change_params[:issue_tags_value][0]).distinct | |||||
| issue_tags2 = IssueTag.where(id: change_params[:issue_tags_value][1]).distinct | |||||
| tag1 = issue_tags1.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags1.pluck(:name).join(",") | |||||
| tag2 = issue_tags2.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags2.pluck(:name).join(",") | |||||
| if change_count > 1 | |||||
| content.sub!('{iftag}', '<br/>') | |||||
| # 合并请求标记修改 | |||||
| if change_params[:issue_tags_value].present? | |||||
| issue_tags1 = IssueTag.where(id: change_params[:issue_tags_value][0]).distinct | |||||
| issue_tags2 = IssueTag.where(id: change_params[:issue_tags_value][1]).distinct | |||||
| tag1 = issue_tags1.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags1.pluck(:name).join(",") | |||||
| tag2 = issue_tags2.pluck(:name).join(",").blank? ? '未选择标记' : issue_tags2.pluck(:name).join(",") | |||||
| if change_count > 1 | |||||
| content.sub!('{iftag}', '<br/>') | |||||
| else | |||||
| content.sub!('{iftag}', '') | |||||
| end | |||||
| content.sub!('{endtag}', '') | |||||
| content.gsub!('{tag1}', tag1) | |||||
| content.gsub!('{tag2}', tag2) | |||||
| else | else | ||||
| content.sub!('{iftag}', '') | |||||
| content.gsub!(/({iftag})(.*)({endtag})()/, '') | |||||
| end | end | ||||
| content.sub!('{endtag}', '') | |||||
| content.gsub!('{tag1}', tag1) | |||||
| content.gsub!('{tag2}', tag2) | |||||
| else | |||||
| content.gsub!(/({iftag})(.*)({endtag})()/, '') | |||||
| end | |||||
| # 合并请求优先级修改 | |||||
| if change_params[:priority_id].present? | |||||
| priority1 = IssuePriority.find_by_id(change_params[:priority_id][0]) | |||||
| priority2 = IssuePriority.find_by_id(change_params[:priority_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifpriority}', '<br/>') | |||||
| # 合并请求优先级修改 | |||||
| if change_params[:priority_id].present? | |||||
| priority1 = IssuePriority.find_by_id(change_params[:priority_id][0]) | |||||
| priority2 = IssuePriority.find_by_id(change_params[:priority_id][1]) | |||||
| if change_count > 1 | |||||
| content.sub!('{ifpriority}', '<br/>') | |||||
| else | |||||
| content.sub!('{ifpriority}', '') | |||||
| end | |||||
| content.sub!('{ifpriority}', '') | |||||
| content.sub!('{endpriority}', '') | |||||
| content.gsub!('{priority1}', priority1&.name) | |||||
| content.gsub!('{priority2}', priority2&.name) | |||||
| else | else | ||||
| content.sub!('{ifpriority}', '') | |||||
| content.gsub!(/({ifpriority})(.*)({endpriority})/, '') | |||||
| end | end | ||||
| content.sub!('{ifpriority}', '') | |||||
| content.sub!('{endpriority}', '') | |||||
| content.gsub!('{priority1}', priority1&.name) | |||||
| content.gsub!('{priority2}', priority2&.name) | |||||
| return receiver&.mail, title, content | |||||
| else | else | ||||
| content.gsub!(/({ifpriority})(.*)({endpriority})/, '') | |||||
| return '', '', '' | |||||
| end | end | ||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::PullRequestChanged.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::PullRequestChanged.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -36,24 +36,27 @@ class MessageTemplate::PullRequestClosed < MessageTemplate | |||||
| def self.get_email_message_content(receiver, operator, pull_request) | def self.get_email_message_content(receiver, operator, pull_request) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | ||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::PullRequestClosed.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::PullRequestClosed.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -36,24 +36,26 @@ class MessageTemplate::PullRequestMerged < MessageTemplate | |||||
| def self.get_email_message_content(receiver, operator, pull_request) | def self.get_email_message_content(receiver, operator, pull_request) | ||||
| if receiver.user_template_message_setting.present? | if receiver.user_template_message_setting.present? | ||||
| return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | return '', '', '' unless receiver.user_template_message_setting.email_body["CreateOrAssign::PullRequestChanged"] | ||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| return receiver&.mail, title, content | |||||
| else | |||||
| return '', '', '' | |||||
| end | end | ||||
| project = pull_request&.project | |||||
| owner = project&.owner | |||||
| title = email_title | |||||
| title.gsub!('{title}', pull_request&.title) | |||||
| content = email | |||||
| content.gsub!('{receiver}', receiver&.real_name) | |||||
| content.gsub!('{nickname1}', operator&.real_name) | |||||
| content.gsub!('{login1}', operator&.login) | |||||
| content.gsub!('{nickname2}', owner&.real_name) | |||||
| content.gsub!('{login2}', owner&.login) | |||||
| content.gsub!('{identifier}', project&.identifier) | |||||
| content.gsub!('{repository}', project&.name) | |||||
| content.gsub!('{baseurl}', base_url) | |||||
| content.gsub!('{title}', pull_request&.title) | |||||
| content.gsub!('{id}', pull_request&.id.to_s) | |||||
| return receiver&.mail, title, content | |||||
| rescue => e | rescue => e | ||||
| Rails.logger.info("MessageTemplate::PullRequestMerged.get_email_message_content [ERROR] #{e}") | Rails.logger.info("MessageTemplate::PullRequestMerged.get_email_message_content [ERROR] #{e}") | ||||
| return '', '', '' | return '', '', '' | ||||
| @@ -130,7 +130,7 @@ class Project < ApplicationRecord | |||||
| after_create :incre_user_statistic, :incre_platform_statistic | after_create :incre_user_statistic, :incre_platform_statistic | ||||
| after_save :check_project_members, :reset_cache_data | after_save :check_project_members, :reset_cache_data | ||||
| before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned | before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned | ||||
| before_destroy :decre_project_common | |||||
| before_destroy :decre_project_common, :decre_forked_from_project_count | |||||
| after_destroy :decre_user_statistic, :decre_platform_statistic | after_destroy :decre_user_statistic, :decre_platform_statistic | ||||
| scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :description, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)} | scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :description, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)} | ||||
| scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} | scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} | ||||
| @@ -172,6 +172,14 @@ class Project < ApplicationRecord | |||||
| CacheAsyncClearJob.perform_later('project_common_service', self.id) | CacheAsyncClearJob.perform_later('project_common_service', self.id) | ||||
| end | end | ||||
| def decre_forked_from_project_count | |||||
| forked_project = self.forked_from_project | |||||
| if forked_project.present? | |||||
| forked_project.decrement(:forked_count, 1) | |||||
| forked_project.save | |||||
| end | |||||
| end | |||||
| def incre_user_statistic | def incre_user_statistic | ||||
| CacheAsyncSetJob.perform_later("user_statistic_service", {project_count: 1, project_language_count_key: self.project_language&.name, project_language_count: 1}, self.user_id) | CacheAsyncSetJob.perform_later("user_statistic_service", {project_count: 1, project_language_count_key: self.project_language&.name, project_language_count: 1}, self.user_id) | ||||
| end | end | ||||
| @@ -44,17 +44,17 @@ class UserTemplateMessageSetting < ApplicationRecord | |||||
| def self.init_email_body | def self.init_email_body | ||||
| { | { | ||||
| "Normal::Permission": true, | |||||
| "Normal::Project": true, | |||||
| "Normal::Organization": true, | |||||
| "Normal::IssueAssigned": true, | |||||
| "Normal::PullRequestAssigned": true, | |||||
| "CreateOrAssign::IssueChanged": true, | |||||
| "CreateOrAssign::PullRequestChanged": true, | |||||
| "ManageProject::Issue": true, | |||||
| "ManageProject::PullRequest": true, | |||||
| "ManageProject::Member": true, | |||||
| "ManageProject::SettingChanged": true, | |||||
| "Normal::Permission": false, | |||||
| "Normal::Project": false, | |||||
| "Normal::Organization": false, | |||||
| "Normal::IssueAssigned": false, | |||||
| "Normal::PullRequestAssigned": false, | |||||
| "CreateOrAssign::IssueChanged": false, | |||||
| "CreateOrAssign::PullRequestChanged": false, | |||||
| "ManageProject::Issue": false, | |||||
| "ManageProject::PullRequest": false, | |||||
| "ManageProject::Member": false, | |||||
| "ManageProject::SettingChanged": false, | |||||
| }.stringify_keys! | }.stringify_keys! | ||||
| end | end | ||||
| @@ -196,6 +196,7 @@ class Cache::V2::ProjectCommonService < ApplicationService | |||||
| def reset_project_common | def reset_project_common | ||||
| load_project | load_project | ||||
| return unless @project.present? | |||||
| return unless @project.is_full_public | return unless @project.is_full_public | ||||
| $redis_cache.del(project_common_key) | $redis_cache.del(project_common_key) | ||||
| reset_project_owner_id | reset_project_owner_id | ||||
| @@ -144,6 +144,8 @@ class Gitea::ClientService < ApplicationService | |||||
| {status: 403, message: '你没有权限操作!'} | {status: 403, message: '你没有权限操作!'} | ||||
| when 404 | when 404 | ||||
| {status: 404, message: '你访问的链接不存在!'} | {status: 404, message: '你访问的链接不存在!'} | ||||
| when 500 | |||||
| {status: 500, message: ''} | |||||
| else | else | ||||
| if response&.body.blank? | if response&.body.blank? | ||||
| message = "请求失败" | message = "请求失败" | ||||
| @@ -94,7 +94,7 @@ class PullRequests::CreateService < ApplicationService | |||||
| user: @current_user, | user: @current_user, | ||||
| issue: pull_issue, | issue: pull_issue, | ||||
| fork_project_id: @params[:fork_project_id], | fork_project_id: @params[:fork_project_id], | ||||
| is_original: @params[:is_original], | |||||
| is_original: is_original, | |||||
| files_count: @params[:files_count] || 0, | files_count: @params[:files_count] || 0, | ||||
| commits_count: @params[:commits_count] || 0 | commits_count: @params[:commits_count] || 0 | ||||
| }) | }) | ||||
| @@ -145,7 +145,13 @@ class PullRequests::CreateService < ApplicationService | |||||
| raise "title参数不能为空" if @params[:title].blank? | raise "title参数不能为空" if @params[:title].blank? | ||||
| raise "head参数不能为空" if @params[:head].blank? | raise "head参数不能为空" if @params[:head].blank? | ||||
| raise "base参数不能为空" if @params[:base].blank? | raise "base参数不能为空" if @params[:base].blank? | ||||
| raise "分支内容相同,无需创建合并请求" if @params[:head] === @params[:base] && !is_original | |||||
| raise "合并请求已存在" if @project&.pull_requests.where(head: @params[:head], base: @params[:base], status: 0, is_original: is_original, fork_project_id: @params[:fork_project_id]).present? | |||||
| raise @pull_issue.errors.full_messages.join(", ") unless pull_issue.valid? | raise @pull_issue.errors.full_messages.join(", ") unless pull_issue.valid? | ||||
| raise @pull_request.errors.full_messages.join(", ") unless pull_request.valid? | raise @pull_request.errors.full_messages.join(", ") unless pull_request.valid? | ||||
| end | end | ||||
| def is_original | |||||
| @params[:is_original] || false | |||||
| end | |||||
| end | end | ||||
| @@ -1,13 +1,17 @@ | |||||
| project = object.project | project = object.project | ||||
| json.project do | |||||
| json.id project.id | |||||
| json.identifier project.identifier | |||||
| json.name project.name | |||||
| json.description project.description | |||||
| json.is_public project.is_public | |||||
| json.owner do | |||||
| json.partial! "/users/user_simple", locals: {user: project.owner} | |||||
| if project.present? | |||||
| json.project do | |||||
| json.id project.id | |||||
| json.identifier project.identifier | |||||
| json.name project.name | |||||
| json.description project.description | |||||
| json.is_public project.is_public | |||||
| json.owner do | |||||
| json.partial! "/users/user_simple", locals: {user: project.owner} | |||||
| end | |||||
| end | end | ||||
| else | |||||
| json.project nil | |||||
| end | end | ||||
| json.user do | json.user do | ||||
| json.partial! "/users/user_simple", locals: {user: object.user} | json.partial! "/users/user_simple", locals: {user: object.user} | ||||
| @@ -14,6 +14,7 @@ json.issues do | |||||
| json.array! @issues.to_a do |issue| | json.array! @issues.to_a do |issue| | ||||
| pr = issue.pull_request | pr = issue.pull_request | ||||
| json.pull_request_id pr.id | json.pull_request_id pr.id | ||||
| json.pull_request_number pr.gitea_number | |||||
| json.pull_request_status pr.status | json.pull_request_status pr.status | ||||
| json.pull_request_head pr.head | json.pull_request_head pr.head | ||||
| json.pull_request_base pr.base | json.pull_request_base pr.base | ||||
| @@ -16,7 +16,7 @@ zh-CN: | |||||
| 'agreed': '已同意' | 'agreed': '已同意' | ||||
| trend: | trend: | ||||
| Issue: 易修(Issue) | Issue: 易修(Issue) | ||||
| PullRequest: 合并请求 | |||||
| PullRequest: 合并请求(PR) | |||||
| VersionRelease: 版本发布 | VersionRelease: 版本发布 | ||||
| create: 创建了 | create: 创建了 | ||||
| journal: 回复了 | journal: 回复了 | ||||
| @@ -12,12 +12,27 @@ | |||||
| body { | body { | ||||
| font-family: "微软雅黑","宋体"; | font-family: "微软雅黑","宋体"; | ||||
| background: #fff; | background: #fff; | ||||
| margin: 0px; | |||||
| padding: 0px; | |||||
| } | } | ||||
| h1 { | h1 { | ||||
| font-size: 1.5em; | font-size: 1.5em; | ||||
| } | } | ||||
| p { | |||||
| font-size: 0.8em; | |||||
| img{ | |||||
| vertical-align: middle; | |||||
| border-style: none; | |||||
| } | |||||
| a{ | |||||
| text-decoration: none; | |||||
| } | |||||
| .font-16{ | |||||
| font-size: 16px !important; | |||||
| } | |||||
| .mt56{ | |||||
| margin-top: 56px; | |||||
| } | |||||
| .color-blue{ | |||||
| color:#466AFF !important; | |||||
| } | } | ||||
| .h_content{ | .h_content{ | ||||
| text-align: center; | text-align: center; | ||||
| @@ -33,6 +48,32 @@ | |||||
| align-items: center; | align-items: center; | ||||
| display: -webkit-flex; | display: -webkit-flex; | ||||
| } | } | ||||
| .edu-txt-center { | |||||
| text-align: center !important; | |||||
| } | |||||
| .newTable{ | |||||
| background-color: #F0F5FF; | |||||
| position: relative; | |||||
| height: 100vh; | |||||
| text-align: center; | |||||
| } | |||||
| .newMargin{ | |||||
| position: absolute; | |||||
| left: 0; | |||||
| bottom: 0; | |||||
| width: 100%; | |||||
| } | |||||
| .mainImg { | |||||
| position: absolute; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| z-index: 10; | |||||
| } | |||||
| </style> | </style> | ||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||
| $(function(){ | $(function(){ | ||||
| @@ -49,14 +90,21 @@ | |||||
| <p>An error occurred on the page you were trying to access.<br /> | <p>An error occurred on the page you were trying to access.<br /> | ||||
| If you continue to experience problems please contact your Trustie administrator for assistance.</p> | If you continue to experience problems please contact your Trustie administrator for assistance.</p> | ||||
| <p>If you are the Trustie administrator, check your log files for details about the error.</p> --> | <p>If you are the Trustie administrator, check your log files for details about the error.</p> --> | ||||
| <div class="verticalCenter"> | |||||
| <div class="edu-txt-center"> | |||||
| <img src="/images/warn/pic_500.jpg" > | |||||
| <p class="font-18 mt40">您可以稍后尝试 | |||||
| 您可以稍后尝试 <a href="javascript:history.back()" class="color-blue">返回上页</a>,或者 | |||||
| <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=2f2043d88c1bd61d182b98bf1e061c6185e23055bec832c07d8148fe11c5a6cd" class="color-blue">QQ反馈>></a> | |||||
| </p> | |||||
| </div> | |||||
| <div class="newTable clearfix"> | |||||
| <div class="mainImg"> | |||||
| <img src="images/warn/pic_500.jpg" width="639px"/> | |||||
| <div class="font-16 mt56" style="text-align: center;"> | |||||
| <p>服务器异常,请稍后重试</p> | |||||
| 您可尝试<a href="javascript:location.reload();" class="color-blue">刷新页面</a>或<a href="/explore" | |||||
| class="color-blue">返回首页</a>,也可以通过 | |||||
| <a target="_blank" | |||||
| href="https://qm.qq.com/cgi-bin/qm/qr?k=YVGUhY7uK8ovpyd7tG_lHe2qGZ63LOij&jump_from=webapi" | |||||
| class="color-blue">QQ</a>向我们反馈 | |||||
| </div> | |||||
| </div> | |||||
| <div class="newMargin"> | |||||
| <img src="images/warn/pic_bg.png" width="100%" height="292px"/> | |||||
| </div> | |||||
| </div> | </div> | ||||
| </body> | </body> | ||||
| </html> | </html> | ||||