dev_forge
Jasder 5 years ago
commit 44dc09b8ba

@ -0,0 +1,38 @@
class ComposeProjectsController < ApplicationController
#未做完
before_action :require_login
before_action :set_compose
def create
project_ids = params[:project_ids]
ComposeProject.transaction do
project_ids.each do |p|
project = Project.select(:id, :user_id).find(p)
unless project.blank? || ComposeProject.exists?(user_id: project.user_id, project_id: p, compose_id: @compose.id)
ComposeProject.create!(user_id: project.user_id, project_id: p, compose_id: @compose.id, position: p)
end
end
end
normal_status(0, "添加成功")
end
def destroy
project_ids = params[:project_ids]
if ComposeProject.where(project_id: project_ids, compose_id: @compose.id).delete_all
normal_status(0, "项目删除成功")
else
normal_status(-1, "项目删除失败")
end
end
private
def set_compose
@compose = Compose.find(params[:compose_id])
unless @compose.present?
normal_status(-1, "组织不存在")
end
end
end

@ -60,11 +60,26 @@ class ComposesController < ApplicationController
end end
def show def show
compose_projects = @compose&.compose_projects&.pluck(:project_id) compose_projects_ids = @compose&.compose_projects&.pluck(:project_id)
if compose_projects.size > 0 search = params[:search]
@compose_projects = Project.where(id: compose_projects) if compose_projects_ids.size > 0
compose_projects = Project.where(id: compose_projects_ids)
if search.present?
compose_projects = compose_projects.where("name like ? ", "%#{search.to_s.strip}%")
end
else else
compose_projects = []
end
@compose_projects_size = compose_projects.size
if @compose_projects_size > 0
@page = params[:page] || 1
@limit = params[:limit] || 15
@compose_projects = compose_projects.page(@page).per(@limit)
else
@compose_projects = compose_projects
end end
end end
@ -75,7 +90,7 @@ class ComposesController < ApplicationController
end end
def find_compose def find_compose
@compose = Compose.find(params[:id]) @compose = Compose.find(params[:compose_id])
unless @compose.present? unless @compose.present?
normal_status(-1, "组织不存在") normal_status(-1, "组织不存在")
end end

@ -0,0 +1,111 @@
class IssueTagsController < ApplicationController
before_action :require_login
before_action :set_project
before_action :check_issue_permission, except: :index
before_action :set_issue_tag, only: [:edit, :update, :destroy]
def index
order_name = params[:order_name] || "created_at"
order_type = params[:order_type] || "desc"
issue_tags = @project.issue_tags.order("#{order_name} #{order_type}")
@page = params[:page] || 1
@limit = params[:limit] || 15
@issue_tags_size = issue_tags.size
@issue_tags = issue_tags.page(@page).per(@limit)
end
def create
title = params[:title].to_s.strip
desc = params[:description]
color = params[:color] || "#ccc"
tag_params = {
title: title,
description: desc,
color: color
}
if title.present?
if IssueTag.exists?(title: title, project_id: @project.id)
normal_status(-1, "标签已存在")
else
issue_tag = IssueTag.new(tag_params.merge(project_id: @project.id, user_id: current_user.id))
if issue_tag.save
normal_status(0, "标签创建成功")
else
normal_status(-1, "标签创建失败")
end
end
else
normal_status(-1, "标签名称不能为空")
end
end
def edit
end
def update
title = params[:title]
desc = params[:description]
color = params[:color] || "#ccc"
tag_params = {
title: title,
description: desc,
color: color
}
if title.present?
if IssueTag.exists?(title: title, project_id: @project.id) && (@issue_tag.title != title)
normal_status(-1, "标签已存在")
else
if @issue_tag.update_attributes(tag_params)
normal_status(0, "标签更新成功")
else
normal_status(-1, "标签更新失败")
end
end
else
normal_status(-1, "标签名称不能为空")
end
end
def destroy
if @issue_tag.destroy
normal_status(0, "标签删除成功")
else
normal_status(-1, "标签删除失败")
end
end
private
def set_project
@project = Project.find_by_id(params[:project_id])
unless @project.present?
normal_status(-1, "项目不存在")
end
end
def check_issue_permission
unless @project.member?(current_user) || current_user.admin?
normal_status(-1, "您没有权限")
end
end
def set_issue_tag
@issue_tag = IssueTag.find_by_id(params[:id])
unless @issue_tag.present?
normal_status(-1, "标签不存在")
end
end
end

@ -0,0 +1,7 @@
class IssuesController < ApplicationController
before_action :require_login
end

