diff --git a/app/controllers/organizations/base_controller.rb b/app/controllers/organizations/base_controller.rb index 9178f458a..2e8ae0cf9 100644 --- a/app/controllers/organizations/base_controller.rb +++ b/app/controllers/organizations/base_controller.rb @@ -27,4 +27,8 @@ class Organizations::BaseController < ApplicationController def user_mark params[:username] || params[:id] end + + def project_mark + params[:repo_name] || params[:id] + end end \ No newline at end of file diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb index 458fb94a8..e4fda4e8e 100644 --- a/app/controllers/organizations/organizations_controller.rb +++ b/app/controllers/organizations/organizations_controller.rb @@ -12,7 +12,8 @@ class Organizations::OrganizationsController < Organizations::BaseController else @organizations = Organization.with_visibility("common") end - @organizations = @organizations.includes(:organization_extension).order(id: :asc) + @organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present? + @organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}") @organizations = kaminari_paginate(@organizations) end @@ -82,4 +83,12 @@ class Organizations::OrganizationsController < Organizations::BaseController tip_exception("没有查看组织的权限") if org_limited_condition || org_privacy_condition end + def sort_by + params.fetch(:sort_by, "created_at") + end + + def sort_direction + params.fetch(:sort_direction, "desc") + end + end \ No newline at end of file diff --git a/app/controllers/organizations/team_projects_controller.rb b/app/controllers/organizations/team_projects_controller.rb index a2242989d..f221c98db 100644 --- a/app/controllers/organizations/team_projects_controller.rb +++ b/app/controllers/organizations/team_projects_controller.rb @@ -11,6 +11,7 @@ class Organizations::TeamProjectsController < Organizations::BaseController end def create + tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project ActiveRecord::Base.transaction do @team_project = TeamProject.build(@organization.id, @team.id, @operate_project.id) Gitea::Organization::TeamProject::CreateService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier) @@ -21,8 +22,9 @@ class Organizations::TeamProjectsController < Organizations::BaseController end def destroy + tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project ActiveRecord::Base.transaction do - @team_projects.destroy! + @team_project.destroy! Gitea::Organization::TeamProject::DeleteService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier) render_ok end @@ -45,7 +47,7 @@ class Organizations::TeamProjectsController < Organizations::BaseController end def load_operate_project - @operate_project = Project.find_by(name: params[:id]) || Project.find_by(identifier: params[:id]) + @operate_project = Project.find_by(id: project_mark) || Project.find_by(identifier: project_mark) tip_exception("项目不存在") if @operate_project.nil? end diff --git a/app/controllers/users/organizations_controller.rb b/app/controllers/users/organizations_controller.rb index b0bfbd037..721339e84 100644 --- a/app/controllers/users/organizations_controller.rb +++ b/app/controllers/users/organizations_controller.rb @@ -9,6 +9,17 @@ class Users::OrganizationsController < Users::BaseController @organizations = observed_user.organizations.with_visibility("common") end - @organizations = @organizations.includes(:organization_extension).order(id: :asc) + @organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present? + @organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}") + @organizations = kaminari_paginate(@organizations) + end + + private + def sort_by + params.fetch(:sort_by, "created_at") + end + + def sort_direction + params.fetch(:sort_direction, "desc") end end \ No newline at end of file diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb index c4c7f6f63..2838996b6 100644 --- a/app/forms/projects/create_form.rb +++ b/app/forms/projects/create_form.rb @@ -1,13 +1,13 @@ class Projects::CreateForm < BaseForm REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, - :project_language_id, :ignore_id, :license_id, :private + :project_language_id, :ignore_id, :license_id, :private, :owner validates :user_id, :name, :description,:repository_name, :project_category_id, :project_language_id, presence: true validates :repository_name, format: { with: REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } - validate :check_ignore, :check_license, :check_owner + validate :check_ignore, :check_license, :check_owner, :check_max_repo_creation validate do check_project_category(project_category_id) check_project_language(project_language_id) @@ -22,6 +22,13 @@ class Projects::CreateForm < BaseForm end def check_owner - raise "user_id值无效." if user_id && Owner.find_by(id: user_id).blank? + @owner = Owner.find_by(id: user_id) + raise "user_id值无效." if user_id && owner.blank? + end + + def check_max_repo_creation + return unless owner.is_a?(Organization) + return if owner.max_repo_creation <= -1 + raise "已超过组织设置最大仓库数" if owner.max_repo_creation == owner.num_projects end end diff --git a/app/models/organization.rb b/app/models/organization.rb index 7e7cbba92..fb8d94c40 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -69,7 +69,8 @@ class Organization < Owner validates :login, presence: true validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, case_sensitive: false - delegate :description, :website, :location, :repo_admin_change_team_access, :visibility, :max_repo_creation, to: :organization_extension, allow_nil: true + delegate :description, :website, :location, :repo_admin_change_team_access, + :visibility, :max_repo_creation, :num_projects, :num_users, to: :organization_extension, allow_nil: true scope :with_visibility, ->(visibility) { joins(:organization_extension).where(organization_extensions: {visibility: visibility}) if visibility.present? } diff --git a/app/models/organization_extension.rb b/app/models/organization_extension.rb index 982e38f6b..16797f716 100644 --- a/app/models/organization_extension.rb +++ b/app/models/organization_extension.rb @@ -12,6 +12,8 @@ # max_repo_creation :integer default("-1") # created_at :datetime not null # updated_at :datetime not null +# num_projects :integer default("0") +# num_users :integer default("0") # # Indexes # @@ -21,6 +23,8 @@ class OrganizationExtension < ApplicationRecord belongs_to :organization + has_many :organization_users, foreign_key: :organization_id, primary_key: :organization_id + has_many :projects, foreign_key: :user_id, primary_key: :organization_id enum visibility: {common: 0, limited: 1, privacy: 2} diff --git a/app/models/organization_user.rb b/app/models/organization_user.rb index a2ec890ce..cf9e22371 100644 --- a/app/models/organization_user.rb +++ b/app/models/organization_user.rb @@ -17,6 +17,7 @@ class OrganizationUser < ApplicationRecord belongs_to :organization + belongs_to :organization_extension, foreign_key: :organization_id, primary_key: :organization_id, counter_cache: :num_users belongs_to :user validates :user_id, uniqueness: {scope: :organization_id} diff --git a/app/models/project.rb b/app/models/project.rb index dd7babd17..a91cf891d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -86,6 +86,7 @@ class Project < ApplicationRecord belongs_to :ignore, optional: true belongs_to :license, optional: true belongs_to :owner, class_name: 'Owner', foreign_key: :user_id, optional: true + 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 has_many :project_trends, dependent: :destroy diff --git a/app/services/organizations/create_service.rb b/app/services/organizations/create_service.rb index 5fcbda12d..02065135b 100644 --- a/app/services/organizations/create_service.rb +++ b/app/services/organizations/create_service.rb @@ -58,7 +58,7 @@ class Organizations::CreateService < ApplicationService TeamUnit.unit_types.keys.each do |u_type| TeamUnit.build(organization.id, owner_team.id, u_type) end - OrganizationUser.build(organization.id, user.id, true) + OrganizationUser.build(organization.id, user.id) TeamUser.build(organization.id, user.id, owner_team.id) end diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb index f6aecdd95..9b89490fb 100644 --- a/app/services/repositories/create_service.rb +++ b/app/services/repositories/create_service.rb @@ -44,7 +44,10 @@ class Repositories::CreateService < ApplicationService @gitea_repository = Gitea::Repository::CreateService.new(user.gitea_token, gitea_repository_params).call elsif project.owner.is_a?(Organization) @gitea_repository = Gitea::Organization::Repository::CreateService.call(user.gitea_token, project.owner.login, gitea_repository_params) - project.owner.teams.map{|t|t.setup_team_project!} + project.owner.teams.each do |team| + next unless team.includes_all_project + TeamProject.build(project.user_id, team.id, project.id) + end end end diff --git a/app/views/organizations/organizations/_detail.json.jbuilder b/app/views/organizations/organizations/_detail.json.jbuilder index 3e2a00b6d..d8dc17e81 100644 --- a/app/views/organizations/organizations/_detail.json.jbuilder +++ b/app/views/organizations/organizations/_detail.json.jbuilder @@ -6,4 +6,6 @@ json.location organization.location json.repo_admin_change_team_access organization.repo_admin_change_team_access json.visibility organization.visibility json.max_repo_creation organization.max_repo_creation +json.num_projects organization.num_projects +json.num_user organization.num_users json.avatar_url url_to_avatar(organization) \ No newline at end of file diff --git a/app/views/organizations/projects/index.json.jbuilder b/app/views/organizations/projects/index.json.jbuilder index 739f870ba..5ade6ad5c 100644 --- a/app/views/organizations/projects/index.json.jbuilder +++ b/app/views/organizations/projects/index.json.jbuilder @@ -1,6 +1,6 @@ json.total_count @projects.total_count json.projects @projects.each do |project| - json.(project, :name, :identifier, :description, :forked_count, :praises_count) + json.(project, :id, :name, :identifier, :description, :forked_count, :praises_count) json.praised project.praised_by?(current_user) json.last_update_time render_unix_time(project.updated_on) json.time_ago time_from_now(project.updated_on) diff --git a/app/views/organizations/team_projects/_detail.json.jbuilder b/app/views/organizations/team_projects/_detail.json.jbuilder new file mode 100644 index 000000000..d65021086 --- /dev/null +++ b/app/views/organizations/team_projects/_detail.json.jbuilder @@ -0,0 +1,6 @@ +json.id team_project.id +json.project do + json.owner_name team_project&.project&.owner&.login + json.name team_project&.project&.name + json.identifier team_project&.project&.identifier +end \ No newline at end of file diff --git a/app/views/organizations/team_projects/create.json.jbuilder b/app/views/organizations/team_projects/create.json.jbuilder new file mode 100644 index 000000000..e9f32468c --- /dev/null +++ b/app/views/organizations/team_projects/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! "detail", team_project: @team_project, team: @team, organization: @organization \ No newline at end of file diff --git a/app/views/organizations/team_projects/index.json.jbuilder b/app/views/organizations/team_projects/index.json.jbuilder new file mode 100644 index 000000000..102c042cb --- /dev/null +++ b/app/views/organizations/team_projects/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @team_projects.total_count +json.team_projects @team_projects do |team_project| + json.partial! "detail", team_project: team_project, team: @team, organization: @organization +end diff --git a/db/migrate/20210120081821_add_columns_to_organization_extension.rb b/db/migrate/20210120081821_add_columns_to_organization_extension.rb new file mode 100644 index 000000000..96089c9ce --- /dev/null +++ b/db/migrate/20210120081821_add_columns_to_organization_extension.rb @@ -0,0 +1,6 @@ +class AddColumnsToOrganizationExtension < ActiveRecord::Migration[5.2] + def change + add_column :organization_extensions, :num_projects, :integer, default: 0 + add_column :organization_extensions, :num_users, :integer, default: 0 + end +end