2013-10-31 10:57:46 +08:00
# Redmine - project management software
# Copyright (C) 2006-2013 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2015-01-30 13:29:25 +08:00
# Time 2015-01-28 16:34:21
# Author lizanle
# Description 封装代码,简化代码,格式化代码,
2013-10-31 10:57:46 +08:00
class ProjectsController < ApplicationController
2016-10-31 15:14:52 +08:00
layout 'base_projects'
2015-02-06 18:15:08 +08:00
before_filter :authorize1 , :only = > [ :show ]
2015-02-03 09:52:35 +08:00
menu_item :overview , :only = > :show
2013-10-31 10:57:46 +08:00
menu_item :roadmap , :only = > :roadmap
menu_item :settings , :only = > :settings
2014-03-29 10:47:37 +08:00
menu_item :homework , :only = > [ :homework , :new_homework ]
2013-12-11 10:00:38 +08:00
menu_item :feedback , :only = > :feedback
2015-02-03 09:52:35 +08:00
menu_item :share , :only = > :share
2013-10-31 10:57:46 +08:00
2015-01-30 09:57:43 +08:00
before_filter :find_project , :except = > [ :index , :search , :list , :new , :create , :copy , :statistics , :new_join , :course , :enterprise_course , :course_enterprise , :view_homework_attaches , :join_project ]
2014-05-28 18:04:16 +08:00
before_filter :authorize , :only = > [ :show , :settings , :edit , :sort_project_members , :update , :modules , :close , :reopen , :view_homework_attaches , :course ]
2014-05-21 14:44:53 +08:00
before_filter :authorize_global , :only = > [ :new , :create , :view_homework_attaches ]
2015-12-11 15:39:38 +08:00
before_filter :require_admin , :only = > [ :copy , :unarchive , :destroy , :calendar ]
2015-05-19 16:11:22 +08:00
before_filter :file , :statistics #:watcherlist
2014-05-19 16:12:06 +08:00
# 除非项目内人员,不可查看成员, TODO: 完了写报表里去
2015-09-15 17:39:57 +08:00
# before_filter :memberAccess, only: :member
2014-05-19 16:12:06 +08:00
2015-01-30 13:29:25 +08:00
# accept_rss_auth :index
2013-10-31 10:57:46 +08:00
accept_api_auth :index , :show , :create , :update , :destroy
after_filter :only = > [ :create , :edit , :update , :archive , :unarchive , :destroy ] do | controller |
if controller . request . post?
controller . send :expire_action , :controller = > 'welcome' , :action = > 'robots'
end
end
2016-10-19 15:18:26 +08:00
2013-10-31 10:57:46 +08:00
helper :bids
include BidsHelper
2014-04-03 17:26:56 +08:00
helper :contests
include ContestsHelper
2013-10-31 10:57:46 +08:00
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :issues
helper :queries
include QueriesHelper
helper :repositories
include RepositoriesHelper
include ProjectsHelper
helper :members
helper :activities
helper :documents
helper :watchers
# helper :watcherlist
2013-12-30 16:03:28 +08:00
helper :words
2014-08-05 16:39:33 +08:00
helper :project_score
2014-08-13 11:17:22 +08:00
helper :user_score
2016-03-02 17:46:10 +08:00
include UsersHelper
2013-10-31 10:57:46 +08:00
### added by william
include ActsAsTaggableOn :: TagsHelper
2015-11-12 09:32:00 +08:00
#查找组织
def search_public_orgs_not_in_project
condition = '%%'
if ! params [ :name ] . nil?
condition = " % #{ params [ :name ] . strip } % " . gsub ( " " , " " )
end
2015-12-17 10:01:28 +08:00
limit = 15
2016-01-04 15:12:38 +08:00
project_org_ids = OrgProject . find_by_sql ( " select distinct organization_id from org_projects where project_id = #{ params [ :id ] } " ) . map ( & :organization_id ) << 0
@orgs_not_in_project = User . current . organizations . where ( " organizations.id not in ( #{ project_org_ids . join ( ',' ) } ) and organizations.name like ? " , condition ) . page ( params [ :page ] . to_i || 1 ) . per ( limit )
@org_count = User . current . organizations . where ( " organizations.id not in ( #{ project_org_ids . join ( ',' ) } ) and organizations.name like ' #{ condition } ' " ) . count
# if project_org_ids.empty?
# @orgs_not_in_project = Organization.where("(is_public or creator_id =?) = 1 and name like ?",User.current.id, condition).page((params[:page].to_i || 1)).per(limit)
# @org_count = Organization.where("is_public = 1 or creator_id =?", User.current.id).where("name like ?", condition).count
# else
# project_org_ids = "(" + project_org_ids.join(',') + ")"
# @orgs_not_in_project = Organization.where("id not in #{project_org_ids} and (is_public = 1 or creator_id =?) and name like ?", User.current.id, condition).page((params[:page].to_i || 1)).per(limit)
# @org_count = Organization.where("id not in #{project_org_ids} and (is_public = 1 or creator_id =?)", User.current.id).where("name like ?", condition).count
# end
2015-12-17 10:01:28 +08:00
@orgs_page = Paginator . new @org_count , limit , params [ :page ]
2015-11-18 16:52:03 +08:00
@no_roll_hint = params [ :hint_flag ]
2015-11-12 14:55:31 +08:00
#render :json => {:orgs => @orgs_not_in_project, :count => @org_count}.to_json
respond_to do | format |
format . js
2015-11-12 09:32:00 +08:00
end
end
2013-10-31 10:57:46 +08:00
def index
2014-11-21 16:59:58 +08:00
render_404
2013-10-31 10:57:46 +08:00
end
2016-06-27 11:09:25 +08:00
def courserender_404
2013-10-31 10:57:46 +08:00
end
2014-03-21 16:46:30 +08:00
2015-01-30 13:29:25 +08:00
# Time 2015-01-29 11:19:11
# Author lizanle
# Description 项目搜索方法
2014-03-21 16:46:30 +08:00
def search
2015-01-30 13:29:25 +08:00
# 如果有名字,就按名字搜索,如果没有,就展示所有,用Karminari分页
2014-05-14 15:22:08 +08:00
if params [ :name ] . present?
2015-01-30 13:29:25 +08:00
@project_pages = Project . project_entities . visible . like ( params [ :name ] ) . page ( params [ :page ] ) . per ( 10 )
2014-04-29 10:36:09 +08:00
else
2015-01-30 13:29:25 +08:00
@project_pages = Project . project_entities . visible . page ( params [ :page ] ) . per ( 10 )
2014-04-29 10:36:09 +08:00
end
2015-01-30 13:29:25 +08:00
@projects = @project_pages . order ( " created_on desc " )
2015-08-12 11:28:51 +08:00
@limit = 10 #per_page_option
@project_count = Project . project_entities . visible . like ( params [ :name ] ) . page ( params [ :page ] ) . count
@project_pages = Paginator . new @project_count , @limit , params [ 'page' ]
2015-08-25 18:59:45 +08:00
@name = params [ :name ]
@type = 'projects'
2013-10-31 10:57:46 +08:00
respond_to do | format |
format . html {
render :layout = > 'base'
scope = Project
unless params [ :closed ]
2015-01-30 13:29:25 +08:00
scope = scope . active
2013-10-31 10:57:46 +08:00
end
}
2015-01-30 13:29:25 +08:00
# 需要到处atom使用的格式 ( redmine自带)
2013-10-31 10:57:46 +08:00
format . atom {
projects = Project . visible . order ( 'created_on DESC' ) . limit ( Setting . feeds_limit . to_i ) . all
render_feed ( projects , :title = > " #{ Setting . app_title } : #{ l ( :label_project_latest ) } " )
}
end
end
2015-01-30 13:29:25 +08:00
# Time 2015-01-29 16:13:20
# Author lizanle
# Description 项目首页中用户反馈 方法
2013-10-31 10:57:46 +08:00
def feedback
2015-01-30 13:29:25 +08:00
@page = params [ :page ] . to_i
2014-03-22 09:24:59 +08:00
# Find the page of the requested reply
2014-01-02 17:29:46 +08:00
@jours = @project . journals_for_messages . where ( 'm_parent_id IS NULL' ) . order ( 'created_on DESC' )
2015-01-30 13:29:25 +08:00
limit = 10
2014-08-21 08:58:48 +08:00
offset = @jours . count ( :conditions = > [ " #{ JournalsForMessage . table_name } .id > ? " , params [ :r ] . to_i ] )
2015-01-30 13:29:25 +08:00
page = 1 + offset / limit
2014-08-21 08:58:48 +08:00
if params [ :r ] && @page . nil?
2015-01-30 13:29:25 +08:00
@page = @page < 0 ? 1 : @page
2014-08-21 08:58:48 +08:00
end
2015-01-30 13:29:25 +08:00
@page = @page > page ? page : @page
2014-11-05 09:51:30 +08:00
@jour = paginateHelper @jours , 10
2013-10-31 10:57:46 +08:00
@state = false
2013-11-07 11:02:32 +08:00
respond_to do | format |
2015-01-30 13:29:25 +08:00
format . html
2013-11-07 11:02:32 +08:00
format . api
end
2013-10-31 10:57:46 +08:00
end
def project_respond
2013-12-29 19:35:52 +08:00
project_id = request . headers [ " Referer " ] . match ( ( %r|/([0-9]{1,})/| ) ) [ 1 ]
parent_id = params [ :reference_id ]
author_id = User . current . id
reply_user_id = params [ :reference_user_id ]
reply_id = params [ :reference_message_id ]
content = params [ :project_respond ]
options = { :user_id = > author_id ,
:m_parent_id = > parent_id ,
:m_reply_id = > reply_id ,
:reply_id = > reply_user_id ,
:notes = > content ,
:is_readed = > false }
2013-10-31 10:57:46 +08:00
2013-12-30 08:47:45 +08:00
@jfm = Project . add_new_jour ( nil , nil , project_id , options )
2013-12-30 20:53:48 +08:00
@save_succ = @jfm . errors . empty?
2013-12-29 19:35:52 +08:00
2013-10-31 10:57:46 +08:00
respond_to do | format |
2013-12-30 08:47:45 +08:00
format . js
2013-10-31 10:57:46 +08:00
end
end
def new
2015-07-27 18:15:05 +08:00
if User . current . login?
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
2015-09-23 17:36:36 +08:00
render :layout = > 'new_base'
2015-07-27 18:15:05 +08:00
else
redirect_to signin_url
end
2013-10-31 10:57:46 +08:00
end
def share
@shares = @project . shares . reverse
@base_courses_tag = @project . project_type
respond_to do | format |
format . html { render :layout = > 'base_courses' if @base_courses_tag == 1 }
format . api
end
end
2016-01-14 12:52:44 +08:00
# 注意: 修改该方法的时候注意同步修改forked方法
# forked方法也会创建项目
2014-07-14 14:49:05 +08:00
def create
2015-07-27 18:15:05 +08:00
unless User . current . login?
redirect_to signin_url
return
end
2013-10-31 10:57:46 +08:00
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
2015-03-05 11:53:28 +08:00
@project . organization_id = params [ :organization_id ]
2015-03-11 15:51:25 +08:00
@project . user_id = User . current . id
2015-09-24 11:19:07 +08:00
@project . project_new_type = params [ :project_new_type ]
2015-09-24 16:38:36 +08:00
params [ :project ] [ :is_public ] ? @project . is_public = 1 : @project . is_public = 0
2014-07-28 09:22:52 +08:00
if validate_parent_id && @project . save
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
# Add current user as a project member if he is not admin
#unless User.current.admin?
r = Role . givable . find_by_id ( Setting . new_project_user_role_id . to_i ) || Role . givable . first
m = Member . new ( :user = > User . current , :roles = > [ r ] )
2016-01-14 12:52:44 +08:00
# project's score
if ProjectScore . where ( " project_id=? " , @project . id ) . first . nil?
ProjectScore . create ( :project_id = > @project . id , :score = > false )
end
# end
2014-07-28 09:22:52 +08:00
project_info = ProjectInfo . new ( :user_id = > User . current . id , :project_id = > @project . id )
user_grades = UserGrade . create ( :user_id = > User . current . id , :project_id = > @project . id )
Rails . logger . debug " UserGrade created: #{ user_grades . to_json } "
2014-08-06 11:46:38 +08:00
#if params[:project][:is_public] == '1'
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > 0 , :changesets_count = > 0 , :project_type = > @project . project_type , :grade = > 0 )
2014-07-28 09:22:52 +08:00
Rails . logger . debug " ProjectStatus created: #{ project_status . to_json } "
2014-08-06 11:46:38 +08:00
#end
2014-07-28 09:22:52 +08:00
@project . members << m
@project . project_infos << project_info
2016-07-28 17:26:57 +08:00
p = Project . find ( " #{ @project . id } " )
ps = ProjectsService . new
ps . send_wechat_create_project_notice User . current , p
2014-07-28 09:22:52 +08:00
#end
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_create )
if params [ :continue ]
attrs = { :parent_id = > @project . parent_id } . reject { | k , v | v . nil? }
2014-10-15 09:54:54 +08:00
redirect_to new_project_url ( attrs , :course = > '0' )
2013-10-31 10:57:46 +08:00
else
2014-10-15 09:54:54 +08:00
redirect_to settings_project_url ( @project )
2013-10-31 10:57:46 +08:00
end
2014-07-28 09:22:52 +08:00
}
format . api { render :action = > 'show' , :status = > :created , :location = > url_for ( :controller = > 'projects' , :action = > 'show' , :id = > @project . id ) }
2015-09-15 16:11:55 +08:00
format . js
2013-10-31 10:57:46 +08:00
end
else
2014-07-28 09:22:52 +08:00
respond_to do | format |
2015-09-23 17:36:36 +08:00
format . html { render :action = > 'new' , :layout = > 'new_base' } #Added by young
2014-07-28 09:22:52 +08:00
format . api { render_validation_errors ( @project ) }
end
2013-10-31 10:57:46 +08:00
end
end
def copy
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@source_project = Project . find ( params [ :id ] )
if request . get?
@project = Project . copy_from ( @source_project )
@project . identifier = Project . next_identifier if Setting . sequential_project_identifiers?
else
Mailer . with_deliveries ( params [ :notifications ] == '1' ) do
@project = Project . new
@project . safe_attributes = params [ :project ]
if validate_parent_id && @project . copy ( @source_project , :only = > params [ :only ] )
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
flash [ :notice ] = l ( :notice_successful_create )
2014-10-15 09:54:54 +08:00
redirect_to settings_project_url ( @project )
2013-10-31 10:57:46 +08:00
elsif ! @project . new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
2014-10-15 09:54:54 +08:00
redirect_to settings_project_url ( @project )
2013-10-31 10:57:46 +08:00
end
end
end
rescue ActiveRecord :: RecordNotFound
# source_project not found
render_404
end
2015-01-30 13:29:25 +08:00
# Time 2015-01-29 10:42:00
# Author lizanle
# Description 项目动态展示方法,删除了不必要的代码
2013-10-31 10:57:46 +08:00
def show
2016-10-10 10:41:41 +08:00
# 顶部导航
@project_menu_type = 1
2015-09-21 14:28:22 +08:00
# 更新消息为已读
update_message_status ( User . current , @project )
2016-03-22 12:42:53 +08:00
# over
2013-10-31 10:57:46 +08:00
if params [ :jump ] && redirect_to_project_menu_item ( @project , params [ :jump ] )
2015-01-30 13:29:25 +08:00
return
2013-10-31 10:57:46 +08:00
end
2016-06-27 11:09:25 +08:00
2015-01-30 13:29:25 +08:00
@author = params [ :user_id ] . blank? ? nil : User . active . find ( params [ :user_id ] )
2015-12-04 10:59:09 +08:00
@page = params [ :page ] ? params [ :page ] . to_i + 1 : 0
2015-01-30 13:29:25 +08:00
# 根据私密性,取出符合条件的所有数据
if User . current . member_of? ( @project ) || User . current . admin?
2015-12-04 10:59:09 +08:00
case params [ :type ]
when nil
2016-07-21 18:08:13 +08:00
@events_pages = ForgeActivity . where ( " project_id = ? and forge_act_type in ('Issue', 'Message','News', 'Project', 'Attachment','Commit') " , @project ) . includes ( :forge_act ) . order ( " updated_at desc " ) . limit ( 10 ) . offset ( @page * 10 )
2015-12-04 10:59:09 +08:00
when 'issue'
2016-03-24 09:36:46 +08:00
@events_pages = ForgeActivity . where ( " project_id = ? and forge_act_type = 'Issue' " , @project ) . includes ( :forge_act ) . order ( " updated_at desc " ) . limit ( 10 ) . offset ( @page * 10 )
2015-12-04 10:59:09 +08:00
when 'news'
2016-03-24 09:36:46 +08:00
@events_pages = ForgeActivity . where ( " project_id = ? and forge_act_type = 'News' " , @project ) . includes ( :forge_act ) . order ( " updated_at desc " ) . limit ( 10 ) . offset ( @page * 10 )
2015-12-04 10:59:09 +08:00
when 'message'
2016-03-24 09:36:46 +08:00
@events_pages = ForgeActivity . where ( " project_id = ? and forge_act_type = 'Message' " , @project ) . includes ( :forge_act ) . order ( " updated_at desc " ) . limit ( 10 ) . offset ( @page * 10 )
2016-03-17 16:36:57 +08:00
when 'attachment'
2016-03-24 09:36:46 +08:00
@events_pages = ForgeActivity . where ( " project_id = ? and forge_act_type = 'Attachment' " , @project ) . includes ( :forge_act ) . order ( " updated_at desc " ) . limit ( 10 ) . offset ( @page * 10 )
2015-12-04 10:59:09 +08:00
end
2014-07-14 11:31:24 +08:00
else
2016-03-24 09:36:46 +08:00
@events_pages = ForgeActivity . includes ( :project ) . where ( " forge_activities.project_id = ? and projects.is_public = ? and forge_act_type != ? " , @project , 1 , " Document " ) . order ( " created_at desc " ) . page ( params [ 'page' || 1 ] ) . per ( 10 ) ;
2014-07-14 11:31:24 +08:00
end
2016-10-28 11:04:12 +08:00
@type = params [ :type ]
2016-07-21 18:08:13 +08:00
# 版本库统计图
2016-09-18 15:55:22 +08:00
# unless @project.gpid.nil? || @project.project_score.changeset_num == 0
# # rep_statics_commit = @project.rep_statics.order("commits_num desc")
# rep_statics_commit = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by commits_num desc limit 10")
# rep_statics_code = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by changeset desc limit 10")
# # rep_statics_code = @project.rep_statics.sort_by {|u| u.changeset}.reverse
# @a_uname = rep_statics_commit.map {|s| s.uname }
# @a_uname_code = rep_statics_code.map {|s| s.uname }
# @a_commits_num = rep_statics_commit.map {|s| s.commits_num.to_i }
# @a_commits_add = rep_statics_code.map {|s| s.add.to_i }
# @a_commits_del = rep_statics_code.map {|s| s.del.to_i }
# @a_commits_changeset = rep_statics_code.map {|s| s.changeset.to_i }
# g = Gitlab.client
# begin
# gid = @project.gpid
# g_project = g.project(gid)
# g_branch = g_project.default_branch.to_s
# rescue =>e
# logger.error("get default branch failed: " + e)
# end
# @rev = g_branch.nil? ? "master" : g_branch
# end
2015-01-30 13:29:25 +08:00
# 根据对应的请求,返回对应的数据
2013-10-31 10:57:46 +08:00
respond_to do | format |
2015-01-30 13:29:25 +08:00
format . html
2013-10-31 10:57:46 +08:00
format . api
2015-03-06 14:55:21 +08:00
format . js
2013-10-31 10:57:46 +08:00
end
end
def settings
2016-10-10 10:41:41 +08:00
# 顶部导航
2016-10-19 10:01:14 +08:00
@project_menu_type = 10
2016-10-10 10:41:41 +08:00
2015-09-09 10:15:05 +08:00
# 修改查看消息状态
applied_messages = ForgeMessage . where ( " user_id =? and project_id =? and forge_message_type =? and viewed =? " , User . current . id , @project , " AppliedProject " , 0 )
2016-10-12 16:09:17 +08:00
applied_messages . update_all ( :viewed = > true )
2013-10-31 10:57:46 +08:00
@issue_custom_fields = IssueCustomField . sorted . all
@issue_category || = IssueCategory . new
@member || = @project . members . new
@trackers = Tracker . sorted . all
@wiki || = @project . wiki
2015-04-16 09:49:03 +08:00
@select_tab = params [ :tab ]
2015-04-16 14:59:05 +08:00
2015-11-12 09:32:00 +08:00
#找出所有不属于项目的公共组织
project_org_ids = OrgProject . find_by_sql ( " select distinct organization_id from org_projects where project_id = #{ @project . id } " )
if project_org_ids . empty?
@orgs_not_in_project = Organization . where ( " is_public = 1 " )
else
project_org_ids = " ( " + project_org_ids . join ( ',' ) + " ) "
@orgs_not_in_project = Organization . where ( " id not in #{ project_org_ids } and is_public = 1 " )
end
2016-10-25 11:11:25 +08:00
# 里程碑
@versions = @project . shared_versions . sort
2015-11-12 09:32:00 +08:00
2015-04-16 15:08:46 +08:00
# 处理从新建版本库返回来的错误信息
2015-04-16 14:59:05 +08:00
if ! params [ :repository_error_message ] . to_s . blank?
html = " "
errors = params [ :repository_error_message ] . flatten
errors . each do | error |
2015-04-16 15:08:46 +08:00
# 版本库路径为空的错误信息不予提示
2015-04-16 14:59:05 +08:00
if ( error! = l ( :label_repository_path_not_null ) )
html << error << " ; "
end
end
if params [ :repository ] == " pswd_is_null "
2015-04-17 12:00:47 +08:00
html << l ( :label_password_not_null )
2015-04-16 14:59:05 +08:00
end
2015-09-08 17:31:16 +08:00
flash . now [ :error ] = html if ! html . to_s . blank?
2015-04-16 14:59:05 +08:00
end
2016-03-09 13:17:37 +08:00
# for: 设置默认分支
2016-10-12 16:09:17 +08:00
@gitlab_repository = Repository . where ( :project_id = > @project , :type = > " Repository::Gitlab " ) . first
unless @gitlab_repository . nil?
gitlab_address = Redmine :: Configuration [ 'gitlab_address' ]
2016-10-12 17:02:51 +08:00
creator = @project . owner . try ( :login )
@repos_url = gitlab_address + " / " + creator + " / " + @gitlab_repository . identifier + " . " + " git "
2016-10-12 16:09:17 +08:00
end
2016-02-26 19:25:12 +08:00
scm = params [ :repository_scm ] || ( Redmine :: Scm :: Base . all & Setting . enabled_scm ) . first
@repository = Repository . factory ( scm )
@repository . is_default = @project . repository . nil?
@repository . project = @project
2016-09-28 16:04:53 +08:00
@gitlab_rep = Repository . where ( :type = > " Repository::Gitlab " , :project_id = > @project ) . first
2016-02-26 19:25:12 +08:00
unless @project . gpid . nil?
g = Gitlab . client
@gitlab_branches = g . branches ( @project . gpid )
2016-06-20 14:21:40 +08:00
@branch_names = @gitlab_branches . map { | b | b . name }
2016-02-26 19:25:12 +08:00
@gitlab_default_branch = g . project ( @project . gpid ) . default_branch
end
2013-10-31 10:57:46 +08:00
end
2015-09-16 10:49:34 +08:00
# 项目邀请用户加入实现过程
2015-04-30 11:08:36 +08:00
# 两种情况: 1、系统外用户; 2、系统内用户 (通过邮件判定)
2015-03-07 10:52:20 +08:00
def send_mail_to_member
2015-09-15 10:50:58 +08:00
# 该邮箱未注册过
2015-03-12 15:13:41 +08:00
if ! params [ :mail ] . blank? && User . find_by_mail ( params [ :mail ] . to_s ) . nil?
2015-09-15 17:39:57 +08:00
if ! User . where ( " login =? " , params [ :mail ] ) . first . nil?
2015-09-16 11:09:10 +08:00
# 用户名唯一,用户修改邮箱,未修改用户名,用户名等同邮箱的情况,默认改用户已经注册
user = User . find_by_login ( params [ :mail ] . to_s )
if ! user . member_of? ( @project )
# 如果已经邀请过该用户,则不重复发送
if InviteList . where ( " project_id =? and mail =? " , @project . id , params [ :mail ] . to_s ) . first . nil?
email = params [ :mail ]
Mailer . request_member_to_project ( email , @project , User . current ) . deliver
flash [ :notice ] = l ( :notice_email_sent , :value = > email )
else
flash [ :error ] = l ( :notice_email_invited )
end
else
flash [ :error ] = l ( :label_member_of_project , :value = > email )
end
2015-09-15 17:39:57 +08:00
else
email = params [ :mail ]
2015-10-09 10:33:10 +08:00
first_name = params [ :first_name ]
last_name = params [ :last_name ]
gender = params [ :gender ]
Mailer . send_invite_in_project ( email , @project , User . current , first_name , last_name , gender ) . deliver
2015-09-15 17:39:57 +08:00
@is_zhuce = false
flash [ :notice ] = l ( :notice_email_sent , :value = > email )
end
2015-09-16 17:25:06 +08:00
# 邮箱地址已被注册
2015-04-30 11:08:36 +08:00
elsif ! User . find_by_mail ( params [ :mail ] . to_s ) . nil?
user = User . find_by_mail ( params [ :mail ] . to_s )
if ! user . member_of? ( @project )
2015-09-15 17:39:57 +08:00
# 如果已经邀请过该用户,则不重复发送
2015-09-16 17:25:06 +08:00
invite_list = InviteList . where ( " project_id =? and mail =? " , @project . id , params [ :mail ] . to_s ) . first
if invite_list . nil?
2015-09-15 17:39:57 +08:00
email = params [ :mail ]
Mailer . request_member_to_project ( email , @project , User . current ) . deliver
flash [ :notice ] = l ( :notice_email_sent , :value = > email )
else
2015-09-18 15:25:45 +08:00
# 已经发送过了, 则隔3小时才能再次发送
2015-09-16 17:25:06 +08:00
if Time . now - invite_list . created_at > 10800
email = params [ :mail ]
Mailer . request_member_to_project ( email , @project , User . current ) . deliver
flash [ :notice ] = l ( :notice_email_sent , :value = > email )
else
flash [ :error ] = l ( :notice_email_invited )
end
2015-09-15 17:39:57 +08:00
end
2015-04-30 11:08:36 +08:00
else
flash [ :error ] = l ( :label_member_of_project , :value = > email )
end
2015-03-07 16:07:48 +08:00
else
@is_zhuce = true
end
respond_to do | format |
2015-03-12 18:04:12 +08:00
format . html { redirect_to invite_members_by_mail_project_url ( @project ) }
2015-03-07 10:52:20 +08:00
end
end
2015-04-30 11:08:36 +08:00
2015-09-16 10:49:34 +08:00
# 发送邮件邀请新用户页面对应方法
2015-03-06 14:55:21 +08:00
def invite_members_by_mail
2015-06-03 18:11:52 +08:00
if User . current . member_of? ( @project ) || User . current . admin?
2015-09-17 12:59:52 +08:00
@inviter_lists = InviteList . where ( project_id : @project . id ) . order ( " created_at desc " )
2015-09-16 17:25:06 +08:00
# @inviters = []
# @waiters = []
# unless @inviter_lists.blank?
# @inviter_lists.each do|inviter_list|
# unless inviter_list.user.nil?
# if inviter_list.user.member_of?(@project)
# @inviters << inviter_list.user
# @inviters_count = @inviters.size
# else
# @waiters << inviter_list.user
# @waiters_count = @waiters.size
# end
# end
# end
# end
2015-03-11 16:42:02 +08:00
@is_zhuce = false
respond_to do | format |
format . html
format . js
end
else
render_403
2015-03-07 10:52:20 +08:00
end
2015-03-06 14:55:21 +08:00
end
# 邀请Trustie注册用户
2015-09-16 17:35:26 +08:00
# def invite_members
# if User.current.member_of?(@project) || User.current.admin?
# @member ||= @project.members.new
# respond_to do |format|
# format.html
# end
# else
# render_403
# end
# end
2015-03-06 14:55:21 +08:00
2013-10-31 10:57:46 +08:00
def edit
end
2016-01-13 15:17:13 +08:00
def set_public_or_private
@project = Project . find ( params [ :id ] )
if @project . is_public?
@project . update_attribute ( :is_public , 0 )
else
@project . update_attribute ( :is_public , 1 )
end
end
2016-11-08 10:23:02 +08:00
2015-01-30 13:29:25 +08:00
# include CoursesHelper
2013-10-31 10:57:46 +08:00
def member
2015-09-18 23:18:15 +08:00
# 消息"同意加入项目"
if params [ :message_id ]
message_invite ( params [ :message_id ] , params [ :key ] )
end
2015-09-21 14:28:22 +08:00
update_message_status ( User . current , @project )
2015-05-29 16:04:21 +08:00
# params[:login]为邮箱邀请用户加入,主要功能:
# 1、自动注册
# 2、加入项目、创建角色
# 3、用户得分
if params [ :mail ]
2015-06-16 11:11:59 +08:00
userid = Token . find_by_value ( params [ :token ] ) . user_id
user = User . find ( userid )
2015-05-29 16:04:21 +08:00
user . activate!
2015-06-16 11:11:59 +08:00
Member . create ( :role_ids = > [ 4 ] , :user_id = > userid , :project_id = > params [ :id ] )
UserGrade . create ( :user_id = > userid , :project_id = > params [ :id ] )
2015-05-29 16:04:21 +08:00
token = Token . get_token_from_user ( user , 'autologin' )
#user = User.try_to_autologin(token.value)
if user
start_user_session ( user )
user . save
redirect_to project_member_path ( params [ :id ] )
return
# account_ project_member_path(params[:id])
flash [ :notice ] = l ( :label_mail_invite_success )
end
end
2015-09-16 10:49:34 +08:00
# 私有项目非项目成员无法访问成员列表
2015-09-15 17:39:57 +08:00
unless @project . is_public?
return render_403 unless User . current . member_of? ( @project )
end
2013-11-04 22:00:06 +08:00
## 有角色参数的才是课程,没有的就是项目
2015-04-08 11:24:40 +08:00
@render_file = 'project_member_list'
2013-11-04 22:00:06 +08:00
# 判断是否课程
2014-03-30 17:03:15 +08:00
if @project . project_type == Project :: ProjectType_course
2014-05-15 17:36:39 +08:00
@teachers = searchTeacherAndAssistant ( @project )
@canShowCode = isCourseTeacher ( User . current . id )
2013-11-04 22:00:06 +08:00
case params [ :role ]
when '1'
@subPage_title = l :label_teacher_list
2015-06-25 10:11:01 +08:00
@members = searchTeacherAndAssistant ( @project )
2013-11-04 22:00:06 +08:00
when '2'
2015-06-25 10:11:01 +08:00
@subPage_title = l :label_student_list
2013-11-04 22:00:06 +08:00
@members = searchStudent ( @project )
else
2013-11-05 20:57:11 +08:00
@subPage_title = ''
2013-11-05 21:00:16 +08:00
@members = @project . member_principals . includes ( :roles , :principal ) . all . sort
2013-11-04 22:00:06 +08:00
end
2015-01-30 13:29:25 +08:00
else
2015-05-19 14:25:10 +08:00
if ! @project . is_public? && ! User . current . member_of? ( @project ) && ! User . current . admin?
render_403
else
roles = Role . find_all_givable
@subPage_title = l :label_member_list
@members = @project . member_principals . includes ( :roles , :principal ) . joins ( " LEFT JOIN #{ OptionNumber . table_name } ON #{ OptionNumber . table_name } .user_id = #{ Member . table_name } .user_id and #{ OptionNumber . table_name } .score_type = 2 AND #{ Member . table_name } .project_id = #{ OptionNumber . table_name } .project_id " ) . order ( " #{ OptionNumber . table_name } .total_score DESC " ) . all
@applied_members = appied_project_members ( @project , @members )
end
2013-10-31 10:57:46 +08:00
end
2013-12-02 17:27:15 +08:00
@members = paginateHelper @members
2016-08-31 17:09:02 +08:00
2013-11-04 22:00:06 +08:00
end
2016-11-08 10:23:02 +08:00
def member_forked
@members_forked = User . find_by_sql ( " SELECT u.* FROM `projects` p,`users` u where p.user_id = u.id and p.forked_from_project_id = #{ @project . id } ; " )
end
2015-09-21 14:28:22 +08:00
def update_message_status ( user , project )
2016-03-22 10:48:37 +08:00
# 更新加入项目消息
project__messages = ForgeMessage . where ( " forge_message_type in ('ProjectInvite', 'JoinProject', 'RemoveFromProject') and user_id =? and project_id =? " , user , project )
project__messages . update_all ( :viewed = > true ) unless project__messages . blank?
2015-09-21 14:28:22 +08:00
end
2015-09-18 23:18:15 +08:00
def message_invite ( message_id , key )
forge_message = ForgeMessage . find ( message_id )
if key == forge_message . secret_key
2015-09-21 14:28:22 +08:00
# 情况:用户收到邀请邮件还没看,但是管理员已经把该用户添加进项目
if Member . where ( " user_id =? and project_id =? " , forge_message . user_id , forge_message . project_id ) . first . nil?
Member . create ( :role_ids = > [ 4 ] , :user_id = > forge_message . user_id , :project_id = > forge_message . project_id )
UserGrade . create ( :user_id = > forge_message . user_id , :project_id = > forge_message . project_id )
end
2015-09-18 23:18:15 +08:00
end
end
2014-05-15 17:36:39 +08:00
#判断指定用户是否为课程教师
def isCourseTeacher ( id )
result = false
if @teachers . find_by_user_id ( id ) != nil
result = true
end
result
end
2013-11-04 22:00:06 +08:00
def sort_project_members project , members
#userGrade = UserGrade.where(:project_id => project.id)
2014-04-01 21:03:52 +08:00
users = UserGrade . where ( :project_id = > project . id ) .
order ( 'grade DESC' ) .
joins ( " LEFT JOIN users ON users.id = user_grades.id " ) .
select ( " DISTINCT user_grades.user_id " )
2013-11-04 22:00:06 +08:00
memberlist = [ ]
users . each do | user |
members . each do | member |
if member [ :user_id ] == user [ :user_id ]
memberlist << member
end
end
end
memberlist
2013-10-31 10:57:46 +08:00
end
2014-05-22 11:58:43 +08:00
def appied_project_members ( project , members )
2014-05-22 18:59:09 +08:00
users = AppliedProject . where ( :project_id = > project . id )
2014-05-22 11:58:43 +08:00
memberlist = [ ]
users . each do | user |
members . each do | member |
if member [ :user_id ] == user [ :user_id ]
memberlist << member
end
end
end
memberlist
end
2013-10-31 10:57:46 +08:00
def file
end
def statistics
end
#end
2016-10-19 15:18:26 +08:00
# 获取项目tree目录的最新提交记录
# 异步请求
# gpid, rev, ent_name, g
def repository_tree_changes
rev = params [ :rev ]
2016-10-19 15:51:55 +08:00
ent_path = params [ :ent_path ]
2016-10-19 15:18:26 +08:00
gpid = params [ :gpid ]
g = Gitlab . client
begin
2016-10-19 15:51:55 +08:00
result = g . rep_last_changes ( gpid , :rev = > rev , :path = > ent_path )
2016-11-01 15:24:02 +08:00
result = { :message = > result . message , :author_name = > User . find_by_mail ( result . author_email ) . nil? ? result . author_email : User . find_by_mail ( result . author_email ) . show_name , :time = > distance_of_time_in_words ( result . time , Time . now ) }
2016-10-19 15:18:26 +08:00
rescue Exception = > e
puts e
end
render :json = > result
end
2013-10-31 10:57:46 +08:00
def update
@project . safe_attributes = params [ :project ]
2015-03-05 11:53:28 +08:00
@project . organization_id = params [ :organization_id ]
2016-07-01 20:00:23 +08:00
params [ :project ] [ :is_public ] == " on " ? @project . is_public = 1 : @project . is_public = 0
params [ :project ] [ :hidden_repo ] == " on " ? @project . hidden_repo = 1 : @project . hidden_repo = 0
2015-11-11 16:33:09 +08:00
# 更新公开私有时同步gitlab公开私有
2016-07-01 20:00:23 +08:00
if ! @project . gpid . nil? && @project . is_public != ( params [ :project ] [ :is_public ] == " on " ? 1 : 0 )
2015-11-11 16:39:05 +08:00
g = Gitlab . client
2016-07-01 20:00:23 +08:00
params [ :project ] [ :is_public ] == " on " ? g . edit_project ( @project . gpid , 20 , params [ :branch ] ) : g . edit_project ( @project . gpid , 0 , params [ :branch ] )
2015-11-11 16:33:09 +08:00
end
# end
2013-10-31 10:57:46 +08:00
if validate_parent_id && @project . save
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
if params [ :project ] [ :is_public ] == '0'
project_status = ProjectStatus . find_by_project_id ( @project . id )
2014-04-25 16:08:00 +08:00
project_status . destroy if project_status
2013-10-31 10:57:46 +08:00
elsif params [ :project ] [ :is_public ] == '1'
2013-12-07 09:47:54 +08:00
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > @project . watchers . count , :changesets_count = > @project . changesets . count , :grade = > 0 , :project_type = > @project . project_type )
2013-10-31 10:57:46 +08:00
end
2013-12-07 09:47:54 +08:00
2013-10-31 10:57:46 +08:00
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_update )
2014-10-15 09:54:54 +08:00
redirect_to settings_project_url ( @project , :course = > @project . project_type )
2013-10-31 10:57:46 +08:00
}
format . api { render_api_ok }
end
else
respond_to do | format |
format . html {
settings
render :action = > 'settings'
}
format . api { render_validation_errors ( @project ) }
end
end
end
def modules
@project . enabled_module_names = params [ :enabled_module_names ]
flash [ :notice ] = l ( :notice_successful_update )
2014-10-15 09:54:54 +08:00
redirect_to settings_project_url ( @project , :tab = > 'modules' )
2013-10-31 10:57:46 +08:00
end
2016-10-19 11:23:15 +08:00
GITLABTYPE = " Repository::Gitlab "
2013-10-31 10:57:46 +08:00
def archive
if request . post?
2016-10-28 14:24:26 +08:00
if @project . archive && @project . gpid
2016-10-19 10:09:38 +08:00
# 删除版本库信息
2016-10-19 11:23:15 +08:00
begin
g = Gitlab . client
g . delete_project ( @project . gpid )
rescue Exception = > e
puts e
end
# 删除Trustie班额本库记录
repoisitory = Repository . where ( :project_id = > @project . id , :type = > GITLABTYPE ) . first
repoisitory . delete
@project . update_column ( :gpid , nil )
2016-10-19 10:09:38 +08:00
else
2013-10-31 10:57:46 +08:00
flash [ :error ] = l ( :error_can_not_archive_project )
end
2016-10-19 10:09:38 +08:00
unless @project . archive
end
2013-10-31 10:57:46 +08:00
end
2015-12-11 12:53:01 +08:00
if params [ :type ] == " project "
redirect_to user_path ( User . current )
else
redirect_to admin_projects_url ( :status = > params [ :status ] )
end
2013-10-31 10:57:46 +08:00
end
def unarchive
@project . unarchive if request . post? && ! @project . active?
2014-10-15 09:54:54 +08:00
redirect_to admin_projects_url ( :status = > params [ :status ] )
2013-10-31 10:57:46 +08:00
end
def close
@project . close
2014-10-15 09:54:54 +08:00
redirect_to project_url ( @project )
2013-10-31 10:57:46 +08:00
end
def reopen
@project . reopen
2014-10-15 09:54:54 +08:00
redirect_to project_url ( @project )
2013-10-31 10:57:46 +08:00
end
# Delete @project
def destroy
@project_to_destroy = @project
2015-10-09 16:12:02 +08:00
@project_to_destroy . destroy
respond_to do | format |
format . html { redirect_to admin_projects_url }
format . api { render_api_ok }
2013-10-31 10:57:46 +08:00
end
# hide project in layout
@project = nil
end
2014-01-16 10:34:39 +08:00
def show_projects_score
2014-11-22 10:07:28 +08:00
respond_to do | format |
2015-06-25 10:11:01 +08:00
format . html { render :layout = > " base_projects " }
2014-11-22 10:07:28 +08:00
format . js
end
2014-01-16 10:34:39 +08:00
end
def issue_score_index
2014-06-26 17:55:01 +08:00
respond_to do | format |
format . js
end
2014-01-16 10:34:39 +08:00
end
def news_score_index
end
def file_score_index
end
def code_submit_score_index
end
def projects_topic_score_index
end
# end
2014-03-17 22:43:38 +08:00
2014-05-06 09:16:48 +08:00
before_filter :toggleCourse , only : [ :finishcourse , :restartcourse ]
2014-03-19 17:32:32 +08:00
# 最好通过用户与项目的权限解决这种事情。还没写
2014-03-17 22:43:38 +08:00
def finishcourse
yesterday = Date . today . prev_day . to_time
2014-05-06 09:16:48 +08:00
@course_prefs . endup_time = yesterday
@save_flag = @course_prefs . save
2014-03-17 22:43:38 +08:00
respond_to do | format |
format . js
end
end
def restartcourse
day = Time . parse ( " 3000-01-01 " )
2014-05-06 09:16:48 +08:00
@course_prefs . endup_time = day
@save_flag = @course_prefs . save
2014-03-17 22:43:38 +08:00
respond_to do | format |
format . js {
render action : 'finishcourse'
}
end
end
2014-08-08 16:43:34 +08:00
def exit_project
@project = Project . find params [ :id ]
if User . current . login?
members = Member . where ( :user_id = > User . current . id , :project_id = > params [ :id ] ) . first
2016-10-28 10:46:00 +08:00
if User . current != @project . owner
2014-08-08 16:43:34 +08:00
members . destroy
2016-07-29 23:23:04 +08:00
# 移出的时候删除申请消息,不需要删除消息,所以不必要关联删除
applied_projects = AppliedProject . where ( :project_id = > @project . id , :user_id = > members . user_id ) . first
unless applied_projects . nil?
applied_projects . delete
end
2014-08-08 16:43:34 +08:00
end
respond_to do | format |
format . js
end
end
end
2015-01-30 09:57:43 +08:00
2016-10-11 09:30:45 +08:00
def store_mine
member = Member . where ( :project_id = > params [ :id ] , :user_id = > User . current . id ) . first
member . try ( :is_collect ) == 1 ? member . update_column ( :is_collect , 0 ) : member . update_column ( :is_collect , 1 )
end
2016-10-27 12:39:44 +08:00
# 项目收藏
def enshrine
@stores = Member . where ( :project_id = > params [ :id ] , :is_collect = > 1 ) . includes ( :user )
end
2015-01-30 09:57:43 +08:00
#加入私有项目
def join_project
respond_to do | format |
format . js
end
end
2015-04-14 10:17:42 +08:00
#朋友圈、科研组、开发组之间的切换
def change_project_type
@project . project_new_type = params [ :project_type ]
if @project . save
message = @project . project_new_type
else
message = " 0 "
end
render :json = > message
end
2013-10-31 10:57:46 +08:00
private
2014-05-19 16:12:06 +08:00
def memberAccess
2015-06-25 10:11:01 +08:00
# 如果是私有项目,项目成员不对外公开,公开项目成员列表对外公开。
unless @project . is_public?
render_403 unless User . current . member_of? ( @project )
end
2014-05-19 16:12:06 +08:00
end
2014-05-06 09:16:48 +08:00
def toggleCourse
@course_prefs = Course . find_by_extra ( @project . identifier )
unless ( @course_prefs . teacher == User . current || User . current . admin? )
render_403
end
end
2013-10-31 10:57:46 +08:00
2014-03-20 14:17:48 +08:00
def select_project_layout
project = Project . find_by_id ( params [ :id ] )
2014-04-12 09:40:26 +08:00
project || = @project || = @course || = params [ :course ] || = params [ :project_type ]
2014-03-27 10:53:45 +08:00
( project . try ( :project_type ) == Project :: ProjectType_project ) ? 'base_projects' : 'base_courses'
2014-03-20 14:17:48 +08:00
end
2013-10-31 10:57:46 +08:00
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id
return true if User . current . admin?
parent_id = params [ :project ] && params [ :project ] [ :parent_id ]
if parent_id || @project . new_record?
parent = parent_id . blank? ? nil : Project . find_by_id ( parent_id . to_i )
unless @project . allowed_parents . include? ( parent )
@project . errors . add :parent_id , :invalid
return false
end
end
true
end
def watcherlist
2015-05-19 16:11:22 +08:00
unless @project . nil?
if ! @project . is_public? && ! User . current . member_of? ( @project ) && ! User . current . admin?
render_403
else
@users -= watched . watcher_users if @watched
end
2013-10-31 10:57:46 +08:00
end
end
2014-04-24 09:13:06 +08:00
2014-04-28 09:53:22 +08:00
#gcm
def desc_sort_course_by_avtivity ( activity_count , projects )
2014-04-24 14:33:15 +08:00
return projects if activity_count . size < 2
( activity_count . size - 2 ) . downto ( 0 ) do | i |
( 0 .. i ) . each do | j |
if activity_count [ j ] < activity_count [ j + 1 ]
projects [ j ] , projects [ j + 1 ] = projects [ j + 1 ] , projects [ j ]
activity_count [ j ] , activity_count [ j + 1 ] = activity_count [ j + 1 ] , activity_count [ j ]
end
end
end
return projects
2014-04-24 09:13:06 +08:00
end
2014-04-28 09:53:22 +08:00
#gcmend
2013-10-31 10:57:46 +08:00
end