From 64c6f69f56fb1fe5dc555eea2328e9090541261f Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 15 Nov 2022 14:25:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E9=A1=B9=E7=9B=AE=E5=88=86=E7=B1=BB=E4=B8=8B=E7=A7=81?= =?UTF-8?q?=E6=9C=89=E9=A1=B9=E7=9B=AE=E7=9A=84=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 11 +++++++++++ app/models/project_category.rb | 17 +++++++++-------- app/services/projects/create_service.rb | 9 +++++++++ .../admins/project_categories/_list.html.erb | 4 +++- ...rivate_projects_count_to_project_category.rb | 5 +++++ 5 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20221115032403_add_private_projects_count_to_project_category.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 71e409dd..03944f1f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -154,6 +154,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 @@ -171,6 +180,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 4bba5423..97a30425 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 02588380..2b4523bf 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 1a1626bc..c4b70f52 100644 --- a/app/views/admins/project_categories/_list.html.erb +++ b/app/views/admins/project_categories/_list.html.erb @@ -4,7 +4,8 @@ 序号 名称 <%= sort_tag('精选', name: 'pinned_index', path: admins_project_categories_path) %> - <%= sort_tag('项目数', name: 'projects_count', path: admins_project_categories_path) %> + <%= sort_tag('项目数', name: 'projects_count', path: admins_project_categories_path) %> + <%= sort_tag('私有项目数', name: 'private_projects_count', path: admins_project_categories_path) %> 精选项目数 <%= sort_tag('创建时间', name: 'created_at', path: admins_project_categories_path) %> 操作 @@ -20,6 +21,7 @@ <%= project_category.pinned_index == 0 ? "" : "√" %> <%= project_category.projects_count %> + <%= project_category.private_projects_count %> <%= project_category.projects.select(:id).where(is_pinned: true).size %> <%= project_category.created_at&.strftime('%Y-%m-%d %H:%M') %> diff --git a/db/migrate/20221115032403_add_private_projects_count_to_project_category.rb b/db/migrate/20221115032403_add_private_projects_count_to_project_category.rb new file mode 100644 index 00000000..8d2d92ff --- /dev/null +++ b/db/migrate/20221115032403_add_private_projects_count_to_project_category.rb @@ -0,0 +1,5 @@ +class AddPrivateProjectsCountToProjectCategory < ActiveRecord::Migration[5.2] + def change + add_column :project_categories, :private_projects_count, :integer, default: 0 + end +end From 255b6153273b9281bc9864e69bb5cf58becb1037 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 15 Nov 2022 14:41:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=A6=96=E9=A1=B5=E5=88=86=E7=B1=BB=E5=90=8E=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/project_categories_controller.rb | 2 +- app/views/project_categories/group_list.json.jbuilder | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/project_categories_controller.rb b/app/controllers/project_categories_controller.rb index 67a040fe..490e2202 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/views/project_categories/group_list.json.jbuilder b/app/views/project_categories/group_list.json.jbuilder index f13d6ecf..cc26276f 100644 --- a/app/views/project_categories/group_list.json.jbuilder +++ b/app/views/project_categories/group_list.json.jbuilder @@ -1,5 +1,5 @@ json.array! @project_categories do |category| json.id category.id json.name category.name - json.projects_count category.projects_count + json.projects_count category.public_projects_count end