| @@ -286,6 +286,7 @@ http://localhost:3000/api/licenses/ | jq | |||
| |licenses|array |返回数据| | |||
| |-- id |int |id | | |||
| |-- name |string|开源许可证名称| | |||
| |-- is_secret |string|是否为特殊许可证| | |||
| 返回值 | |||
| @@ -294,23 +295,33 @@ http://localhost:3000/api/licenses/ | jq | |||
| "licenses": [ | |||
| { | |||
| "id": 57, | |||
| "name": "AFL-1.2" | |||
| "name": "AFL-1.2", | |||
| "is_secret": false | |||
| }, | |||
| { | |||
| "id": 76, | |||
| "name": "AFL-3.0" | |||
| "name": "AFL-3.0", | |||
| "is_secret": false | |||
| }, | |||
| { | |||
| "id": 214, | |||
| "name": "AFL-1.1" | |||
| "name": "AFL-1.1", | |||
| "is_secret": false | |||
| }, | |||
| { | |||
| "id": 326, | |||
| "name": "AFL-2.1" | |||
| "name": "AFL-2.1", | |||
| "is_secret": false | |||
| }, | |||
| { | |||
| "id": 350, | |||
| "name": "AFL-2.0" | |||
| "name": "AFL-2.0", | |||
| "is_secret": false | |||
| }, | |||
| { | |||
| "id": 359, | |||
| "name": "PHengLEI", | |||
| "is_secret": true | |||
| } | |||
| ] | |||
| } | |||
| @@ -555,6 +566,8 @@ curl -X GET http://localhost:3000/api/repositories/:id/edit.json | jq | |||
| |project_category_id |int|项目类别id| | |||
| |project_language_id |int|项目语言id| | |||
| |private |boolean|项目是否私有, true:为私有,false: 公开 | | |||
| |is_secret |boolean|项目是否为特殊协议项目, true:是,false: 否 | | |||
| 返回值 | |||
| @@ -567,7 +580,8 @@ curl -X GET http://localhost:3000/api/repositories/:id/edit.json | jq | |||
| "project_description": "my first project mirror_demo", | |||
| "project_category_id": 1, | |||
| "project_language_id": 2, | |||
| "private": false | |||
| "private": false, | |||
| "is_secret": true | |||
| } | |||
| ``` | |||
| --- | |||
| @@ -1146,6 +1160,7 @@ http://localhost:3000/api/projects | jq | |||
| |forked_count |int|被fork的数量| | |||
| |praises_count |int|star数量| | |||
| |is_public |boolean|是否公开, true:公开,false:未公开| | |||
| |is_secret |boolean|是否为特殊许可证项目, true:是,false:否| | |||
| |mirror_url |string|镜像url| | |||
| |last_update_time|int|最后更新时间,为UNIX格式的时间戳| | |||
| |author |object|项目创建者| | |||
| @@ -1156,6 +1171,10 @@ http://localhost:3000/api/projects | jq | |||
| |language |object|项目语言| | |||
| |-- id |int|项目语言id| | |||
| |-- name |string|项目语言名称| | |||
| |user_apply_signatures |object|用户创建的特殊许可申请| | |||
| |-- id |int|用户创建的特殊许可申请id| | |||
| |-- status |int|用户创建的特殊许可申请审核状态, 'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| | |||
| 返回值 | |||
| @@ -1171,6 +1190,7 @@ http://localhost:3000/api/projects | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "is_secret": true, | |||
| "mirror_url": null, | |||
| "last_update_time": 1577697461, | |||
| "author": { | |||
| @@ -1184,7 +1204,13 @@ http://localhost:3000/api/projects | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[ | |||
| { | |||
| "id": 1, | |||
| "status": "waiting" | |||
| } | |||
| ] | |||
| }, | |||
| { | |||
| "id": 2, | |||
| @@ -1194,6 +1220,7 @@ http://localhost:3000/api/projects | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "is_secret": false, | |||
| "mirror_url": null, | |||
| "last_update_time": 1577697403, | |||
| "author": { | |||
| @@ -1207,7 +1234,8 @@ http://localhost:3000/api/projects | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[] | |||
| }, | |||
| { | |||
| "id": 3, | |||
| @@ -1217,6 +1245,7 @@ http://localhost:3000/api/projects | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "is_secret": true, | |||
| "mirror_url": null, | |||
| "last_update_time": 1577415173, | |||
| "author": { | |||
| @@ -1230,7 +1259,8 @@ http://localhost:3000/api/projects | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[] | |||
| }, | |||
| { | |||
| "id": 5, | |||
| @@ -1240,6 +1270,7 @@ http://localhost:3000/api/projects | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": false, | |||
| "is_secret": true, | |||
| "mirror_url": "https://gitea.com/CasperVector/slew.git", | |||
| "last_update_time": 1577346228, | |||
| "author": { | |||
| @@ -1253,7 +1284,8 @@ http://localhost:3000/api/projects | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[] | |||
| }, | |||
| { | |||
| "id": 7, | |||
| @@ -1263,6 +1295,7 @@ http://localhost:3000/api/projects | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "is_secret": true, | |||
| "mirror_url": null, | |||
| "last_update_time": 1577341572, | |||
| "author": { | |||
| @@ -1276,7 +1309,8 @@ http://localhost:3000/api/projects | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[] | |||
| } | |||
| ] | |||
| } | |||
| @@ -3970,6 +4004,7 @@ http://localhost:3000/api/users/Jason/projects.json | jq | |||
| |forked_count |int|被fork的数量| | |||
| |praises_count |int|star数量| | |||
| |is_public |boolean|是否公开, true:公开,false:未公开| | |||
| |is_secret |boolean|是否为特殊许可证项目, true:是,false:否| | |||
| |mirror_url |string|镜像url| | |||
| |last_update_time|int|最后更新时间,为UNIX格式的时间戳| | |||
| |author |object|项目创建者| | |||
| @@ -3980,7 +4015,9 @@ http://localhost:3000/api/users/Jason/projects.json | jq | |||
| |language |object|项目语言| | |||
| |-- id |int|项目语言id| | |||
| |-- name |string|项目语言名称| | |||
| |user_apply_signatures |object|用户创建的特殊许可申请| | |||
| |-- id |int|用户创建的特殊许可申请id| | |||
| |-- status |int|用户创建的特殊许可申请审核状态, 'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| | |||
| 返回值 | |||
| ```json | |||
| @@ -3995,6 +4032,7 @@ http://localhost:3000/api/users/Jason/projects.json | jq | |||
| "praises_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "is_secret": false, | |||
| "mirror_url": null, | |||
| "last_update_time": 1577697461, | |||
| "author": { | |||
| @@ -4008,9 +4046,53 @@ http://localhost:3000/api/users/Jason/projects.json | jq | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| }, | |||
| "user_apply_signatures":[ | |||
| { | |||
| "id": 1, | |||
| "status": "waiting" | |||
| } | |||
| ] | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| --- | |||
| #### 特殊许可证项目用户创建申请 | |||
| ``` | |||
| POST /api/apply_signatures | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X POST \ | |||
| -d "project_id=8" \ | |||
| -d "attachment_id=4" \ | |||
| http://localhost:3000/api/apply_signatures.json | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| |参数名|必选|类型|说明| | |||
| |-|-|-|-| | |||
| |project_id |是|int |项目id | | |||
| |attachment_id |是|int |上传的文件id | | |||
| *返回参数说明:* | |||
| |参数名|类型|说明| | |||
| |-|-|-| | |||
| |id |int|特殊许可证项目用户创建申请的id| | |||
| |attachment |object|上传的文件| | |||
| |--filename |string|上传的文件的文件名| | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "id": 5, | |||
| "attachment": { | |||
| "filename": "timg.jpeg" | |||
| } | |||
| } | |||
| ``` | |||
| --- | |||
| @@ -0,0 +1,30 @@ | |||
| class Admins::ApplySignaturesController < Admins::BaseController | |||
| def index | |||
| sort_by = params[:sort_by] ||= 'created_on' | |||
| sort_direction = params[:sort_direction] ||= 'desc' | |||
| @apply_signatures = paginate ApplySignature.waiting.includes(:attachments) | |||
| end | |||
| def update | |||
| ActiveRecord::Base.transaction do | |||
| begin | |||
| apply_signature = ApplySignature.find_by!(id: params[:id]) | |||
| apply_signature.update_attributes!(apply_signatures_params) | |||
| Projects::AddMemberInteractor.call(apply_signature.project.owner, apply_signature.project, apply_signature.user, "write", true) | |||
| redirect_to admins_apply_signatures_path | |||
| flash[:success] = "更新成功" | |||
| rescue => e | |||
| raise ActiveRecord::Rollback | |||
| redirect_to admins_apply_signatures_path | |||
| flash[:danger] = "更新失败" | |||
| end | |||
| end | |||
| end | |||
| private | |||
| def apply_signatures_params | |||
| params.permit(:status) | |||
| end | |||
| end | |||
| @@ -0,0 +1,25 @@ | |||
| class ApplySignaturesController < ApplicationController | |||
| include ApplicationHelper | |||
| def template_file | |||
| license = License.find_by_name("PHengLEI") | |||
| file = license.attachments.take | |||
| normal_status(-1, "文件不存在") if file.blank? | |||
| send_file(absolute_path(local_path(file)), filename: file.title,stream:false, type: file.content_type.presence || 'application/octet-stream') | |||
| end | |||
| def create | |||
| ActiveRecord::Base.transaction do | |||
| begin | |||
| @signature = current_user.apply_signatures.create!(project_id: params[:project_id]) | |||
| @attachment = Attachment.find_by_id(params[:attachment_id]) | |||
| @attachment.container = @signature | |||
| @attachment.save! | |||
| rescue Exception => e | |||
| tip_exception("#{e}") | |||
| raise ActiveRecord::Rollback | |||
| end | |||
| render_json | |||
| end | |||
| end | |||
| end | |||
| @@ -11,7 +11,7 @@ class ProjectsController < ApplicationController | |||
| scope = Projects::ListQuery.call(params) | |||
| # @projects = kaminari_paginate(scope) | |||
| @projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, owner: :user_extension) | |||
| @projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :apply_signatures, owner: :user_extension) | |||
| category_id = params[:category_id] | |||
| @total_count = | |||
| @@ -53,7 +53,7 @@ class ProjectsController < ApplicationController | |||
| # else | |||
| # projects = Project.visible | |||
| # end | |||
| projects = Project.no_anomory_projects.visible | |||
| projects = Project.no_anomory_projects.secret_and_visible | |||
| language_lists = projects.joins(:project_language).group("project_languages.name", "project_languages.id").size.keys.sort.to_h | |||
| @project_group_list = language_lists.delete_if { |k, v| k.blank? } | |||
| end | |||
| @@ -153,7 +153,7 @@ class ProjectsController < ApplicationController | |||
| private | |||
| def project_params | |||
| params.permit(:user_id, :name, :description, :repository_name, | |||
| :project_category_id, :project_language_id, :license_id, :ignore_id) | |||
| :project_category_id, :project_language_id, :license_id, :ignore_id, :private) | |||
| end | |||
| def mirror_params | |||
| @@ -1,18 +1,19 @@ | |||
| module Projects | |||
| class AddMemberInteractor | |||
| def self.call(owner, project, collaborator, permission="write") | |||
| interactor = new(owner, project, collaborator, permission) | |||
| def self.call(owner, project, collaborator, permission="write", is_apply_signature=false) | |||
| interactor = new(owner, project, collaborator, permission, is_apply_signature) | |||
| interactor.run | |||
| interactor | |||
| end | |||
| attr_reader :error, :result | |||
| def initialize(owner, project, collaborator, permission) | |||
| @owner = owner | |||
| @project = project | |||
| @collaborator = collaborator | |||
| @permission = permission | |||
| def initialize(owner, project, collaborator, permission, is_apply_signature) | |||
| @owner = owner | |||
| @project = project | |||
| @collaborator = collaborator | |||
| @permission = permission | |||
| @is_apply_signature = is_apply_signature | |||
| end | |||
| def success? | |||
| @@ -23,7 +24,7 @@ module Projects | |||
| ActiveRecord::Base.transaction do | |||
| gitea_result = Gitea::Repository::Members::AddService.new(owner, project.identifier, collaborator.login, permission).call | |||
| if gitea_result.status == 204 | |||
| project.add_member!(collaborator.id) | |||
| project.add_member!(collaborator.id, 'Developer', is_apply_signature) | |||
| end | |||
| fail!(nil) | |||
| end | |||
| @@ -32,7 +33,7 @@ module Projects | |||
| end | |||
| private | |||
| attr_reader :owner, :project, :collaborator, :permission | |||
| attr_reader :owner, :project, :collaborator, :permission, :is_apply_signature | |||
| def fail!(error) | |||
| @error = error | |||
| @@ -0,0 +1,10 @@ | |||
| class ApplySignature < ApplicationRecord | |||
| belongs_to :user | |||
| belongs_to :project | |||
| has_many :attachments, as: :container, dependent: :destroy | |||
| scope :with_user_id, -> (user_id) {where(user_id: user_id)} | |||
| enum status: {unpassed: -1, waiting: 0, passed: 1} | |||
| end | |||
| @@ -10,8 +10,8 @@ module ProjectOperable | |||
| has_many :writable_members, -> { joins(:roles).where.not(roles: {name: 'Reporter'}) }, class_name: 'Member' | |||
| end | |||
| def add_member!(user_id, role_name='Developer') | |||
| member = members.create!(user_id: user_id) | |||
| def add_member!(user_id, role_name='Developer', is_apply_signature=false) | |||
| member = members.create!(user_id: user_id, is_apply_signature: is_apply_signature) | |||
| set_developer_role(member) | |||
| end | |||
| @@ -11,4 +11,6 @@ | |||
| class License < ApplicationRecord | |||
| include Projectable | |||
| has_many :attachments, as: :container, dependent: :destroy | |||
| end | |||
| @@ -1,73 +1,73 @@ | |||
| # == 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") | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_projects_on_forked_from_project_id (forked_from_project_id) | |||
| # index_projects_on_identifier (identifier) | |||
| # index_projects_on_is_public (is_public) | |||
| # index_projects_on_lft (lft) | |||
| # index_projects_on_name (name) | |||
| # index_projects_on_platform (platform) | |||
| # 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") | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_projects_on_forked_from_project_id (forked_from_project_id) | |||
| # index_projects_on_identifier (identifier) | |||
| # index_projects_on_is_public (is_public) | |||
| # index_projects_on_lft (lft) | |||
| # index_projects_on_name (name) | |||
| # index_projects_on_platform (platform) | |||
| # 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) | |||
| # | |||
| class Project < ApplicationRecord | |||
| include Matchable | |||
| include Publicable | |||
| @@ -106,12 +106,16 @@ class Project < ApplicationRecord | |||
| has_many :praise_treads, as: :praise_tread_object, dependent: :destroy | |||
| has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" | |||
| has_one :project_detail, dependent: :destroy | |||
| has_many :apply_signatures, dependent: :destroy | |||
| after_save :check_project_members | |||
| scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)} | |||
| scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} | |||
| scope :recommend, -> { visible.project_statics_select.where(recommend: true) } | |||
| scope :secret_and_visible, -> {joins(:license).where("licenses.is_secret = TRUE OR projects.is_public = TRUE")} | |||
| delegate :is_secret, to: :license, allow_nil: true | |||
| def self.search_project(search) | |||
| @@ -161,6 +161,7 @@ class User < ApplicationRecord | |||
| # has_many :libraries, dependent: :destroy | |||
| has_many :project_trends, dependent: :destroy | |||
| has_many :oauths , dependent: :destroy | |||
| has_many :apply_signatures, dependent: :destroy | |||
| # Groups and active users | |||
| scope :active, lambda { where(status: STATUS_ACTIVE) } | |||
| @@ -10,7 +10,7 @@ class Projects::ListQuery < ApplicationQuery | |||
| end | |||
| def call | |||
| q = Project.visible.by_name_or_identifier(params[:search]) | |||
| q = Project.secret_and_visible.by_name_or_identifier(params[:search]) | |||
| scope = q | |||
| .with_project_type(params[:project_type]) | |||
| @@ -53,6 +53,11 @@ class Projects::CreateService < ApplicationService | |||
| # end | |||
| def repo_is_public | |||
| params[:private].blank? ? true : !params[:private] | |||
| license = License.find_by_id(params[:license_id]) | |||
| if license.is_secret | |||
| false | |||
| else | |||
| params[:private].blank? ? true : !params[:private] | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,7 @@ | |||
| <% define_admin_breadcrumbs do %> | |||
| <% add_admin_breadcrumb('特殊许可申请列表') %> | |||
| <% end %> | |||
| <div class="box admin-list-container apply_signatures-list-container"> | |||
| <%= render partial: 'admins/apply_signatures/shared/list', locals: { apply_signatures: @apply_signatures } %> | |||
| </div> | |||
| @@ -0,0 +1,42 @@ | |||
| <table class="table table-hover text-center subject-list-table"> | |||
| <thead class="thead-light"> | |||
| <tr> | |||
| <th width="10%">序号</th> | |||
| <th width="20%" class="text-left">项目名称</th> | |||
| <th width="20%">申请人</th> | |||
| <th width="25%">申请材料</th> | |||
| <th width="25%">操作</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <% if apply_signatures.present? %> | |||
| <% apply_signatures.each_with_index do |signature, index| %> | |||
| <tr class="sinature-item-<%= signature.id %>"> | |||
| <td><%= list_index_no((params[:page] || 1).to_i, index) %></td> | |||
| <td class="text-left"> | |||
| <%= link_to(signature&.project&.name, "/projects/#{signature&.project&.owner.login}/#{signature&.project&.identifier}", target: '_blank') %> | |||
| </td> | |||
| <td> | |||
| <%= link_to(signature&.user&.real_name, "/users/#{signature&.user&.login}", target: '_blank') %> | |||
| </td> | |||
| <td> | |||
| <% if signature.attachments.present? %> | |||
| <% signature.attachments.each do |attachment|%> | |||
| <%= image_tag("/api/attachments/#{attachment.id}", width: 40, height: 40, class: 'preview-image auth-image', data: { toggle: 'tooltip', title: '点击预览' }) %> | |||
| <% end %> | |||
| <% end %> | |||
| </td> | |||
| <td class="action-container"> | |||
| <%= link_to "同意", admins_apply_signature_path(signature.id, status: 1), method: :patch, class: "delete-project-action" %> | |||
| <%= link_to "拒绝", admins_apply_signature_path(signature.id, status: -1), method: :patch, class: "delete-project-action" %> | |||
| </td> | |||
| </tr> | |||
| <% end %> | |||
| <% else %> | |||
| <%= render 'admins/shared/no_data_for_table' %> | |||
| <% end %> | |||
| </tbody> | |||
| </table> | |||
| <%= render partial: 'admins/shared/paginate', locals: { objects: apply_signatures } %> | |||
| @@ -5,6 +5,7 @@ | |||
| <th width="4%">ID</th> | |||
| <th width="15%" class="text-left">项目名称</th> | |||
| <th width="6%">公开</th> | |||
| <th width="6%">特殊协议</th> | |||
| <th width="5%">issue</th> | |||
| <th width="5%">资源</th> | |||
| <th width="6%">版本库</th> | |||
| @@ -23,9 +24,10 @@ | |||
| <td><%= list_index_no((params[:page] || 1).to_i, index) %></td> | |||
| <td><%= project.id %></td> | |||
| <td class="text-left"> | |||
| <%= link_to(project.name, "/projects/#{project.owner.login}/#{project.identifier}", target: '_blank') %> | |||
| <%= link_to(project.name, "/projects/#{project.owner&.login}/#{project.identifier}", target: '_blank') %> | |||
| </td> | |||
| <td><%= project.is_public ? '√' : '' %></td> | |||
| <td><%= project.is_secret ? '√' : '' %></td> | |||
| <td><%= project.issues.size %></td> | |||
| <td><%= project.attachments.size %></td> | |||
| <td><%= project&.project_score.try(:changeset_num).to_i %></td> | |||
| @@ -26,6 +26,8 @@ | |||
| <li><%= sidebar_item(admins_project_categories_path, '分类列表', icon: 'sitemap', controller: 'admins-project_categories') %></li> | |||
| <li><%= sidebar_item(admins_project_licenses_path, '开源许可证', icon: 'file-text-o', controller: 'admins-project_licenses') %></li> | |||
| <li><%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %></li> | |||
| <li><%= sidebar_item(admins_apply_signatures_path, '特殊许可申请列表', icon: 'git', controller: 'admins-apply_signatures') %></li> | |||
| <% end %> | |||
| </li> | |||
| @@ -0,0 +1,4 @@ | |||
| json.id @signature.id | |||
| json.attachment do | |||
| json.filename @attachment.filename | |||
| end | |||
| @@ -1 +1 @@ | |||
| json.licenses @licenses, :id, :name | |||
| json.licenses @licenses, :id, :name, :is_secret | |||
| @@ -5,5 +5,6 @@ json.members @members do |member| | |||
| json.is_owner @project.owner?(member.user) | |||
| json.role member.roles.last.name | |||
| json.role_name t("roles.#{member.roles.last.name}") | |||
| json.is_apply_signature member.is_apply_signature | |||
| end | |||
| end | |||
| @@ -1,18 +1,5 @@ | |||
| # json.array! @category_group_list do |category,v| | |||
| # json.id category[0] | |||
| # json.name category[1] | |||
| # json.projects_count v | |||
| # end | |||
| json.array! @category_group_list do |k,v| | |||
| children_category = @project_children_categories.get_children(v) | |||
| json.children do | |||
| json.array! children_category do |cate| | |||
| json.id cate[0] | |||
| json.name cate[1] | |||
| json.parent_id v | |||
| end | |||
| end | |||
| json.id v | |||
| json.name k.to_s | |||
| json.array! @project_categories do |category| | |||
| json.id category.id | |||
| json.name category.name | |||
| json.projects_count category.projects_count | |||
| end | |||
| @@ -7,6 +7,7 @@ json.visits project.visits | |||
| json.praises_count project.praises_count.to_i | |||
| json.forked_count project.forked_count.to_i | |||
| json.is_public project.is_public | |||
| json.is_secret project.is_secret | |||
| json.mirror_url project.repository&.mirror_url | |||
| json.type project&.numerical_for_project_type | |||
| json.last_update_time render_unix_time(project.updated_on) | |||
| @@ -35,12 +36,26 @@ json.category do | |||
| json.id project.project_category.id | |||
| json.name project.project_category.name | |||
| end | |||
| end | |||
| json.language do | |||
| if project.project_language.blank? | |||
| json.nil! | |||
| else | |||
| json.id project.project_language.id | |||
| json.name project.project_language.name | |||
| json.category do | |||
| if project.project_category.blank? | |||
| json.nil! | |||
| else | |||
| json.id project.project_category.id | |||
| json.name project.project_category.name | |||
| end | |||
| end | |||
| json.language do | |||
| if project.project_language.blank? | |||
| json.nil! | |||
| else | |||
| json.id project.project_language.id | |||
| json.name project.project_language.name | |||
| end | |||
| end | |||
| end | |||
| user_apply_signatures = project.apply_signatures.with_user_id(current_user.id) | |||
| json.user_apply_signatures user_apply_signatures do |signature| | |||
| json.id signature.id | |||
| json.status signature.status | |||
| end | |||
| @@ -10,6 +10,7 @@ json.projects @projects do |project| | |||
| json.praises_count project.praises_count.to_i | |||
| json.forked_count project.forked_count.to_i | |||
| json.is_public project.is_public | |||
| json.is_secret project.is_secret | |||
| json.mirror_url project.repository&.mirror_url | |||
| json.type project&.numerical_for_project_type | |||
| json.last_update_time render_unix_time(project.updated_on) | |||
| @@ -47,4 +48,9 @@ json.projects @projects do |project| | |||
| json.name project.project_language.name | |||
| end | |||
| end | |||
| user_apply_signatures = project.apply_signatures.with_user_id(current_user.id) | |||
| json.user_apply_signatures user_apply_signatures do |signature| | |||
| json.id signature.id | |||
| json.status signature.status | |||
| end | |||
| end | |||
| @@ -1,6 +1,12 @@ | |||
| json.name @project.name | |||
| json.identifier @project.identifier | |||
| json.is_public @project.is_public | |||
| json.is_secret @project.is_secret | |||
| json.description @project.description | |||
| json.repo_id @project.repository.id | |||
| json.repo_identifier @project.repository.identifier | |||
| user_apply_signatures = @project.apply_signatures.with_user_id(current_user.id) | |||
| json.user_apply_signatures user_apply_signatures do |signature| | |||
| json.id signature.id | |||
| json.status signature.status | |||
| end | |||
| @@ -5,3 +5,4 @@ json.project_description @project.description | |||
| json.project_category_id @project.project_category_id | |||
| json.project_language_id @project.project_language_id | |||
| json.private !@project.is_public | |||
| json.is_secret @project.is_secret | |||
| @@ -17,6 +17,12 @@ json.mirror_url @project&.repository.mirror_url | |||
| json.mirror @project&.repository.mirror_url.present? | |||
| json.type @project.numerical_for_project_type | |||
| json.open_devops @project.open_devops? | |||
| json.is_secret @project.is_secret | |||
| user_apply_signatures = @project.apply_signatures.with_user_id(current_user.id) | |||
| json.user_apply_signatures user_apply_signatures do |signature| | |||
| json.id signature.id | |||
| json.status signature.status | |||
| end | |||
| unless @project.common? | |||
| json.mirror_status @repo.mirror_status | |||
| @@ -1,5 +1,5 @@ | |||
| Rails.application.routes.draw do | |||
| require 'sidekiq/web' | |||
| require 'admin_constraint' | |||
| @@ -59,6 +59,11 @@ Rails.application.routes.draw do | |||
| delete :destroy_files | |||
| end | |||
| end | |||
| resources :apply_signatures, only: [:create] do | |||
| collection do | |||
| get :template_file | |||
| end | |||
| end | |||
| get 'home/index' | |||
| get 'home/search' | |||
| get 'main/first_stamp' | |||
| @@ -771,6 +776,7 @@ Rails.application.routes.draw do | |||
| resources :salesman_customers, only: [:index, :create, :edit, :update, :destroy] do | |||
| post :batch_add, on: :collection | |||
| end | |||
| resources :apply_signatures, only: [:index, :update] | |||
| end | |||
| @@ -1,17 +0,0 @@ | |||
| class ResetVersionsCount < ActiveRecord::Migration[5.2] | |||
| def change | |||
| execute "ALTER TABLE licenses MODIFY COLUMN id INT AUTO_INCREMENT;" | |||
| versions = Version.includes(:issues).select(:id, :closed_issues_count, :percent,:issues_count) | |||
| versions.each do |v| | |||
| Version.reset_counters v.id, :issues | |||
| closed_issues = Issue.select(:id, :fixed_version_id, :status_id).where(fixed_version_id: v.id, status_id: 5).size | |||
| unless v.closed_issues_count.to_i == closed_issues | |||
| percent = v.issues_count.to_i <=0 ? 0.0 : (closed_issues.to_f / v.issues_count.to_i) | |||
| v.closed_issues_count = closed_issues | |||
| v.percent = percent | |||
| v.save | |||
| end | |||
| puts v.id | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,11 @@ | |||
| class CreateApplySignatures < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :apply_signatures do |t| | |||
| t.references :user | |||
| t.references :project | |||
| t.integer :status, default: 0 | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| class AddSomeColumnsAboutApplySignatures < ActiveRecord::Migration[5.2] | |||
| def change | |||
| add_column :licenses, :is_secret, :boolean, default: false | |||
| add_column :members, :is_apply_signature, :boolean, default: false | |||
| end | |||
| end | |||
| @@ -0,0 +1,5 @@ | |||
| require 'rails_helper' | |||
| RSpec.describe ApplySignature, type: :model do | |||
| pending "add some examples to (or delete) #{__FILE__}" | |||
| end | |||