From 6c3c1ce0933c5386798b9a43c8afdec7aabde0b1 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 25 Jun 2021 17:53:49 +0800 Subject: [PATCH 1/8] fix: issue show permission --- app/controllers/issues_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 9780d4729..ea6ba0046 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -231,7 +231,7 @@ class IssuesController < ApplicationController end def show - @user_permission = current_user.present? && current_user.logged? && (!@issue.is_lock || @project.member?(current_user) || current_user.admin? || @issue.user == current_user) + @user_permission = current_user.present? && current_user.logged? && (@project.member?(current_user) || current_user.admin? || @issue.user == current_user) @issue_attachments = @issue.attachments @issue_user = @issue.user @issue_assign_to = @issue.get_assign_user @@ -416,7 +416,7 @@ class IssuesController < ApplicationController def operate_issue_permission return render_forbidden("您没有权限进行此操作.") unless current_user.admin? || @project.member?(current_user) end - + def export_issues(issues) @table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于) @export_issues = [] From 0e7f3a89057725c125bcbf28cfd871ebf12f5448 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 10:36:58 +0800 Subject: [PATCH 2/8] fix: project permission and update user lastname --- app/models/concerns/project_operable.rb | 2 +- app/models/user.rb | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index a228a7028..a6dc0dd35 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -65,7 +65,7 @@ module ProjectOperable if owner.is_a?(User) managers.exists?(user_id: user.id) elsif owner.is_a?(Organization) - managers.exists?(user_id: user.id) || owner.is_only_admin?(user.id) + managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || owner.is_only_admin?(user.id) else false end diff --git a/app/models/user.rb b/app/models/user.rb index c943e5efa..4b3934702 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -186,7 +186,7 @@ class User < Owner :show_email, :show_location, :show_department, :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true - before_save :update_hashed_password + before_save :update_hashed_password, :set_lastname after_create do SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie? end @@ -779,6 +779,10 @@ class User < Owner self.laboratory = Laboratory.current if laboratory_id.blank? end + + def set_lastname + self.lastname = self.nickname if changes[:nickname].present? + end end From 8331d849d5afdec5cd1dda89eb69b6c8de2f1d70 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 17:36:15 +0800 Subject: [PATCH 3/8] fix: forked projects private set --- app/controllers/projects_controller.rb | 4 +- app/models/project.rb | 158 +++++++++--------- .../sync_projects_by_forked_project.rake | 22 +++ 3 files changed, 105 insertions(+), 79 deletions(-) create mode 100644 lib/tasks/sync_projects_by_forked_project.rake diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c9e1a3a14..1fc0e8176 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -116,10 +116,11 @@ class ProjectsController < ApplicationController Projects::UpdateForm.new(validate_params).validate! - private = params[:private] || false + private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false new_project_params = project_params.except(:private).merge(is_public: !private) @project.update_attributes!(new_project_params) + @project.forked_projects&.update(is_public: @project.is_public) gitea_params = { private: private, default_branch: @project.default_branch, @@ -144,6 +145,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call @project.destroy! + @project.forked_projects&.update(forked_from_project_id: nil) render_ok end else diff --git a/app/models/project.rb b/app/models/project.rb index 251b40de1..4a5a9577f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,81 +1,81 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) default(""), not null -# description :text(4294967295) -# homepage :string(255) default("") -# is_public :boolean default("1"), not null -# parent_id :integer -# created_on :datetime -# updated_on :datetime -# identifier :string(255) -# status :integer default("1"), not null -# lft :integer -# rgt :integer -# inherit_members :boolean default("0"), not null -# project_type :integer default("0") -# hidden_repo :boolean default("0"), not null -# attachmenttype :integer default("1") -# user_id :integer -# dts_test :integer default("0") -# enterprise_name :string(255) -# organization_id :integer -# project_new_type :integer -# gpid :integer -# forked_from_project_id :integer -# forked_count :integer default("0") -# publish_resource :integer default("0") -# visits :integer default("0") -# hot :integer default("0") -# invite_code :string(255) -# qrcode :string(255) -# qrcode_expiretime :integer default("0") -# script :text(65535) -# training_status :integer default("0") -# rep_identifier :string(255) -# project_category_id :integer -# project_language_id :integer -# license_id :integer -# ignore_id :integer -# praises_count :integer default("0") -# watchers_count :integer default("0") -# issues_count :integer default("0") -# pull_requests_count :integer default("0") -# language :string(255) -# versions_count :integer default("0") -# issue_tags_count :integer default("0") -# closed_issues_count :integer default("0") -# open_devops :boolean default("0") -# gitea_webhook_id :integer -# open_devops_count :integer default("0") -# recommend :boolean default("0") -# platform :integer default("0") -# default_branch :string(255) default("master") -# website :string(255) -# order_index :integer default("0") -# lesson_url :string(255) -# -# Indexes -# -# index_projects_on_forked_from_project_id (forked_from_project_id) -# index_projects_on_identifier (identifier) -# index_projects_on_invite_code (invite_code) -# index_projects_on_is_public (is_public) -# index_projects_on_lft (lft) -# index_projects_on_license_id (license_id) -# index_projects_on_name (name) -# index_projects_on_platform (platform) -# index_projects_on_project_category_id (project_category_id) -# index_projects_on_project_language_id (project_language_id) -# index_projects_on_project_type (project_type) -# index_projects_on_recommend (recommend) -# index_projects_on_rgt (rgt) -# index_projects_on_status (status) -# index_projects_on_updated_on (updated_on) -# - +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) default(""), not null +# description :text(4294967295) +# homepage :string(255) default("") +# is_public :boolean default("1"), not null +# parent_id :integer +# created_on :datetime +# updated_on :datetime +# identifier :string(255) +# status :integer default("1"), not null +# lft :integer +# rgt :integer +# inherit_members :boolean default("0"), not null +# project_type :integer default("0") +# hidden_repo :boolean default("0"), not null +# attachmenttype :integer default("1") +# user_id :integer +# dts_test :integer default("0") +# enterprise_name :string(255) +# organization_id :integer +# project_new_type :integer +# gpid :integer +# forked_from_project_id :integer +# forked_count :integer default("0") +# publish_resource :integer default("0") +# visits :integer default("0") +# hot :integer default("0") +# invite_code :string(255) +# qrcode :string(255) +# qrcode_expiretime :integer default("0") +# script :text(65535) +# training_status :integer default("0") +# rep_identifier :string(255) +# project_category_id :integer +# project_language_id :integer +# license_id :integer +# ignore_id :integer +# praises_count :integer default("0") +# watchers_count :integer default("0") +# issues_count :integer default("0") +# pull_requests_count :integer default("0") +# language :string(255) +# versions_count :integer default("0") +# issue_tags_count :integer default("0") +# closed_issues_count :integer default("0") +# open_devops :boolean default("0") +# gitea_webhook_id :integer +# open_devops_count :integer default("0") +# recommend :boolean default("0") +# platform :integer default("0") +# default_branch :string(255) default("master") +# website :string(255) +# order_index :integer default("0") +# lesson_url :string(255) +# +# Indexes +# +# index_projects_on_forked_from_project_id (forked_from_project_id) +# index_projects_on_identifier (identifier) +# index_projects_on_invite_code (invite_code) +# index_projects_on_is_public (is_public) +# index_projects_on_lft (lft) +# index_projects_on_license_id (license_id) +# index_projects_on_name (name) +# index_projects_on_platform (platform) +# index_projects_on_project_category_id (project_category_id) +# index_projects_on_project_language_id (project_language_id) +# index_projects_on_project_type (project_type) +# index_projects_on_recommend (recommend) +# index_projects_on_rgt (rgt) +# index_projects_on_status (status) +# index_projects_on_updated_on (updated_on) +# + @@ -101,10 +101,12 @@ class Project < ApplicationRecord belongs_to :organization_extension, foreign_key: :user_id, primary_key: :organization_id, optional: true, counter_cache: :num_projects belongs_to :project_category, optional: true , :counter_cache => true belongs_to :project_language, optional: true , :counter_cache => true + belongs_to :forked_from_project, class_name: 'Project', optional: true, foreign_key: :forked_from_project_id has_many :project_trends, dependent: :destroy has_many :watchers, as: :watchable, dependent: :destroy has_many :fork_users, dependent: :destroy has_many :forked_users, class_name: 'ForkUser', foreign_key: :fork_project_id, dependent: :destroy + has_many :forked_projects, class_name: 'Project', foreign_key: :forked_from_project_id has_one :project_educoder, dependent: :destroy has_one :project_score, dependent: :destroy diff --git a/lib/tasks/sync_projects_by_forked_project.rake b/lib/tasks/sync_projects_by_forked_project.rake new file mode 100644 index 000000000..0e7876974 --- /dev/null +++ b/lib/tasks/sync_projects_by_forked_project.rake @@ -0,0 +1,22 @@ +namespace :sync_projects_by_forked_project do + desc "sync projects is_public by forked project" + task is_public: :environment do + count = 0 + Project.where.not(forked_from_project_id: nil).find_each do |project| + project.update(is_public: project&.forked_from_project&.is_public) + count +=1 + end + puts "共同步了#{count}个项目" + end + + task destroy: :environment do + count = 0 + Project.where.not(forked_from_project_id: nil).find_each do |project| + if project.forked_from_project.nil? + project.update(forked_from_project_id: nil) + count +=1 + end + end + puts "共同步了#{count}个项目" + end +end \ No newline at end of file From 4cc46f4cb45a73072d73d63146135ee4bf50a28c Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 18:05:37 +0800 Subject: [PATCH 4/8] fix --- app/controllers/projects_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 1fc0e8176..fee3ae759 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -120,7 +120,7 @@ class ProjectsController < ApplicationController new_project_params = project_params.except(:private).merge(is_public: !private) @project.update_attributes!(new_project_params) - @project.forked_projects&.update(is_public: @project.is_public) + @project.forked_projects.update_all(is_public: @project.is_public) gitea_params = { private: private, default_branch: @project.default_branch, @@ -145,7 +145,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call @project.destroy! - @project.forked_projects&.update(forked_from_project_id: nil) + @project.forked_projects.update_all(forked_from_project_id: nil) render_ok end else From 2a72fc56a4ef6ac194ed5fe3dd051db0a32874dd Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 1 Jul 2021 13:56:15 +0800 Subject: [PATCH 5/8] fix: copy issue author id --- app/controllers/issues_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index ea6ba0046..2360dc787 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -316,6 +316,7 @@ class IssuesController < ApplicationController def copy @new_issue = @issue.dup + @new_issue.author_id = current_user.id if @new_issue.save issue_tags = @issue.issue_tags.pluck(:id) if issue_tags.present? From d1939116a3219f824e821a89701c6549712f857a Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 1 Jul 2021 13:58:36 +0800 Subject: [PATCH 6/8] fix: authorize --- app/controllers/issues_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 2360dc787..3af2f6536 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -3,7 +3,7 @@ class IssuesController < ApplicationController before_action :load_project before_action :set_user before_action :check_issue_permission - before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update] + before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy] before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue] before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue] From 312fca7e2bcf6f9792a6c420bab3ba5ff8e58971 Mon Sep 17 00:00:00 2001 From: viletyy Date: Thu, 1 Jul 2021 17:55:48 +0800 Subject: [PATCH 7/8] fix: update shell simple --- lib/tasks/sync_projects_by_forked_project.rake | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/tasks/sync_projects_by_forked_project.rake b/lib/tasks/sync_projects_by_forked_project.rake index 0e7876974..d6cd1f210 100644 --- a/lib/tasks/sync_projects_by_forked_project.rake +++ b/lib/tasks/sync_projects_by_forked_project.rake @@ -2,9 +2,13 @@ namespace :sync_projects_by_forked_project do desc "sync projects is_public by forked project" task is_public: :environment do count = 0 - Project.where.not(forked_from_project_id: nil).find_each do |project| - project.update(is_public: project&.forked_from_project&.is_public) - count +=1 + Project.where.not(forked_from_project_id: nil).group(:forked_from_project_id).count.each do |k, _| + project = Project.find_by_id(k) + need_update_forked_projects = Project.where(forked_from_project_id: k) + need_update_forked_projects.update_all(is_public: project&.is_public) + need_update_forked_repositories = Repository.where(project_id: need_update_forked_projects.ids) + need_update_forked_repositories.update_all(hidden: !project&.is_public) + count +=need_update_forked_projects.size end puts "共同步了#{count}个项目" end From fa8594d2ab27c305cf13ab3d3d5509afa388d46d Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 12:02:34 +0800 Subject: [PATCH 8/8] add: merge pr check status --- app/controllers/pull_requests_controller.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 8521cd4b3..6409aa19a 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -150,9 +150,16 @@ class PullRequestsController < ApplicationController else ActiveRecord::Base.transaction do begin - result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params) + @gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token) - if result.status == 200 && @pull_request.merge! + if @gitea_pull["merged_by"].present? + success_condition = true + else + result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params) + success_condition = result.status == 200 + end + + if success_condition && @pull_request.merge! @pull_request.project_trend_status! @issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id) normal_status(1, "合并成功")