From 36bae719472d4c3a4e065a71351b635310417b51 Mon Sep 17 00:00:00 2001 From: viletyy Date: Fri, 25 Dec 2020 16:17:46 +0800 Subject: [PATCH 1/7] =?UTF-8?q?[ADD]=E5=A2=9E=E5=8A=A0=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E8=AE=B8=E5=8F=AF=E7=9A=84=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apply_signatures_controller.rb | 16 +++++ .../project_categories_controller.rb | 2 +- app/controllers/projects_controller.rb | 2 +- app/models/apply_signature.rb | 6 ++ app/models/license.rb | 2 + app/models/project.rb | 4 ++ app/models/user.rb | 1 + app/queries/projects/list_query.rb | 2 +- app/services/projects/create_service.rb | 7 +- .../apply_signatures/create.json.jbuilder | 4 ++ app/views/licenses/index.json.jbuilder | 2 +- .../projects/_project_detail.json.jbuilder | 72 ++++++++++--------- app/views/projects/show.json.jbuilder | 6 ++ app/views/repositories/edit.json.jbuilder | 1 + app/views/repositories/show.json.jbuilder | 6 ++ config/routes.rb | 1 + .../20201225064324_create_apply_signatures.rb | 11 +++ ...add_some_columns_about_apply_signatures.rb | 6 ++ spec/models/apply_signature_spec.rb | 5 ++ 19 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 app/controllers/apply_signatures_controller.rb create mode 100644 app/models/apply_signature.rb create mode 100644 app/views/apply_signatures/create.json.jbuilder create mode 100644 db/migrate/20201225064324_create_apply_signatures.rb create mode 100644 db/migrate/20201225065222_add_some_columns_about_apply_signatures.rb create mode 100644 spec/models/apply_signature_spec.rb diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb new file mode 100644 index 00000000..652e5989 --- /dev/null +++ b/app/controllers/apply_signatures_controller.rb @@ -0,0 +1,16 @@ +class ApplySignaturesController < ApplicationController + 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 \ No newline at end of file diff --git a/app/controllers/project_categories_controller.rb b/app/controllers/project_categories_controller.rb index 4b4a9634..edc550ec 100644 --- a/app/controllers/project_categories_controller.rb +++ b/app/controllers/project_categories_controller.rb @@ -12,7 +12,7 @@ class ProjectCategoriesController < ApplicationController # projects = Project.visible # end @project_children_categories = ProjectCategory.descendants - projects = Project.no_anomory_projects.visible + projects = Project.no_anomory_projects.secret_and_visible categories = projects.joins(:project_category).where(project_categories: {ancestry: nil}).group("project_categories.name", "project_categories.id").size.keys.to_h extra_category_id = categories.delete("其他") categories = categories.merge({"其他": extra_category_id}) if extra_category_id.present? #其他的放在最后面 diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index bfecf81a..76400860 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -43,7 +43,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 diff --git a/app/models/apply_signature.rb b/app/models/apply_signature.rb new file mode 100644 index 00000000..f76bda94 --- /dev/null +++ b/app/models/apply_signature.rb @@ -0,0 +1,6 @@ +class ApplySignature < ApplicationRecord + belongs_to :user + belongs_to :project + + scope :with_user_id, -> (user_id) {where(user_id: user_id)} +end diff --git a/app/models/license.rb b/app/models/license.rb index 952c4a13..1c665075 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -1,3 +1,5 @@ class License < ApplicationRecord include Projectable + has_many :attachments, as: :container, dependent: :destroy + end diff --git a/app/models/project.rb b/app/models/project.rb index bd2008af..9c73dfde 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -31,10 +31,14 @@ class Project < ApplicationRecord has_many :versions, -> { order("versions.created_on DESC, versions.name DESC") }, dependent: :destroy has_many :praise_treads, as: :praise_tread_object, dependent: :destroy has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" + 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 :secret_and_visible, -> {joins(:license).where("licenses.is_secret = TRUE OR projects.is_public = TRUE")} + + delegate :is_secret, to: :license def self.search_project(search) diff --git a/app/models/user.rb b/app/models/user.rb index 41be85f9..b112a660 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -92,6 +92,7 @@ class User < ApplicationRecord # 教学案例 # has_many :libraries, dependent: :destroy has_many :project_trends, dependent: :destroy + has_many :apply_signatures, dependent: :destroy # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 91a2a762..9e35b717 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -10,7 +10,7 @@ class Projects::ListQuery < ApplicationQuery end def call - q = Project.visible.search_project(params[:search]) + q = Project.secret_and_visible.search_project(params[:search]) scope = q.result(distinct: true) .includes(:project_category, :project_language, :repository, owner: :user_extension) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index f4297acf..692d1efe 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -52,6 +52,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 diff --git a/app/views/apply_signatures/create.json.jbuilder b/app/views/apply_signatures/create.json.jbuilder new file mode 100644 index 00000000..acffa1cb --- /dev/null +++ b/app/views/apply_signatures/create.json.jbuilder @@ -0,0 +1,4 @@ +json.id @signature.id +json.attachment do + json.name @attachment.filename +end diff --git a/app/views/licenses/index.json.jbuilder b/app/views/licenses/index.json.jbuilder index 706262a6..110cd84c 100644 --- a/app/views/licenses/index.json.jbuilder +++ b/app/views/licenses/index.json.jbuilder @@ -1 +1 @@ -json.licenses @licenses, :id, :name +json.licenses @licenses, :id, :name, :is_secret diff --git a/app/views/projects/_project_detail.json.jbuilder b/app/views/projects/_project_detail.json.jbuilder index d7cd196e..41be421b 100644 --- a/app/views/projects/_project_detail.json.jbuilder +++ b/app/views/projects/_project_detail.json.jbuilder @@ -3,38 +3,44 @@ if user.blank? nil else json.id project.id -json.repo_id project&.repository&.id -json.identifier project.identifier -json.name project.name -json.description Nokogiri::HTML(project.description).text -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.mirror_url project.repository&.mirror_url -json.type project&.numerical_for_project_type -json.last_update_time render_unix_time(project.updated_on) -json.time_ago time_from_now(project.updated_on) -json.forked_from_project_id project.forked_from_project_id -json.author do - json.name user.try(:show_real_name) - json.login user.login - json.image_url url_to_avatar(project.owner) -end -json.category do - if project.project_category.blank? - json.nil! - else - json.id project.project_category.id - json.name project.project_category.name + json.repo_id project&.repository&.id + json.identifier project.identifier + json.name project.name + json.description Nokogiri::HTML(project.description).text + 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) + json.time_ago time_from_now(project.updated_on) + json.forked_from_project_id project.forked_from_project_id + json.author do + json.name user.try(:show_real_name) + json.login user.login + json.image_url url_to_avatar(project.owner) + end + 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 + 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 -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 diff --git a/app/views/projects/show.json.jbuilder b/app/views/projects/show.json.jbuilder index e17da467..c9a8b15d 100644 --- a/app/views/projects/show.json.jbuilder +++ b/app/views/projects/show.json.jbuilder @@ -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 \ No newline at end of file diff --git a/app/views/repositories/edit.json.jbuilder b/app/views/repositories/edit.json.jbuilder index 355823b1..45f88858 100644 --- a/app/views/repositories/edit.json.jbuilder +++ b/app/views/repositories/edit.json.jbuilder @@ -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 diff --git a/app/views/repositories/show.json.jbuilder b/app/views/repositories/show.json.jbuilder index 539f713a..c2c4bf28 100644 --- a/app/views/repositories/show.json.jbuilder +++ b/app/views/repositories/show.json.jbuilder @@ -16,6 +16,12 @@ json.permission User.current&.admin? ? "Manager" : @project.get_premission(@use json.mirror_url @project&.repository.mirror_url json.mirror @project&.repository.mirror_url.present? json.type @project.numerical_for_project_type +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 diff --git a/config/routes.rb b/config/routes.rb index df6eae80..da70a528 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -35,6 +35,7 @@ Rails.application.routes.draw do delete :destroy_files end end + resources :apply_signatures, only: [:create] get 'home/index' get 'home/search' get 'main/first_stamp' diff --git a/db/migrate/20201225064324_create_apply_signatures.rb b/db/migrate/20201225064324_create_apply_signatures.rb new file mode 100644 index 00000000..ce0cba8b --- /dev/null +++ b/db/migrate/20201225064324_create_apply_signatures.rb @@ -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 diff --git a/db/migrate/20201225065222_add_some_columns_about_apply_signatures.rb b/db/migrate/20201225065222_add_some_columns_about_apply_signatures.rb new file mode 100644 index 00000000..83e1913e --- /dev/null +++ b/db/migrate/20201225065222_add_some_columns_about_apply_signatures.rb @@ -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 diff --git a/spec/models/apply_signature_spec.rb b/spec/models/apply_signature_spec.rb new file mode 100644 index 00000000..6c7f41b9 --- /dev/null +++ b/spec/models/apply_signature_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ApplySignature, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From ad5fcb25c4d538ad7f4383de2c7a4ce8dc8fa6ac Mon Sep 17 00:00:00 2001 From: viletyy Date: Fri, 25 Dec 2020 17:51:42 +0800 Subject: [PATCH 2/7] =?UTF-8?q?[ADD]=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_document.md | 108 +++++++++++++++--- app/controllers/projects_controller.rb | 2 +- .../projects/_project_detail.json.jbuilder | 11 +- app/views/projects/index.json.jbuilder | 6 + 4 files changed, 108 insertions(+), 19 deletions(-) diff --git a/api_document.md b/api_document.md index 50a45573..32f31a67 100644 --- a/api_document.md +++ b/api_document.md @@ -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|用户申请的项目签名审核状态, 0: 正在审核,1:已审核| + 返回值 @@ -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": 0 + } + ] }, { "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|用户申请的项目签名审核状态, 0: 正在审核,1:已审核| 返回值 ```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": 0 + } + ] } ] } ``` --- +#### 特殊许可证项目用户创建申请 +``` +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": { + "name": "timg.jpeg" + } +} +``` +--- \ No newline at end of file diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 5b772993..e5680c4a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -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 = diff --git a/app/views/projects/_project_detail.json.jbuilder b/app/views/projects/_project_detail.json.jbuilder index a4606e76..d0fb16e2 100644 --- a/app/views/projects/_project_detail.json.jbuilder +++ b/app/views/projects/_project_detail.json.jbuilder @@ -52,9 +52,10 @@ json.category do 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 + +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 diff --git a/app/views/projects/index.json.jbuilder b/app/views/projects/index.json.jbuilder index 5556cfe2..ff4b44c9 100644 --- a/app/views/projects/index.json.jbuilder +++ b/app/views/projects/index.json.jbuilder @@ -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 From 9eb7219b9a0a34b634cc13924be0c72b3f27708f Mon Sep 17 00:00:00 2001 From: viletyy Date: Fri, 25 Dec 2020 18:58:03 +0800 Subject: [PATCH 3/7] [FIX] --- .../20200927023922_reset_versions_count.rb | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 db/migrate/20200927023922_reset_versions_count.rb diff --git a/db/migrate/20200927023922_reset_versions_count.rb b/db/migrate/20200927023922_reset_versions_count.rb deleted file mode 100644 index 2c121e62..00000000 --- a/db/migrate/20200927023922_reset_versions_count.rb +++ /dev/null @@ -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 From 6c436dd631c8c879607e73770cb06cbb55ea226c Mon Sep 17 00:00:00 2001 From: viletyy Date: Sun, 27 Dec 2020 18:44:03 +0800 Subject: [PATCH 4/7] =?UTF-8?q?[ADD]=E5=90=8E=E5=8F=B0=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E7=89=B9=E6=AE=8A=E8=AE=B8=E5=8F=AF=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_document.md | 18 ++++---- .../admins/apply_signatures_controller.rb | 30 +++++++++++++ .../projects/add_member_interactor.rb | 19 +++++---- app/models/apply_signature.rb | 4 ++ app/models/concerns/project_operable.rb | 4 +- .../admins/apply_signatures/index.html.erb | 7 ++++ .../apply_signatures/shared/_list.html.erb | 42 +++++++++++++++++++ .../admins/projects/shared/_list.html.erb | 2 + app/views/admins/shared/_sidebar.html.erb | 2 + .../apply_signatures/create.json.jbuilder | 2 +- app/views/members/index.json.jbuilder | 1 + .../group_list.json.jbuilder | 21 ++-------- config/routes.rb | 3 +- 13 files changed, 116 insertions(+), 39 deletions(-) create mode 100644 app/controllers/admins/apply_signatures_controller.rb create mode 100644 app/views/admins/apply_signatures/index.html.erb create mode 100644 app/views/admins/apply_signatures/shared/_list.html.erb diff --git a/api_document.md b/api_document.md index 32f31a67..2cbb2431 100644 --- a/api_document.md +++ b/api_document.md @@ -1171,9 +1171,9 @@ http://localhost:3000/api/projects | jq |language |object|项目语言| |-- id |int|项目语言id| |-- name |string|项目语言名称| -|user_apply_signatures |object|用户申请的项目签名| -|-- id |int|用户申请的项目签名id| -|-- status |int|用户申请的项目签名审核状态, 0: 正在审核,1:已审核| +|user_apply_signatures |object|用户创建的特殊许可申请| +|-- id |int|用户创建的特殊许可申请id| +|-- status |int|用户创建的特殊许可申请审核状态, 'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| @@ -1208,7 +1208,7 @@ http://localhost:3000/api/projects | jq "user_apply_signatures":[ { "id": 1, - "status": 0 + "status": "waiting" } ] }, @@ -4015,9 +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|用户申请的项目签名审核状态, 0: 正在审核,1:已审核| +|user_apply_signatures |object|用户创建的特殊许可申请| +|-- id |int|用户创建的特殊许可申请id| +|-- status |int|用户创建的特殊许可申请审核状态, 'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| 返回值 ```json @@ -4050,7 +4050,7 @@ http://localhost:3000/api/users/Jason/projects.json | jq "user_apply_signatures":[ { "id": 1, - "status": 0 + "status": "waiting" } ] } @@ -4091,7 +4091,7 @@ http://localhost:3000/api/apply_signatures.json | jq { "id": 5, "attachment": { - "name": "timg.jpeg" + "filename": "timg.jpeg" } } ``` diff --git a/app/controllers/admins/apply_signatures_controller.rb b/app/controllers/admins/apply_signatures_controller.rb new file mode 100644 index 00000000..c6b0f4c0 --- /dev/null +++ b/app/controllers/admins/apply_signatures_controller.rb @@ -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 \ No newline at end of file diff --git a/app/interactors/projects/add_member_interactor.rb b/app/interactors/projects/add_member_interactor.rb index a3fe9e33..1e17dc45 100644 --- a/app/interactors/projects/add_member_interactor.rb +++ b/app/interactors/projects/add_member_interactor.rb @@ -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 diff --git a/app/models/apply_signature.rb b/app/models/apply_signature.rb index f76bda94..64a9f1f5 100644 --- a/app/models/apply_signature.rb +++ b/app/models/apply_signature.rb @@ -2,5 +2,9 @@ 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 diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index f05ed164..8bb11ffd 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -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 diff --git a/app/views/admins/apply_signatures/index.html.erb b/app/views/admins/apply_signatures/index.html.erb new file mode 100644 index 00000000..cf63c95d --- /dev/null +++ b/app/views/admins/apply_signatures/index.html.erb @@ -0,0 +1,7 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb('特殊许可申请列表') %> +<% end %> + +
+ <%= render partial: 'admins/apply_signatures/shared/list', locals: { apply_signatures: @apply_signatures } %> +
\ No newline at end of file diff --git a/app/views/admins/apply_signatures/shared/_list.html.erb b/app/views/admins/apply_signatures/shared/_list.html.erb new file mode 100644 index 00000000..af0d5848 --- /dev/null +++ b/app/views/admins/apply_signatures/shared/_list.html.erb @@ -0,0 +1,42 @@ + + + + + + + + + + + + <% if apply_signatures.present? %> + <% apply_signatures.each_with_index do |signature, index| %> + + + + + + + + <% end %> + <% else %> + <%= render 'admins/shared/no_data_for_table' %> + <% end %> + +
序号项目名称申请人申请材料操作
<%= list_index_no((params[:page] || 1).to_i, index) %> + <%= link_to(signature&.project&.name, "/projects/#{signature&.project&.owner.login}/#{signature&.project&.identifier}", target: '_blank') %> + + <%= link_to(signature&.user&.real_name, "/users/#{signature&.user&.login}", target: '_blank') %> + + <% 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 %> + + + <%= 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" %> +
+ +<%= render partial: 'admins/shared/paginate', locals: { objects: apply_signatures } %> \ No newline at end of file diff --git a/app/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb index 98683581..fc2cd52c 100644 --- a/app/views/admins/projects/shared/_list.html.erb +++ b/app/views/admins/projects/shared/_list.html.erb @@ -5,6 +5,7 @@ ID 项目名称 公开 + 特殊协议 issue 资源 版本库 @@ -26,6 +27,7 @@ <%= link_to(project.name, "/projects/#{project.owner.login}/#{project.identifier}", target: '_blank') %> <%= project.is_public ? '√' : '' %> + <%= project.is_secret ? '√' : '' %> <%= project.issues.size %> <%= project.attachments.size %> <%= project&.project_score.try(:changeset_num).to_i %> diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index de56a547..c72ce593 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -26,6 +26,8 @@
  • <%= sidebar_item(admins_project_categories_path, '分类列表', icon: 'sitemap', controller: 'admins-project_categories') %>
  • <%= sidebar_item(admins_project_licenses_path, '开源许可证', icon: 'file-text-o', controller: 'admins-project_licenses') %>
  • <%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %>
  • +
  • <%= sidebar_item(admins_apply_signatures_path, '特殊许可申请列表', icon: 'git', controller: 'admins-apply_signatures') %>
  • + <% end %> diff --git a/app/views/apply_signatures/create.json.jbuilder b/app/views/apply_signatures/create.json.jbuilder index acffa1cb..f67d3b39 100644 --- a/app/views/apply_signatures/create.json.jbuilder +++ b/app/views/apply_signatures/create.json.jbuilder @@ -1,4 +1,4 @@ json.id @signature.id json.attachment do - json.name @attachment.filename + json.filename @attachment.filename end diff --git a/app/views/members/index.json.jbuilder b/app/views/members/index.json.jbuilder index 457c5027..40342b52 100644 --- a/app/views/members/index.json.jbuilder +++ b/app/views/members/index.json.jbuilder @@ -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 diff --git a/app/views/project_categories/group_list.json.jbuilder b/app/views/project_categories/group_list.json.jbuilder index 5e0695c1..f13d6ecf 100644 --- a/app/views/project_categories/group_list.json.jbuilder +++ b/app/views/project_categories/group_list.json.jbuilder @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 2adf361b..4234d2e0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - + require 'sidekiq/web' require 'admin_constraint' @@ -772,6 +772,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 From 5447d54d302ff756ab995f596dd9569c61396a3f Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 28 Dec 2020 10:26:50 +0800 Subject: [PATCH 5/7] [FIX] --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index a6e2a994..659e2c3b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -115,7 +115,7 @@ class Project < ApplicationRecord scope :secret_and_visible, -> {joins(:license).where("licenses.is_secret = TRUE OR projects.is_public = TRUE")} - delegate :is_secret, to: :license + delegate :is_secret, to: :license, allow_nil: true def self.search_project(search) From 47cc70f2c520dbdd799810c0a24f40a0318e4d6b Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 28 Dec 2020 12:31:05 +0800 Subject: [PATCH 6/7] =?UTF-8?q?[ADD]=E5=A2=9E=E5=8A=A0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/apply_signatures_controller.rb | 9 +++++++++ app/controllers/projects_controller.rb | 2 +- app/views/admins/projects/shared/_list.html.erb | 2 +- config/routes.rb | 6 +++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 652e5989..cabcb56d 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -1,4 +1,13 @@ class ApplySignaturesController < ApplicationController + include ApplicationHelper + + def template_file + license = License.find_by_name("PHengLET") + 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 diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index e5680c4a..c2486949 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -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 diff --git a/app/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb index fc2cd52c..d4fa5a42 100644 --- a/app/views/admins/projects/shared/_list.html.erb +++ b/app/views/admins/projects/shared/_list.html.erb @@ -24,7 +24,7 @@ <%= list_index_no((params[:page] || 1).to_i, index) %> <%= project.id %> - <%= link_to(project.name, "/projects/#{project.owner.login}/#{project.identifier}", target: '_blank') %> + <%= link_to(project.name, "/projects/#{project.owner&.login}/#{project.identifier}", target: '_blank') %> <%= project.is_public ? '√' : '' %> <%= project.is_secret ? '√' : '' %> diff --git a/config/routes.rb b/config/routes.rb index 4234d2e0..0bca7da2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -59,7 +59,11 @@ Rails.application.routes.draw do delete :destroy_files end end - resources :apply_signatures, only: [:create] + resources :apply_signatures, only: [:create] do + collection do + get :template_file + end + end get 'home/index' get 'home/search' get 'main/first_stamp' From 749cd058c49c010a9eb378de31441d67c25cc6cd Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 28 Dec 2020 12:57:58 +0800 Subject: [PATCH 7/7] [FIX] --- app/controllers/apply_signatures_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index cabcb56d..54f64aa6 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -2,7 +2,7 @@ class ApplySignaturesController < ApplicationController include ApplicationHelper def template_file - license = License.find_by_name("PHengLET") + 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')