@ -0,0 +1,152 @@
class VersionsController < ApplicationController
before_action :require_login
before_action :set_project
before_action :check_issue_permission, except: [:show, :index]
before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status]
def index
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
status = params[:status]
versions = @project.versions.version_includes
if status.present?
versions = versions.where(status: status.to_s.strip)
end
versions = versions.order("#{order_name} #{order_type}")
@page = params[:page] || 1
@limit = params[:limit] || 15
@versions_size = versions.size
@versions = versions.page(@page).per(@limit)
end
def show
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
version_issues = @version.issues.issue_includes.order("#{order_name} #{order_type}")
@close_issues_size = version_issues.where(status_id: 5).size
@page = params[:page] || 1
@limit = params[:limit] || 15
@version_issues_size = version_issues.size
@version_issues = version_issues.page(@page).per(@limit)
end
def create
name = params[:name].to_s.strip
desc = params[:description]
effective_date = params[:effective_date]
status = params[:status] || "open"
sharing = params[:sharing] || ""
wiki_page_title = params[:wiki_page_title] || ""
tag_params = {
name: name,
description: desc,
effective_date: effective_date,
status: status,
sharing: sharing,
wiki_page_title: wiki_page_title
}
if name.present?
if Version.exists?(name: name, project_id: @project.id)
normal_status(-1, "里程碑已存在")
else
version = Version.new(tag_params.merge(project_id: @project.id, user_id: current_user.id))
if version.save
normal_status(0, "里程碑创建成功")
else
normal_status(-1, "里程碑创建失败")
end
end
else
normal_status(-1, "里程碑名称不能为空")
end
end
def edit
end
def update
name = params[:name].to_s.strip
desc = params[:description]
effective_date = params[:effective_date]
status = params[:status] || "open"
sharing = params[:sharing] || ""
wiki_page_title = params[:wiki_page_title] || ""
tag_params = {
name: name,
description: desc,
effective_date: effective_date,
status: status,
sharing: sharing,
wiki_page_title: wiki_page_title
}
if name.present?
if Version.exists?(name: name, project_id: @project.id) && (@version.name != name)
normal_status(-1, "里程碑已存在")
else
if @version.update_attributes(tag_params)
normal_status(0, "里程碑更新成功")
else
normal_status(-1, "里程碑更新失败")
end
end
else
normal_status(-1, "里程碑名称不能为空")
end
end
def destroy
if @version.destroy
normal_status(0, "里程碑删除成功")
else
normal_status(-1, "里程碑删除失败")
end
end
def update_status
status = params[:status] || "open"
all_status = %w(open closed locked)
if all_status.include?(status)
if @version.update_attribute(:status, status)
normal_status(0, "操作成功")
else
normal_status(-1, "操作失败")
end
else
normal_status(-1, "status状态值错误")
end
end
private
def set_project
@project = Project.find_by_id(params[:project_id])
unless @project.present?
normal_status(-1, "项目不存在")
end
end
def check_issue_permission
unless @project.member?(current_user) || current_user.admin?
normal_status(-1, "您没有权限")
end
end
def set_version
@version = Version.find_by_id(params[:id])
unless @version.present?
normal_status(-1, "里程碑不存在")
end
end
end

@ -0,0 +1,23 @@
module IssuesHelper
def issue_status
{
"新增": "1",
"正在解决": "2",
"已解决": "3",
"反馈": "4",
"关闭": "5",
"拒绝": "6"
}
end
def version_status
{
"开启": "open",
"关闭": "closed",
"锁定": "locked"
}
end
end

@ -1,4 +1,5 @@
class Compose < ApplicationRecord class Compose < ApplicationRecord
#组织
belongs_to :user belongs_to :user
has_many :compose_projects has_many :compose_projects
has_many :compose_users has_many :compose_users
@ -8,3 +9,4 @@ class Compose < ApplicationRecord
scope :compose_includes, ->{includes(:compose_projects, :compose_users, :user)} scope :compose_includes, ->{includes(:compose_projects, :compose_users, :user)}
end end

@ -1,3 +1,4 @@
class ComposeProject < ApplicationRecord class ComposeProject < ApplicationRecord
#组织的项目记录表
belongs_to :compose belongs_to :compose
end end

@ -1,3 +1,13 @@
class Issue < ApplicationRecord class Issue < ApplicationRecord
belongs_to :project belongs_to :project
belongs_to :tracker
belongs_to :issue_tag, foreign_key: :priority_id
belongs_to :version, foreign_key: :fixed_version_id
belongs_to :user,optional: true
scope :issue_includes, ->{includes(:user)}
def get_assign_user
User.select(:login, :lastname,:firstname, :nickname)&.find_by_id(self.assigned_to_id)
end
end end

@ -0,0 +1,4 @@
class IssueTag < ApplicationRecord
has_many :issues
belongs_to :projects, optional: true
end

@ -9,6 +9,7 @@ class Project < ApplicationRecord
has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member' has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member'
has_one :project_score, dependent: :destroy has_one :project_score, dependent: :destroy
has_one :repository, dependent: :destroy has_one :repository, dependent: :destroy
has_many :issue_tags
has_many :issues has_many :issues
has_many :user_grades, dependent: :destroy has_many :user_grades, dependent: :destroy

