diff --git a/app/controllers/project_categories_controller.rb b/app/controllers/project_categories_controller.rb index 67a040fef..490e22021 100644 --- a/app/controllers/project_categories_controller.rb +++ b/app/controllers/project_categories_controller.rb @@ -10,7 +10,7 @@ class ProjectCategoriesController < ApplicationController end def group_list - @project_categories = ProjectCategory.where('projects_count > 0').order(projects_count: :desc) + @project_categories = ProjectCategory.select("id, name, projects_count, private_projects_count, (projects_count - private_projects_count) as public_projects_count").having('public_projects_count > 0').order(projects_count: :desc) # projects = Project.no_anomory_projects.visible # @category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 77f9ce649..faf9ec078 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -155,6 +155,15 @@ class ProjectsController < ApplicationController } gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params) @project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]}) + # 更新对应所属分类下的项目数量(私有) + before_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][0] : @project.is_public + after_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][1] : @project.is_public + before_pc_id = @project.previous_changes[:project_category_id].present? ? @project.previous_changes[:project_category_id][0] : @project.project_category_id + after_pc_id = @project.previous_changes[:project_category_id].present? ? @project.previous_changes[:project_category_id][1] : @project.project_category_id + before_pc = ProjectCategory.find_by_id(before_pc_id) + after_pc = ProjectCategory.find_by_id(after_pc_id) + before_pc.decrement!(:private_projects_count, 1) if before_pc.present? && !before_is_public + after_pc.increment!(:private_projects_count, 1) if after_pc.present? && !after_is_public end SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, @project.previous_changes.slice(:name, :description, :project_category_id, :project_language_id, :is_public, :identifier)) if Site.has_notice_menu? end @@ -172,6 +181,8 @@ class ProjectsController < ApplicationController Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call @project.destroy! @project.forked_projects.update_all(forked_from_project_id: nil) + # 如果该项目有所属的项目分类以及为私有项目,需要更新对应数量 + @project.project_category.decrement!(:private_projects_count, 1) if @project.project_category.present? && !@project.is_public render_ok end else diff --git a/app/models/project_category.rb b/app/models/project_category.rb index 4bba5423e..97a304259 100644 --- a/app/models/project_category.rb +++ b/app/models/project_category.rb @@ -2,14 +2,15 @@ # # Table name: project_categories # -# id :integer not null, primary key -# name :string(255) -# position :integer -# projects_count :integer default("0") -# created_at :datetime not null -# updated_at :datetime not null -# ancestry :string(255) -# pinned_index :integer default("0") +# id :integer not null, primary key +# name :string(255) +# position :integer +# projects_count :integer default("0") +# created_at :datetime not null +# updated_at :datetime not null +# ancestry :string(255) +# pinned_index :integer default("0") +# private_projects_count :integer default("0") # # Indexes # diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 025883805..2b4523bf5 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -16,6 +16,7 @@ class Projects::CreateService < ApplicationService Project.update_common_projects_count! ProjectUnit.init_types(@project.id) Repositories::CreateService.new(user, @project, repository_params).call + upgrade_project_category_private_projects_count else Rails.logger.info("#############___________create_project_erros______###########{@project.errors.messages}") end @@ -28,6 +29,14 @@ class Projects::CreateService < ApplicationService private + def upgrade_project_category_private_projects_count + # 如果为空或者项目为公有项目直接返回 + return unless params[:project_category_id].present? + return if repo_is_public + project_category = ProjectCategory.find_by_id(params[:project_category_id]) + project_category.increment!(:private_projects_count, 1) + end + def authroize_user_id_success (user.id == params[:user_id].to_i) || (user.organizations.find_by_id(params[:user_id]).present?) end diff --git a/app/views/admins/project_categories/_list.html.erb b/app/views/admins/project_categories/_list.html.erb index 1a1626bc4..c4b70f52d 100644 --- a/app/views/admins/project_categories/_list.html.erb +++ b/app/views/admins/project_categories/_list.html.erb @@ -4,7 +4,8 @@