mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-02 19:30:48 +08:00
Merge branch 'standalone_develop' into pm_project_develop
This commit is contained in:
@@ -1,46 +1,46 @@
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: attachments
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# container_id :integer
|
||||
# container_type :string(30)
|
||||
# filename :string(255) default(""), not null
|
||||
# disk_filename :string(255) default(""), not null
|
||||
# filesize :integer default("0"), not null
|
||||
# content_type :string(255) default("")
|
||||
# digest :string(60) default(""), not null
|
||||
# downloads :integer default("0"), not null
|
||||
# author_id :integer default("0"), not null
|
||||
# created_on :datetime
|
||||
# description :text(65535)
|
||||
# disk_directory :string(255)
|
||||
# attachtype :integer default("1")
|
||||
# is_public :integer default("1")
|
||||
# copy_from :integer
|
||||
# quotes :integer default("0")
|
||||
# is_publish :integer default("1")
|
||||
# publish_time :datetime
|
||||
# resource_bank_id :integer
|
||||
# unified_setting :boolean default("1")
|
||||
# cloud_url :string(255) default("")
|
||||
# course_second_category_id :integer default("0")
|
||||
# delay_publish :boolean default("0")
|
||||
# memo_image :boolean default("0")
|
||||
# extra_type :integer default("0")
|
||||
# uuid :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_attachments_on_author_id (author_id)
|
||||
# index_attachments_on_container_id_and_container_type (container_id,container_type)
|
||||
# index_attachments_on_course_second_category_id (course_second_category_id)
|
||||
# index_attachments_on_created_on (created_on)
|
||||
# index_attachments_on_is_public (is_public)
|
||||
# index_attachments_on_quotes (quotes)
|
||||
# index_attachments_on_uuid (uuid)
|
||||
#
|
||||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: attachments
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# container_id :integer
|
||||
# container_type :string(30)
|
||||
# filename :string(255) default(""), not null
|
||||
# disk_filename :string(255) default(""), not null
|
||||
# filesize :integer default("0"), not null
|
||||
# content_type :string(255) default("")
|
||||
# digest :string(60) default(""), not null
|
||||
# downloads :integer default("0"), not null
|
||||
# author_id :integer default("0"), not null
|
||||
# created_on :datetime
|
||||
# description :text(65535)
|
||||
# disk_directory :string(255)
|
||||
# attachtype :integer default("1")
|
||||
# is_public :integer default("1")
|
||||
# copy_from :integer
|
||||
# quotes :integer default("0")
|
||||
# is_publish :integer default("1")
|
||||
# publish_time :datetime
|
||||
# resource_bank_id :integer
|
||||
# unified_setting :boolean default("1")
|
||||
# cloud_url :string(255) default("")
|
||||
# course_second_category_id :integer default("0")
|
||||
# delay_publish :boolean default("0")
|
||||
# memo_image :boolean default("0")
|
||||
# extra_type :integer default("0")
|
||||
# uuid :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_attachments_on_author_id (author_id)
|
||||
# index_attachments_on_container_id_and_container_type (container_id,container_type)
|
||||
# index_attachments_on_course_second_category_id (course_second_category_id)
|
||||
# index_attachments_on_created_on (created_on)
|
||||
# index_attachments_on_is_public (is_public)
|
||||
# index_attachments_on_quotes (quotes)
|
||||
# index_attachments_on_uuid (uuid)
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,68 +21,69 @@ module ProjectOperable
|
||||
end
|
||||
|
||||
def add_member!(user_id, role_name='Developer')
|
||||
if self.owner.is_a?(Organization)
|
||||
case role_name
|
||||
when 'Manager'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.admin.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 新增对应的团队成员
|
||||
team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
|
||||
# 确保组织成员中有该用户
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
when 'Developer'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.write.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 新增对应的团队成员
|
||||
team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
|
||||
# 确保组织成员中有该用户
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
when 'Reporter'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.read.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 新增对应的团队成员
|
||||
team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
|
||||
# 确保组织成员中有该用户
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
end
|
||||
end
|
||||
member = members.create!(user_id: user_id, team_user_id: team_user&.id)
|
||||
# if self.owner.is_a?(Organization)
|
||||
# case role_name
|
||||
# when 'Manager'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.admin.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
#
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 新增对应的团队成员
|
||||
# team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
#
|
||||
# # 确保组织成员中有该用户
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# when 'Developer'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.write.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
#
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 新增对应的团队成员
|
||||
# team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
#
|
||||
# # 确保组织成员中有该用户
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# when 'Reporter'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.read.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
#
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 新增对应的团队成员
|
||||
# team_user = TeamUser.build(self.user_id, user_id, team.id)
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
#
|
||||
# # 确保组织成员中有该用户
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# end
|
||||
# end
|
||||
# member = members.create!(user_id: user_id, team_user_id: team_user&.id)
|
||||
member = members.create!(user_id: user_id)
|
||||
set_developer_role(member, role_name)
|
||||
end
|
||||
|
||||
@@ -116,71 +117,71 @@ module ProjectOperable
|
||||
def change_member_role!(user_id, role)
|
||||
member = self.member(user_id)
|
||||
# 所有者为组织,并且该用户属于组织成员
|
||||
if self.owner.is_a?(Organization) && member.team_user.present?
|
||||
case role&.name
|
||||
when 'Manager'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.admin.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 更改对应的团队成员
|
||||
team_user = member.team_user
|
||||
$gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
|
||||
# 确保组织成员中有该用户
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
when 'Developer'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.write.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
$gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 更改对应的团队成员
|
||||
team_user = member.team_user
|
||||
$gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
when 'Reporter'
|
||||
# 构建相应的团队
|
||||
team = self.owner.teams.read.take
|
||||
if team.nil?
|
||||
team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
|
||||
gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
end
|
||||
|
||||
# 设置项目在团队中的访问权限
|
||||
team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
|
||||
# 更改对应的团队成员
|
||||
team_user = member.team_user
|
||||
$gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
$gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
|
||||
# 确保组织成员中有该用户
|
||||
OrganizationUser.build(self.user_id, user_id)
|
||||
end
|
||||
end
|
||||
# if self.owner.is_a?(Organization) && member.team_user.present?
|
||||
# case role&.name
|
||||
# when 'Manager'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.admin.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'admin', '管理员', '', 'admin', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
#
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 更改对应的团队成员
|
||||
# team_user = member.team_user
|
||||
# $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
# team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
#
|
||||
# # 确保组织成员中有该用户
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# when 'Developer'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.write.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'developer', '开发者', '', 'write', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 更改对应的团队成员
|
||||
# team_user = member.team_user
|
||||
# $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
# team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
#
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# when 'Reporter'
|
||||
# # 构建相应的团队
|
||||
# team = self.owner.teams.read.take
|
||||
# if team.nil?
|
||||
# team = Team.build(self.user_id, 'reporter', '报告者', '', 'read', false, false)
|
||||
# gteam = $gitea_client.post_orgs_teams_by_org(self.owner.login, {body: team.to_gitea_hash.to_json}) rescue nil
|
||||
# team.update_attributes!({gtid: gteam["id"]}) unless gteam.nil?
|
||||
# end
|
||||
#
|
||||
# # 设置项目在团队中的访问权限
|
||||
# team_project = TeamProject.build(self.user_id, team.id, self.id)
|
||||
# tp_result = $gitea_client.put_teams_repos_by_id_org_repo(team.gtid, self.owner.login, self.identifier) rescue nil
|
||||
#
|
||||
# # 更改对应的团队成员
|
||||
# team_user = member.team_user
|
||||
# $gitea_client.delete_teams_members_by_id_username(team_user.team.gtid, team_user.user&.login) rescue nil # 移除旧的
|
||||
# $gitea_client.put_teams_members_by_id_username(team&.gtid, team_user.user&.login) rescue nil # 新增新的
|
||||
# team_user.update_attributes!({team_id: team.id}) unless team.team_users.exists?(user_id: member.user_id)
|
||||
#
|
||||
# # 确保组织成员中有该用户
|
||||
# OrganizationUser.build(self.user_id, user_id)
|
||||
# end
|
||||
# end
|
||||
member.member_roles.last.update_attributes!(role: role)
|
||||
end
|
||||
|
||||
|
||||
24
app/models/daily_platform_statistic.rb
Normal file
24
app/models/daily_platform_statistic.rb
Normal file
@@ -0,0 +1,24 @@
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: daily_platform_statistics
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# date :date
|
||||
# pv :integer default("0")
|
||||
# visitor :integer default("0")
|
||||
# ip :integer default("0")
|
||||
# weekly_keep_rate :float(24) default("0")
|
||||
# source_through :float(24) default("0")
|
||||
# source_link :float(24) default("0")
|
||||
# source_search :float(24) default("0")
|
||||
# source_custom :float(24) default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_daily_platform_statistics_on_date (date) UNIQUE
|
||||
#
|
||||
|
||||
class DailyPlatformStatistic < ApplicationRecord
|
||||
end
|
||||
30
app/models/daily_project_statistic.rb
Normal file
30
app/models/daily_project_statistic.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: daily_project_statistics
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# project_id :integer
|
||||
# date :date
|
||||
# score :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# watchers :integer default("0")
|
||||
# praises :integer default("0")
|
||||
# forks :integer default("0")
|
||||
# issues :integer default("0")
|
||||
# pullrequests :integer default("0")
|
||||
# commits :integer default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# closed_issues :integer default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_daily_project_statistics_on_date (date)
|
||||
# index_daily_project_statistics_on_project_id (project_id)
|
||||
#
|
||||
|
||||
class DailyProjectStatistic < ApplicationRecord
|
||||
|
||||
|
||||
belongs_to :project
|
||||
end
|
||||
@@ -105,7 +105,7 @@ class Issue < ApplicationRecord
|
||||
scope :opened, ->{where.not(status_id: 5)}
|
||||
after_create :incre_project_common, :incre_user_statistic, :incre_platform_statistic
|
||||
before_save :check_pm_and_update_due_date
|
||||
after_save :change_versions_count, :send_update_message_to_notice_system, :associate_attachment_container, :generate_uuid
|
||||
after_save :incre_or_decre_closed_issues_count, :change_versions_count, :send_update_message_to_notice_system, :associate_attachment_container, :generate_uuid
|
||||
after_destroy :update_closed_issues_count_in_project!, :decre_project_common, :decre_user_statistic, :decre_platform_statistic
|
||||
|
||||
def check_pm_and_update_due_date
|
||||
@@ -126,20 +126,35 @@ class Issue < ApplicationRecord
|
||||
end
|
||||
end
|
||||
|
||||
def is_issuely_issue?
|
||||
self.issue_classify.nil? || self.issue_classify == 'issue'
|
||||
end
|
||||
|
||||
def incre_or_decre_closed_issues_count
|
||||
if previous_changes[:status_id].present? && is_issuely_issue?
|
||||
if previous_changes[:status_id][1] == 5
|
||||
CacheAsyncSetJob.perform_later("project_common_service", {closed_issues: 1}, self.project_id)
|
||||
end
|
||||
if previous_changes[:status_id][0] == 5
|
||||
CacheAsyncSetJob.perform_later("project_common_service", {closed_issues: -1}, self.project_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def incre_project_common
|
||||
CacheAsyncSetJob.perform_later('project_common_service', {issues: 1}, self.project_id)
|
||||
CacheAsyncSetJob.perform_later('project_common_service', {issues: 1}, self.project_id) if is_issuely_issue?
|
||||
end
|
||||
|
||||
def decre_project_common
|
||||
CacheAsyncSetJob.perform_later('project_common_service', {issues: -1}, self.project_id)
|
||||
CacheAsyncSetJob.perform_later('project_common_service', {issues: -1}, self.project_id) if is_issuely_issue?
|
||||
end
|
||||
|
||||
def incre_user_statistic
|
||||
CacheAsyncSetJob.perform_later('user_statistic_service', {issue_count: 1}, self.author_id)
|
||||
CacheAsyncSetJob.perform_later('user_statistic_service', {issue_count: 1}, self.author_id) if is_issuely_issue?
|
||||
end
|
||||
|
||||
def decre_user_statistic
|
||||
CacheAsyncSetJob.perform_later('user_statistic_service', {issue_count: -1}, self.author_id)
|
||||
CacheAsyncSetJob.perform_later('user_statistic_service', {issue_count: -1}, self.author_id) if is_issuely_issue?
|
||||
end
|
||||
|
||||
def refresh_root_issue_count
|
||||
@@ -150,11 +165,12 @@ class Issue < ApplicationRecord
|
||||
end
|
||||
|
||||
def incre_platform_statistic
|
||||
CacheAsyncSetJob.perform_later('platform_statistic_service', {issue_count: 1})
|
||||
CacheAsyncSetJob.perform_later('platform_statistic_service', {issue_count: 1}) if is_issuely_issue?
|
||||
end
|
||||
|
||||
def decre_platform_statistic
|
||||
CacheAsyncSetJob.perform_later('platform_statistic_service', {issue_count: -1})
|
||||
CacheAsyncSetJob.perform_later('platform_statistic_service', {issue_count: -1}) if is_issuely_issue?
|
||||
end
|
||||
end
|
||||
|
||||
def get_assign_user
|
||||
|
||||
@@ -52,6 +52,8 @@ class MessageTemplate < ApplicationRecord
|
||||
self.create(type: 'MessageTemplate::ProjectMilestone', sys_notice: '{nickname1}在 <b>{nickname2}/{repository}</b> 创建了一个里程碑:<b>{name}</b>', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: "#{PLATFORM}: {nickname1} 在 {nickname2}/{repository} 新建了一个里程碑")
|
||||
email_html = File.read("#{email_template_html_dir}/project_milestone_completed.html")
|
||||
self.create(type: 'MessageTemplate::ProjectMilestoneCompleted', sys_notice: '在 <b>{nickname}/{repository}</b> 仓库,里程碑 <b>{name}</b> 的完成度已达到100%', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}', email: email_html, email_title: "#{PLATFORM}: 仓库 {nickname}/{repository} 有里程碑已完成")
|
||||
self.create(type: 'MessageTemplate::ProjectMilestoneEarlyExpired', sys_notice: '您创建的里程碑 <b>{name}</b> 已临近截止日期,请尽快处理.', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}')
|
||||
self.create(type: 'MessageTemplate::ProjectMilestoneExpired', sys_notice: '您创建的里程碑 <b>{name}</b> 已逾期,请及时更新进度或联系项目团队.', notification_url: '{baseurl}/{owner}/{identifier}/milestones/{id}')
|
||||
self.create(type: 'MessageTemplate::ProjectPraised', sys_notice: '<b>{nickname1}</b> 点赞了你管理的仓库 <b>{nickname2}/{repository}</b>', notification_url: '{baseurl}/{login}')
|
||||
self.create(type: 'MessageTemplate::ProjectOpenDevOps', sys_notice: '您的仓库 <b>{repository}</b> 已成功开通引擎服务,可通过简单的节点编排完成自动化集成与部署。欢迎体验!', notification_url: '{baseurl}/{owner}/{identifier}/devops')
|
||||
email_html = File.read("#{email_template_html_dir}/project_pull_request.html")
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
# == 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::ProjectMilestoneEarlyExpired < MessageTemplate
|
||||
|
||||
# MessageTemplate::ProjectMilestoneEarlyExpired.get_message_content(User.where(login: 'yystopf'), Version.find(7))
|
||||
def self.get_message_content(receivers, milestone)
|
||||
receivers.each do |receiver|
|
||||
if receiver.user_template_message_setting.present?
|
||||
send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneEarlyExpired"]
|
||||
send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneEarlyExpired"] : send_setting
|
||||
receivers = receivers.where.not(id: receiver.id) unless send_setting
|
||||
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::MilestoneEarlyExpired.get_message_content [ERROR] #{e}")
|
||||
return '', '', ''
|
||||
end
|
||||
|
||||
def self.get_email_message_content(receiver, milestone)
|
||||
if receiver.user_template_message_setting.present?
|
||||
send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneEarlyExpired"]
|
||||
send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneEarlyExpired"] : send_setting
|
||||
return '', '', '' unless send_setting
|
||||
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)
|
||||
content.gsub!('{platform}', PLATFORM)
|
||||
|
||||
return receiver&.mail, title, content
|
||||
else
|
||||
return '', '', ''
|
||||
end
|
||||
|
||||
rescue => e
|
||||
Rails.logger.info("MessageTemplate::MilestoneEarlyExpired.get_email_message_content [ERROR] #{e}")
|
||||
return '', '', ''
|
||||
end
|
||||
end
|
||||
70
app/models/message_template/project_milestone_expired.rb
Normal file
70
app/models/message_template/project_milestone_expired.rb
Normal file
@@ -0,0 +1,70 @@
|
||||
# == 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::ProjectMilestoneExpired < MessageTemplate
|
||||
|
||||
# MessageTemplate::ProjectMilestoneExpired.get_message_content(User.where(login: 'yystopf'), Version.find(7))
|
||||
def self.get_message_content(receivers, milestone)
|
||||
receivers.each do |receiver|
|
||||
if receiver.user_template_message_setting.present?
|
||||
send_setting = receiver.user_template_message_setting.notification_body["ManageProject::MilestoneExpired"]
|
||||
send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_notification_body["ManageProject::MilestoneExpired"] : send_setting
|
||||
receivers = receivers.where.not(id: receiver.id) unless send_setting
|
||||
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::ProjectMilestoneExpired.get_message_content [ERROR] #{e}")
|
||||
return '', '', ''
|
||||
end
|
||||
|
||||
def self.get_email_message_content(receiver, milestone)
|
||||
if receiver.user_template_message_setting.present?
|
||||
send_setting = receiver.user_template_message_setting.email_body["ManageProject::MilestoneExpired"]
|
||||
send_setting = send_setting.nil? ? UserTemplateMessageSetting.init_email_body["ManageProject::MilestoneExpired"] : send_setting
|
||||
return '', '', '' unless send_setting
|
||||
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)
|
||||
content.gsub!('{platform}', PLATFORM)
|
||||
|
||||
return receiver&.mail, title, content
|
||||
else
|
||||
return '', '', ''
|
||||
end
|
||||
|
||||
rescue => e
|
||||
Rails.logger.info("MessageTemplate::ProjectMilestoneExpired.get_email_message_content [ERROR] #{e}")
|
||||
return '', '', ''
|
||||
end
|
||||
end
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
class Organization < Owner
|
||||
alias_attribute :name, :login
|
||||
NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
|
||||
NAME_REGEX = /^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*$/ #只含有数字、字母、下划线不能以下划线开头和结尾
|
||||
|
||||
default_scope { where(type: "Organization") }
|
||||
|
||||
@@ -79,7 +79,7 @@ class Organization < Owner
|
||||
|
||||
validates :login, presence: true
|
||||
validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, case_sensitive: false
|
||||
validates :login, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
|
||||
validates :login, format: { with: NAME_REGEX, multiline: true, message: "只能以数字或字母开头,仅支持横杠、下划线、点三种符号,不允许符号连续排列,长度4-50个字符" }
|
||||
|
||||
delegate :description, :website, :location, :repo_admin_change_team_access, :recommend,
|
||||
:visibility, :max_repo_creation, :num_projects, :num_users, :num_teams,
|
||||
|
||||
@@ -34,6 +34,10 @@ class Page < ApplicationRecord
|
||||
PageService.genernate_user(user_id)
|
||||
end
|
||||
|
||||
before_destroy do
|
||||
PageService.close_site(user_id, identifier)
|
||||
end
|
||||
|
||||
before_save do
|
||||
if state_changed? && state == false
|
||||
PageService.close_site(user_id, identifier)
|
||||
@@ -46,7 +50,7 @@ class Page < ApplicationRecord
|
||||
|
||||
def url
|
||||
@deploy_domain = EduSetting.find_by_name("site_page_deploy_domain").try(:value)
|
||||
"http://#{user.login}.#{@deploy_domain}/#{identifier}"
|
||||
"http://#{identifier}"
|
||||
end
|
||||
|
||||
def build_script_path
|
||||
|
||||
@@ -136,6 +136,7 @@ class Project < ApplicationRecord
|
||||
has_many :project_topic_ralates, dependent: :destroy
|
||||
has_many :project_topics, through: :project_topic_ralates
|
||||
has_many :commit_logs, dependent: :destroy
|
||||
has_many :daily_project_statistics, dependent: :destroy
|
||||
after_create :incre_user_statistic, :incre_platform_statistic
|
||||
after_save :check_project_members
|
||||
before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned, :reset_cache_data
|
||||
|
||||
@@ -189,7 +189,7 @@ class User < Owner
|
||||
has_many :user_clas, :dependent => :destroy
|
||||
has_many :clas, through: :user_clas
|
||||
|
||||
has_many :pages, :dependent => :destroy
|
||||
has_one :page, :dependent => :destroy
|
||||
|
||||
# Groups and active users
|
||||
scope :active, lambda { where(status: [STATUS_ACTIVE, STATUS_EDIT_INFO]) }
|
||||
@@ -465,7 +465,7 @@ class User < Owner
|
||||
$gitea_client.delete_users_tokens_by_username_token(self.login, e["name"], {query: {sudo: self.login} })
|
||||
}
|
||||
end
|
||||
new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: self.login} })
|
||||
new_result = $gitea_client.post_users_tokens_by_username(self.login, { query: {sudo: self.login}, body:{ name: "#{self.login}-#{SecureRandom.hex(6)}", scopes: ["all"]}.to_json })
|
||||
if new_result["sha1"].present?
|
||||
update(gitea_token: new_result["sha1"])
|
||||
end
|
||||
@@ -773,7 +773,7 @@ class User < Owner
|
||||
|
||||
def check_website_permission
|
||||
if website_permission_changed? && website_permission == false
|
||||
self.pages.update_all(state: false, state_description:"因违规使用,现关闭Page服务")
|
||||
self.page.update(state: false, state_description:"因违规使用,现关闭Page服务")
|
||||
PageService.close_site(self.id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -44,6 +44,8 @@ class UserTemplateMessageSetting < ApplicationRecord
|
||||
"ManageProject::Forked": true,
|
||||
"ManageProject::Milestone": true,
|
||||
"ManageProject::MilestoneCompleted": true,
|
||||
"ManageProject::MilestoneExpired": true,
|
||||
"ManageProject::MilestoneEarlyExpired": true,
|
||||
}.stringify_keys!
|
||||
end
|
||||
|
||||
@@ -65,6 +67,8 @@ class UserTemplateMessageSetting < ApplicationRecord
|
||||
"ManageProject::Forked": false,
|
||||
"ManageProject::Milestone": false,
|
||||
"ManageProject::MilestoneCompleted": false,
|
||||
"ManageProject::MilestoneExpired": false,
|
||||
"ManageProject::MilestoneEarlyExpired": false,
|
||||
}.stringify_keys!
|
||||
end
|
||||
|
||||
|
||||
@@ -68,5 +68,7 @@ class Version < ApplicationRecord
|
||||
|
||||
def send_update_message_to_notice_system
|
||||
SendTemplateMessageJob.perform_later('ProjectMilestoneCompleted', self.id) if Site.has_notice_menu? && self.issue_percent == 1.0
|
||||
SendTemplateMessageJob.perform_later('ProjectMilestoneEarlyExpired', self.id) if Site.has_notice_menu? && self.effective_date == Date.today + 1.days
|
||||
SendTemplateMessageJob.perform_later('ProjectMilestoneExpired', self.id) if Site.has_notice_menu? && self.effective_date == Date.today - 1.days
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user