@ -0,0 +1,3 @@
class Tracker < ApplicationRecord
has_many :issues
end

@ -51,6 +51,7 @@ class User < ApplicationRecord
has_many :study_shixuns, through: :myshixuns, source: :shixun # 已学习的实训 has_many :study_shixuns, through: :myshixuns, source: :shixun # 已学习的实训
has_many :course_messages has_many :course_messages
has_many :courses, foreign_key: 'tea_id', dependent: :destroy has_many :courses, foreign_key: 'tea_id', dependent: :destroy
has_many :versions
#试卷 #试卷
has_many :exercise_banks, :dependent => :destroy has_many :exercise_banks, :dependent => :destroy

@ -1,3 +1,20 @@
class Version < ApplicationRecord class Version < ApplicationRecord
belongs_to :project belongs_to :project
has_many :issues, class_name: "Issue", foreign_key: "fixed_version_id"
belongs_to :user, optional: true
scope :version_includes, ->{includes(:issues, :user)}
def open_issues_count
issues.select(:id,:status_id).where(status_id: [1,2,3,4,6]).size
end
def close_issues_count
issues.select(:id,:status_id).where(status_id: 5).size
end
def version_user
User.select(:login, :lastname,:firstname, :nickname)&.find_by_id(self.user_id)
end
end end

@ -0,0 +1,11 @@
json.extract! @compose, :id, :title,:description,:show_mode,:compose_mode, :compose_users_count, :compose_projects_count
if @compose_projects_size > 0
json.compose_projects do
json.array! @compose_projects do |project|
json.extract! project, :id, :name,:description,:project_type,:user_id, :forked_count, :visits,:project_category_id, :project_language_id
json.updated_at format_time(project.updated_on)
end
end
else
json.compose_projects []
end

@ -0,0 +1 @@
json.extract! @issue_tag, :id, :title, :description, :color,:project_id

@ -0,0 +1,7 @@
json.issue_tags_count @issue_tags_size
json.issue_tags do
json.array! @issue_tags.each.to_a do |tag|
json.extract! tag, :id, :title, :description, :color, :issues_count, :project_id
end
end

@ -0,0 +1 @@
json.extract! @version, :id,:name,:project_id,:description, :effective_date, :status, :sharing,:wiki_page_title

@ -0,0 +1,13 @@
json.versions_count @versions_size
json.versions do
json.array! @versions.each.to_a do |version|
json.extract! version, :id, :name, :description, :effective_date,:status
json.open_issues_count version.open_issues_count
json.close_issues_count version.close_issues_count
json.created_at format_time(version.created_on)
json.updated_at format_time(version.updated_on)
json.user_name version.version_user.try(:show_real_name)
json.user_login version.version_user.try(:login)
end
end

@ -0,0 +1,27 @@
json.issues_count @version_issues_size
json.close_issues_count @close_issues_size
json.user_name @version.version_user.try(:show_real_name)
json.user_login @version.version_user.try(:login)
json.created_at format_time(@version.created_on)
json.updated_at format_time(@version.updated_on)
json.extract! @version, :id,:name,:project_id,:description, :effective_date, :status, :sharing,:wiki_page_title
json.issues do
json.array! @version_issues.each.to_a do |issue|
user = issue.get_assign_user
json.id issue.id
json.name issue.subject
json.project_id issue.project_id
json.estimated_hours issue.estimated_hours.to_f
json.tracker issue.tracker.try(:name)
json.assign_user_name user.try(:show_real_name)
json.assign_user_login user.try(:login)
json.updated_at format_time(issue.updated_on)
json.status issue_status.key(issue.status_id.to_s)
json.done_ratio "#{issue.done_ratio.to_s}%"
end
end

@ -12,7 +12,9 @@ Rails.application.routes.draw do
resources :edu_settings resources :edu_settings
scope '/api' do scope '/api' do
resources :composes resources :composes do
resources :compose_projects, only: [:create, :destroy]
end
get 'home/index' get 'home/index'
get 'home/search' get 'home/search'
@ -31,6 +33,12 @@ Rails.application.routes.draw do
resources :licenses, only: [:index, :show] resources :licenses, only: [:index, :show]
resources :projects, only: [:index, :create, :show] do resources :projects, only: [:index, :create, :show] do
resources :issue_tags, only: [:create, :edit, :update, :destroy, :index]
resources :versions do
member do
post :update_status
end
end
collection do collection do
post :migrate post :migrate
end end

@ -0,0 +1,14 @@
class CreateIssueTags < ActiveRecord::Migration[5.2]
def change
create_table :issue_tags do |t|
t.string :title
t.string :description
t.string :color
t.integer :user_id
t.integer :project_id
t.integer :issues_count,default: 0
t.timestamps
end
add_index :issue_tags, [:user_id, :title,:project_id]
end
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe IssueTag, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save