diff --git a/Gemfile b/Gemfile index 1c1edfd35..80c0e1c2a 100644 --- a/Gemfile +++ b/Gemfile @@ -50,10 +50,10 @@ gem 'elasticsearch-model' gem 'elasticsearch-rails' #rails 3.2.22.2 bug -gem "test-unit", "~>3.0" + gem "test-unit", "~>3.0" ### profile -gem 'oneapm_rpm' + gem 'oneapm_rpm' group :development do gem 'grape-swagger' diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index eec6e8ead..575048211 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -100,15 +100,34 @@ module Mobile params do requires :token, type: String requires :invite_code, type: String, desc: '邀请码' + requires :teacher_flag, type: Boolean + requires :assistant_flag, type: Boolean + requires :student_flag, type: Boolean end - post "join" do + post "join_class" do authenticate! - cs = CoursesService.new - status = cs.join_course({role: "10", openid: params[:openid], invite_code: params[:invite_code]}, current_user) - { - status: status[:state], - message:CoursesService::JoinCourseError.message(status[:state]) - } + + roles_ids = [] + if params[:teacher_flag] + roles_ids << "9" + elsif params[:assistant_flag] + roles_ids << "7" + end + + if params[:student_flag] + roles_ids << "10" + end + + if roles_ids.length <= 0 + {status:-1,message:"请至少选择一个角色"} + else + cs = CoursesService.new + status = cs.join_course_roles({role: roles_ids, openid: params[:openid], invite_code: params[:invite_code]}, current_user) + { + status: status[:state], + message:CoursesService::JoinCourseError.message(status[:state]) + } + end end @@ -166,7 +185,53 @@ module Mobile present :status, 0 end - desc "设置教辅" + desc "课程未审核列表" + params do + requires :token, type: String + requires :course_id, type: Integer, desc: "课程id" + end + get 'reviewers' do + authenticate! + cs = CoursesService.new + reviewers = cs.reviewers_list(params[:course_id]) + present :data, reviewers, with: Mobile::Entities::User + present :status, 0 + end + + desc "课程单个未审核用户信息" + params do + requires :token, type: String + requires :course_id, type: Integer, desc: "课程id" + requires :user_id, type: Integer, desc: "用户id" + end + post 'review_member_info' do + authenticate! + + cs = CoursesService.new + result = cs.get_reviewer_info(params) + + present :data, result[:reviewer], with: Mobile::Entities::User + present :status,result[:status] + end + + desc "处理教师或助教的身份申请" + params do + requires :token, type: String + requires :course_id, type: Integer, desc: "课程id" + requires :user_id, type: Integer, desc: "用户id" + requires :type, type: Integer, desc: "同意或拒绝" + end + post 'deal_join_apply' do + authenticate! + + cs = CoursesService.new + result = cs.deal_join_apply(params,current_user) + + present :status, result[:status] + present :message, result[:message] + end + + desc "设置助教" params do requires :token,type:String requires :user_id,type:Integer,desc: '用户id' @@ -178,7 +243,7 @@ module Mobile present :status, 0 end - desc "删除教辅" + desc "删除助教" params do requires :token,type:String requires :user_id,type:Integer,desc: '用户id' @@ -448,20 +513,35 @@ module Mobile requires :id, type: Integer requires :token, type: String requires :user_id, type: Integer - requires :role_id, type: Integer + requires :teacher_flag, type: Boolean + requires :assistant_flag, type: Boolean + requires :student_flag, type: Boolean end post 'edit_member_role' do authenticate! + roles_id = [] + + if params[:teacher_flag] + roles_id << 9 + elsif params[:assistant_flag] + roles_id << 7 + end + + if params[:student_flag] + roles_id << 10 + end + + c = Course.find("#{params[:id]}") #7教辅 9教师 10学生 - if c.tea_id == params[:user_id] || c.tea_id != current_user.id || !(params[:role_id] == 7 || params[:role_id] == 9 || params[:role_id] == 10) + if c.tea_id == params[:user_id] || c.tea_id != current_user.id || roles_id.length <= 0 present :status, -1 else cs = CoursesService.new - status = cs.modify_user_course_role params + status = cs.modify_user_course_role params,roles_id present :status, status end end diff --git a/app/api/mobile/apis/projects.rb b/app/api/mobile/apis/projects.rb index 5ab0878d0..05d4036f9 100644 --- a/app/api/mobile/apis/projects.rb +++ b/app/api/mobile/apis/projects.rb @@ -86,9 +86,24 @@ module Mobile develop_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=4").all.sort report_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=5").all.sort + review_master_members = [] + review_develop_members = [] + + my_member = project.member_principals.where("users.id=#{current_user.id}").first + if my_member && my_member.roles[0] && my_member.roles[0].id == 3 + ps = ProjectsService.new + + user = current_user + review_master_members = ps.get_project_review_members(project,3,user) + review_develop_members = ps.get_project_review_members(project,4,user) + + end + present :master_members,master_members, with: Mobile::Entities::ProjectMember present :develop_members,develop_members, with: Mobile::Entities::ProjectMember present :report_members,report_members, with: Mobile::Entities::ProjectMember + present :review_master_members,review_master_members + present :review_develop_members,review_develop_members present :status, 0 end @@ -163,16 +178,55 @@ module Mobile params do requires :token, type: String requires :invite_code, type: String, desc: '邀请码' + requires :role_id, type: Integer, desc: '身份' end - post "join" do + post "join_project" do authenticate! - # ps = ProjectsService.new - # status = ps.join_project({role: "5", openid: params[:openid], invite_code: params[:invite_code]}, current_user) - # - # present :status, status + role_id = params[:role_id] + + if role_id != 3 && role_id != 4 && role_id != 5 + {status:-1,message:"请至少选择一个角色"} + else + ps = ProjectsService.new + status = ps.join_project({role: role_id, openid: params[:openid], invite_code: params[:invite_code]}, current_user) + + {status:status, message:ProjectsService::JoinProjectError.message(status)} + end + + # {status:-1, message: '该功能将在近日开放,敬请期待!' } + end + + desc "项目单个未审核用户信息" + params do + requires :token, type: String + requires :project_id, type: Integer, desc: "项目id" + requires :user_id, type: Integer, desc: "用户id" + end + post 'review_member_info' do + authenticate! + + ps = ProjectsService.new + result = ps.get_reviewer_info(params,current_user) + present :data, result[:reviewer], with: Mobile::Entities::User + present :status, result[:status] + end + + desc "处理管理或开发的身份申请" + params do + requires :token, type: String + requires :project_id, type: Integer, desc: "项目id" + requires :user_id, type: Integer, desc: "用户id" + requires :type, type: Integer, desc: "同意或拒绝" + end + post 'deal_join_apply' do + authenticate! + + ps = ProjectsService.new + result = ps.deal_join_apply(params,current_user) - {status:-1, message: '该功能将在近日开放,敬请期待!' } + present :status, result[:status] + present :message, result[:message] end end diff --git a/app/api/mobile/entities/blog_comment.rb b/app/api/mobile/entities/blog_comment.rb index 726949bb5..14bc9decb 100644 --- a/app/api/mobile/entities/blog_comment.rb +++ b/app/api/mobile/entities/blog_comment.rb @@ -85,7 +85,7 @@ module Mobile #取二级回复的底楼层 parents_reply = [] parents_reply = get_reply_parents_no_root(parents_reply, c) - if parents_reply.count > 0 && parents_reply.count != 2 && !opt[:bottom] + if parents_reply.count > 0 && !opt[:bottom] if opt[:type] == 1 # opt[:bottom] = true # parents_reply[opt[:page]..opt[:page]] @@ -104,9 +104,9 @@ module Mobile #取二级回复的顶楼层 parents_reply = [] parents_reply = get_reply_parents_no_root(parents_reply, c) - if parents_reply.count >= 2 && !opt[:top] + if parents_reply.count > 2 && !opt[:top] if opt[:type] == 1 - opt[:bottom] = true + opt[:top] = true tStart = (opt[:page]-1)*5+2 tEnd = (opt[:page])*5+2 - 1 @@ -125,6 +125,10 @@ module Mobile parents_reply = parents_reply.reverse[0..1] parents_reply.reverse end + elsif parents_reply.count == 2 && !opt[:top] + opt[:top] = true + parents_reply = parents_reply.reverse[0..0] + parents_reply.reverse else [] end diff --git a/app/api/mobile/entities/issue.rb b/app/api/mobile/entities/issue.rb index dc4fd0567..9cbeb3459 100644 --- a/app/api/mobile/entities/issue.rb +++ b/app/api/mobile/entities/issue.rb @@ -34,6 +34,8 @@ module Mobile 'Issue' when :act_id issue.id + when :title + issue.subject end end end @@ -43,6 +45,7 @@ module Mobile expose :description expose :author, using: Mobile::Entities::User expose :done_ratio + issue_expose :title issue_expose :act_type issue_expose :act_id issue_expose :created_on diff --git a/app/api/mobile/entities/jours.rb b/app/api/mobile/entities/jours.rb index 0e4c699c2..6379e88e4 100644 --- a/app/api/mobile/entities/jours.rb +++ b/app/api/mobile/entities/jours.rb @@ -101,7 +101,7 @@ module Mobile elsif opt[:comment_type] == "homework" parents_reply = get_reply_parents(parents_reply, f) end - if parents_reply.count > 0 && parents_reply.count != 2 && !opt[:bottom] + if parents_reply.count > 0 && !opt[:bottom] if opt[:type] == 1 # opt[:bottom] = true # parents_reply[opt[:page]..opt[:page]] @@ -125,9 +125,9 @@ module Mobile elsif opt[:comment_type] == "homework" parents_reply = get_reply_parents(parents_reply, f) end - if parents_reply.count >= 2 && !opt[:top] + if parents_reply.count > 2 && !opt[:top] if opt[:type] == 1 - opt[:bottom] = true + opt[:top] = true tStart = (opt[:page]-1)*5+2 tEnd = (opt[:page])*5+2 - 1 @@ -146,6 +146,10 @@ module Mobile parents_reply = parents_reply.reverse[0..1] parents_reply.reverse end + elsif parents_reply.count == 2 && !opt[:top] + opt[:top] = true + parents_reply = parents_reply.reverse[0..0] + parents_reply.reverse else [] end diff --git a/app/api/mobile/entities/message.rb b/app/api/mobile/entities/message.rb index c2744f63a..07c560a1f 100644 --- a/app/api/mobile/entities/message.rb +++ b/app/api/mobile/entities/message.rb @@ -33,6 +33,8 @@ module Mobile when :comment_count all_comments = [] get_all_children(all_comments, u).count + when :title + u.subject end end end @@ -50,6 +52,7 @@ module Mobile message_expose :course_project_name message_expose :board_id message_expose :subject + message_expose :title message_expose :content message_expose :comment_count message_expose :praise_count @@ -92,7 +95,7 @@ module Mobile #取二级回复的底楼层 parents_reply = [] parents_reply = get_reply_parents_no_root(parents_reply, c) - if parents_reply.count > 0 && parents_reply.count != 2 && !opt[:bottom] + if parents_reply.count > 0 && !opt[:bottom] if opt[:type] == 1 # opt[:bottom] = true # parents_reply[opt[:page]..opt[:page]] @@ -111,9 +114,9 @@ module Mobile #取二级回复的顶楼层 parents_reply = [] parents_reply = get_reply_parents_no_root(parents_reply, c) - if parents_reply.count >= 2 && !opt[:top] + if parents_reply.count > 2 && !opt[:top] if opt[:type] == 1 - opt[:bottom] = true + opt[:top] = true tStart = (opt[:page]-1)*5+2 tEnd = (opt[:page])*5+2 - 1 @@ -132,6 +135,10 @@ module Mobile parents_reply = parents_reply.reverse[0..1] parents_reply.reverse end + elsif parents_reply.count == 2 && !opt[:top] + opt[:top] = true + parents_reply = parents_reply.reverse[0..0] + parents_reply.reverse else [] end diff --git a/app/api/mobile/entities/project.rb b/app/api/mobile/entities/project.rb index 3e1899caa..073f7cd0f 100644 --- a/app/api/mobile/entities/project.rb +++ b/app/api/mobile/entities/project.rb @@ -4,8 +4,8 @@ module Mobile expose :name expose :id expose :user_id - # expose :invite_code - # expose :qrcode + expose :invite_code + expose :qrcode expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options| current_user = options[:user] diff --git a/app/api/mobile/entities/project_member.rb b/app/api/mobile/entities/project_member.rb index 58edf7ea7..decd7dac3 100644 --- a/app/api/mobile/entities/project_member.rb +++ b/app/api/mobile/entities/project_member.rb @@ -14,11 +14,11 @@ module Mobile else case f when :roles_id - u.roles[0].id + # u.roles[0].id + u.roles.map {|r| r.id} end end end - end end diff --git a/app/api/mobile/entities/whomework.rb b/app/api/mobile/entities/whomework.rb index 7178ff67d..9d141552a 100644 --- a/app/api/mobile/entities/whomework.rb +++ b/app/api/mobile/entities/whomework.rb @@ -34,6 +34,8 @@ module Mobile 'HomeworkCommon' when :act_id wh.id + when :title + wh.name end end end @@ -59,6 +61,7 @@ module Mobile expose :quotes expose :is_open expose :id + whomework_expose :title whomework_expose :act_type whomework_expose :act_id whomework_expose :course_name diff --git a/app/assets/javascripts/pull_requests.js.coffee b/app/assets/javascripts/pull_requests.js.coffee new file mode 100644 index 000000000..761567942 --- /dev/null +++ b/app/assets/javascripts/pull_requests.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/pull_requests.css.scss b/app/assets/stylesheets/pull_requests.css.scss new file mode 100644 index 000000000..f69ac413b --- /dev/null +++ b/app/assets/stylesheets/pull_requests.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the pull_requests controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/applied_project_controller.rb b/app/controllers/applied_project_controller.rb index 883fd1c68..41f069020 100644 --- a/app/controllers/applied_project_controller.rb +++ b/app/controllers/applied_project_controller.rb @@ -45,7 +45,7 @@ class AppliedProjectController < ApplicationController end # @flage:提示语标志(1:邀请码错误;2:已经是项目成员; 3:角色没有选择; 4:申请成功) - # role:成员角色 => 0(4:管理人员;5:开发人员;6:报告人员) + # role:成员角色 => 0(3:管理人员;4:开发人员;5:报告人员) # 申请成功则发送消息 def applied_project_info if params[:project_id].nil? @@ -53,7 +53,7 @@ class AppliedProjectController < ApplicationController else @project = Project.find(params[:project_id]) end - if !@project || params[:invite_code].to_s != @project.invite_code + if !@project || params[:invite_code].upcase.to_s != @project.invite_code @flag = 1 elsif User.current.member_of?(@project) @flag = 2 @@ -61,6 +61,20 @@ class AppliedProjectController < ApplicationController @flag = 3 elsif !AppliedProject.where(:project_id => @project.id, :user_id => User.current.id).first.nil? @flag = 5 + elsif params[:member] == "member_reporter" && params[:invite_code].upcase.to_s == @project.invite_code + # 项目报告人员直接加入项目 + @flag = 6 + members = [] + user_grades = [] + project_info = [] + members << Member.new(:role_ids => ["5"], :user_id => User.current.id) + user_grades << UserGrade.new(:user_id => User.current.id, :project_id => @project.id) + role = Role.find(5) + project_info << ProjectInfo.new(:project_id => @project.id, :user_id => User.current.id) if role.allowed_to?(:is_manager) + @project.members << members + @project.project_infos << project_info + @project.user_grades << user_grades unless user_grades.first.user_id.nil? + else @flag = 4 role = params[:member] == "member_manager" ? 3 : (params[:member] == "member_developer" ? 4 :5) diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb index 2020915f8..2f50c8105 100644 --- a/app/controllers/homework_common_controller.rb +++ b/app/controllers/homework_common_controller.rb @@ -58,9 +58,10 @@ class HomeworkCommonController < ApplicationController def edit @user = User.current - @is_in_course = params[:is_in_course].to_i + @is_in_course = params[:is_in_course] + @is_manage = params[:is_manage] @course_activity = params[:course_activity].to_i - if @is_in_course == 1 || @course_activity == 1 + if @is_in_course.to_i == 1 || @course_activity == 1 @left_nav_type = 3 respond_to do |format| format.html{render :layout => 'base_courses'} @@ -144,7 +145,11 @@ class HomeworkCommonController < ApplicationController @homework_detail_programing.save if @homework_detail_programing @homework_detail_group.save if @homework_detail_group - if params[:is_in_course] == "1" + if params[:is_manage] == "1" + redirect_to manage_or_receive_homeworks_user_path(User.current.id) + elsif params[:is_manage] == "2" + redirect_to my_homeworks_user_path(User.current.id) + elsif params[:is_in_course] == "1" redirect_to homework_common_index_path(:course => @course.id) elsif params[:is_in_course] == "0" redirect_to user_homeworks_user_path(User.current.id) diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 0a76cfb78..f14416442 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -75,13 +75,19 @@ class MembersController < ApplicationController project.members << members project.project_infos << project_info project.user_grades << user_grades unless user_grades.first.user_id.nil? - @applied_message.update_attribute(:status, 2) + + # 添加成功后所有管理员收到的消息状态都要更新 + applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, + :applied_type => "AppliedProject") + applied_messages.update_all(:status => 7, :viewed => true) + @applied_message = AppliedMessage.find(params[:applied_message_id]) # 添加成功后,申请人收到消息 AppliedMessage.create(:user_id => @applied_message.applied_user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , - :status => 6, :viewed => true, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) + :status => 6, :viewed => false, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) + # 添加成功后,批准人收到消息 - AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , - :status => 7, :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) + # AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , + # :status => 7, :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) rescue Exception => e puts e end @@ -95,14 +101,19 @@ class MembersController < ApplicationController # status(1:申请的消息;2:已操作过该消息(包括同意或者拒绝,消息状态更新);3:拒绝消息;4:被拒人收到消息;5:拒绝者收到消息;6:同意后申请人收到消息;7:同意后批准人收到消息) def refused_allow_to_join_project @applied_message = AppliedMessage.find(params[:applied_message_id]) - @applied_message.update_attribute(:status, 3) + # @applied_message.update_attribute(:status, 3) applied_project = @applied_message.applied # 发送消息给被拒者,user_id对应的收到信息的用户 AppliedMessage.create(:user_id => @applied_message.applied_user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 4, - :viewed => true, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) - # 发送消息给拒绝者 - AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 5, - :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) + :viewed => false, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) + + # 拒绝功后所有管理员收到的消息状态都要更新 + applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, + :applied_type => "AppliedProject") + applied_messages.update_all(:status => 5, :viewed => true) + @applied_message = AppliedMessage.find(params[:applied_message_id]) + # AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 5, + # :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) applied_project.delete end diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb new file mode 100644 index 000000000..58d1cb3b2 --- /dev/null +++ b/app/controllers/pull_requests_controller.rb @@ -0,0 +1,135 @@ + +class PullRequestsController < ApplicationController + before_filter :find_project_and_repository + before_filter :connect_gitlab, :only => [:index, :show, :create, :accept_pull_request, :pull_request_commits, :pull_request_changes, :new] + layout "base_projects" + include PullRequestsHelper + include ApplicationHelper + + # 返回json格式 + def index + type = params[:type] + case type + when nil, "1" + @requests = @g.merge_requests(@project.gpid).select{|request| request.state == "opened" || request.state == "reopened"} + when "2" + @requests = @g.merge_requests(@project.gpid).select{|request| request.state == "merged"} + end + @requests_opened_count = @requests.count + @requests_merged_count = params[:type] ? @requests.count : @g.merge_requests(@project.gpid).select{|request| request.state == "merged"}.count + respond_to do |format| + format.html + format.js + end + end + + # 主要取源项目和目标项目分支及标识(用户名/版本库名) + def new + identifier = get_rep_identifier_by_project @project + @source_project_name = "#{get_user_name(@project.user_id)}/#{identifier}" + @source_rev = @g.branches(@project.gpid).map{|b| b.name} + + # 获取forked源项目信息 + if @project.forked_from_project_id + @forked_project = Project.find(@project.forked_from_project_id) + identifier = get_rep_identifier_by_project @forked_project + @forked_project_name = "#{get_user_name(@forked_project.user_id)}/#{identifier}" + @forked_rev = @g.branches(@forked_project.gpid).map{|b| b.name} + end + end + + # Creates a merge request. + # If the operation is successful, 200 and the newly created merge request is returned. If an error occurs, an error number and a message explaining the reason is returned. + # + # @example + # Gitlab.create_merge_request(5, 'New merge request', + # :source_branch => 'source_branch', :target_branch => 'target_branch') + # Gitlab.create_merge_request(5, 'New merge request', + # :source_branch => 'source_branch', :target_branch => 'target_branch', :assignee_id => 42) + # + # @param [Integer] project The ID of a project. + # @param [String] title The title of a merge request. + # @param [Hash] options A customizable set of options. + # @option options [String] :source_branch (required) The source branch name. + # @option options [String] :target_branch (required) The target branch name. + # @option options [Integer] :assignee_id (optional) The ID of a user to assign merge request. + # @return [Gitlab::ObjectifiedHash] Information about created merge request. + def create + title = params[:title] + description = params[:description] + source_branch = params[:source_branch] + target_branch = params[:target_branch] + begin + # 如果传送了目标项目ID,则PR请求发至目标项目 + if params[:forked_project_id] && params[:source_project] == "forked_project_name" + target_project_id = params[:forked_project_id].to_i + request = @g.create_merge_request(@project.gpid, title, User.current.gid, :description => description, :source_branch => source_branch, :target_branch => target_branch, :target_project_id => target_project_id) + @fork_project_name = Project.find(@project.forked_from_project_id).try(:name) + @fork_pr_message = true if @fork_project_name + else + request = @g.create_merge_request(@project.gpid, title, User.current.gid, :description => description, :source_branch => source_branch, :target_branch => target_branch) + respond_to do |format| + format.js{redirect_to project_pull_request_path(request.id, :project_id => @project.id)} + end + end + rescue Exception => e + @message = e.message + end + end + + def show + @type = params[:type] + @request = @g.merge_request(@project.gpid, params[:id]) + @commits = @g.merge_request_commits(@project.gpid, params[:id].to_i) + @commits_count = @commits.count + @changes = @g.merge_request_changes(@project.gpid, params[:id]).try(:changes) + @changes_count = @changes.count + end + + # Accept a merge request. + # If merge success you get 200 OK. + # Accept a merge request. + # + # @example + # Gitlab.accept_pull_rquest(5, 1) + # + # @param [Integer] project The ID of a project. + # @param [Integer] id The ID of a merge request. + # @return [Gitlab::ObjectifiedHash] + def accept_pull_request + begin + status = @g.accept_merge_rquest(@project.gpid, params[:id], User.current.gid) + respond_to do |format| + format.js{redirect_to project_pull_request_path(status.id, :project_id => @project.id)} + end + rescue Exception => e + @message = e.message + end + end + + # 获取某次请求的提交次数 + def pull_request_commits + @type = parms[:type] + @commits = @g.merge_request_commits(@project.gpid, params[:id].to_i) + end + + # 获取某次请求的改动 + def pull_request_changes + @changes = @g.merge_request_changes(@project.gpid, params[:id]).try(:changes) + @changes_count = @changes.count + end + + private + def connect_gitlab + @g = Gitlab.client + end + + def find_project_and_repository + @project = Project.find(params[:project_id]) + render_404 if @project.gpid.blank? + @repository = Repository.where(:project_id => @project.id, :type => "Repository::Gitlab") + rescue ActiveRecord::RecordNotFound + render_404 + end + +end diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index e2dd23552..adfcd6263 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -775,30 +775,33 @@ class StudentWorkController < ApplicationController end def retry_work - if @work.destroy - if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1 - pros = @work.student_work_projects.where("is_leader = 0") - pros.each do |pro| - pro.destroy - end - project = @work.student_work_projects.where("is_leader = 1").first - project.update_attributes(:student_work_id => nil) - elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0 - @work.student_work_projects.each do |pro2| - pro2.destroy + if @homework.homework_type == 3 + if @work.destroy + if @homework.homework_detail_group.base_on_project == 1 + pros = @work.student_work_projects.where("is_leader = 0") + pros.each do |pro| + pro.destroy + end + project = @work.student_work_projects.where("is_leader = 1").first + project.update_attributes(:student_work_id => nil) + elsif @homework.homework_detail_group.base_on_project == 0 + @work.student_work_projects.each do |pro2| + pro2.destroy + end end end - @student_work = StudentWork.new - respond_to do |format| - format.js - end + elsif @homework.homework_type == 1 + @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0) + end + @student_work = StudentWork.new + respond_to do |format| + format.js end end #添加评分,已评分则为修改评分 def add_score @is_last = params[:is_last] == "true" - render_403 and return if User.current == @work.user #不可以匿评自己的作品 @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? #老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分 render_403 and return unless @is_teacher || @homework.homework_detail_manual.comment_status == 2 @@ -828,7 +831,7 @@ class StudentWorkController < ApplicationController if User.current.admin? @new_score.reviewer_role = 1 else - role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name + role = User.current.members.where("course_id = ?",@course.id).first.roles.where("is_current = 1").first.name @new_score.reviewer_role = get_role_by_name(role) end if @score diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2f1d6a4db..932617671 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -41,7 +41,8 @@ class UsersController < ApplicationController :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index,:user_resource, :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist,:user_messages,:edit_brief_introduction, - :user_import_homeworks,:user_search_homeworks,:user_import_resource, :user_system_messages,:choose_user_course,:user_courselist,:user_projectlist,:sort_syllabus_list] + :user_import_homeworks,:user_search_homeworks,:user_import_resource, :user_system_messages,:choose_user_course,:user_courselist,:user_projectlist,:sort_syllabus_list, + :my_homeworks,:manage_or_receive_homeworks,:search_m_r_homeworks] before_filter :auth_user_extension, only: :show #before_filter :rest_user_score, only: :show #before_filter :select_entry, only: :user_projects @@ -592,23 +593,25 @@ class UsersController < ApplicationController #用户作业列表 def user_homeworks - @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc" + @order,@b_sort = params[:order] || "publish_time",params[:sort] || "desc" @user = User.current @r_sort = @b_sort == "desc" ? "asc" : "desc" if(params[:type].blank? || params[:type] == "1") #我的题库 - @homeworks = HomeworkCommon.where("user_id = #{@user.id} and publish_time <= '#{Date.today}'").order("#{@order} #{@b_sort}") - elsif params[:type] == "2" #题库 + courses = @user.courses.where("is_delete = 1") + course_ids = courses.empty? ? "(-1)" : "(" + courses.map{|course| course.id}.join(",") + ")" + @homeworks = HomeworkCommon.where("user_id = #{@user.id} and publish_time <= '#{Date.today}' and course_id not in #{course_ids}").order("#{@order} #{@b_sort}") + elsif params[:type] == "2" #公共题库 visible_course = Course.where("is_delete = 0") visible_course_ids = visible_course.empty? ? "(-1)" : "(" + visible_course.map{|course| course.id}.join(",") + ")" @homeworks = HomeworkCommon.where("course_id in #{visible_course_ids} and publish_time <= '#{Date.today}'").order("#{@order} #{@b_sort}") end @type = params[:type] - @limit = 25 + @limit = 10 @is_remote = true @hw_count = @homeworks.count @hw_pages = Paginator.new @hw_count, @limit, params['page'] || 1 @offset ||= @hw_pages.offset - @homeworks = paginateHelper @homeworks,25 + @homeworks = paginateHelper @homeworks,10 respond_to do |format| format.js format.html {render :layout => 'static_base'} @@ -641,15 +644,15 @@ class UsersController < ApplicationController end def choose_user_course - homework = HomeworkCommon.find params[:send_id].to_i - if homework.user != User.current && homework.course.is_public == 0 && !User.current.allowed_to?(:as_teacher,homework.course) - ah = ApplyHomework.where("user_id = ? and homework_common_id = ?", User.current.id, params[:send_id].to_i) - if ah.empty? - @status = 2 - elsif ah.first.status != 2 - @status = ah.first.status - end - end + homework = HomeworkCommon.find params[:homework].to_i + # if homework.user != User.current && homework.course.is_public == 0 && !User.current.allowed_to?(:as_teacher,homework.course) + # ah = ApplyHomework.where("user_id = ? and homework_common_id = ?", User.current.id, params[:send_id].to_i) + # if ah.empty? + # @status = 2 + # elsif ah.first.status != 2 + # @status = ah.first.status + # end + # end if !params[:search].nil? search = "%#{params[:search].to_s.strip.downcase}%" @course = @user.courses.where("is_delete = 0 and #{Course.table_name}.id != #{homework.course_id} and (#{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like :p)",:p=>search).select { |course| @user.allowed_to?(:as_teacher,course)} @@ -658,7 +661,7 @@ class UsersController < ApplicationController end @search = params[:search] #这里仅仅是传递需要发送的资源id - @send_id = params[:send_id] + @send_id = params[:homework] respond_to do |format| format.js end @@ -737,7 +740,7 @@ class UsersController < ApplicationController #@user_homeworks = HomeworkCommon.where(:user_id => @user.id).order("created_at desc") courses = @user.courses.where("is_delete = 1") course_ids = courses.empty? ? "(-1)" : "(" + courses.map{|course| course.id}.join(",") + ")" - @homeworks = HomeworkCommon.where("user_id = #{@user.id} and publish_time <= '#{Date.today}' and course_id not in #{course_ids}").order("#{@order} #{@b_sort}") + @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids}").order("#{@order} #{@b_sort}") @type = params[:type] @limit = 15 @is_remote = true @@ -751,30 +754,26 @@ class UsersController < ApplicationController end def user_homework_type - @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc" + @order,@b_sort = params[:order] || "publish_time",params[:sort] || "desc" @r_sort = @b_sort == "desc" ? "asc" : "desc" @user = User.current if(params[:type].blank? || params[:type] == "1") #我的题库 courses = @user.courses.where("is_delete = 1") course_ids = courses.empty? ? "(-1)" : "(" + courses.map{|course| course.id}.join(",") + ")" - @homeworks = HomeworkCommon.where("user_id = #{@user.id} and publish_time <= '#{Date.today}' and course_id not in #{course_ids}").order("#{@order} #{@b_sort}") - elsif params[:type] == "2" #题库 - if params[:is_import].to_i == 1 - visible_course = Course.where("is_public = 1 && is_delete = 0") - elsif params[:is_import].to_i == 0 - visible_course = Course.where("is_delete = 0") - end + @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids}").order("#{@order} #{@b_sort}") + elsif params[:type] == "2" #公共题库 + visible_course = Course.where("is_public = 1 && is_delete = 0") visible_course_ids = visible_course.empty? ? "(-1)" : "(" + visible_course.map{|course| course.id}.join(",") + ")" @homeworks = HomeworkCommon.where("course_id in #{visible_course_ids} and publish_time <= '#{Date.today}'").order("#{@order} #{@b_sort}") - elsif params[:type] == "3" #申请题库 - none_visible_course = Course.where("is_delete = 1") - none_visible_course_ids = none_visible_course.empty? ? "(-1)" : "(" + none_visible_course.map{|course| course.id}.join(",") + ")" - #apply_homeworks = ApplyHomework.where("user_id = ?",@user.id).order('created_at desc') - #homework_ids = apply_homeworks.empty? ? "(-1)" : "(" + apply_homeworks.map{|ah| ah.homework_common_id}.join(",") + ")" - #@homeworks = HomeworkCommon.where("id in #{homework_ids} and course_id not in #{none_visible_course_ids}") - - sql = "SELECT homework_commons.* FROM homework_commons INNER JOIN apply_homeworks as ah ON homework_commons.id = ah.homework_common_id where ah.user_id = #{@user.id} and homework_commons.course_id not in #{none_visible_course_ids} order by ah.created_at desc" - @homeworks = HomeworkCommon.find_by_sql(sql) + # elsif params[:type] == "3" #申请题库 + # none_visible_course = Course.where("is_delete = 1") + # none_visible_course_ids = none_visible_course.empty? ? "(-1)" : "(" + none_visible_course.map{|course| course.id}.join(",") + ")" + # #apply_homeworks = ApplyHomework.where("user_id = ?",@user.id).order('created_at desc') + # #homework_ids = apply_homeworks.empty? ? "(-1)" : "(" + apply_homeworks.map{|ah| ah.homework_common_id}.join(",") + ")" + # #@homeworks = HomeworkCommon.where("id in #{homework_ids} and course_id not in #{none_visible_course_ids}") + # + # sql = "SELECT homework_commons.* FROM homework_commons INNER JOIN apply_homeworks as ah ON homework_commons.id = ah.homework_common_id where ah.user_id = #{@user.id} and homework_commons.course_id not in #{none_visible_course_ids} order by ah.created_at desc" + # @homeworks = HomeworkCommon.find_by_sql(sql) end if params[:property] all_homework_ids = @homeworks.empty? ? "(-1)" : "(" + @homeworks.map{|h| h.id}.join(",") + ")" @@ -792,7 +791,7 @@ class UsersController < ApplicationController @type = params[:type] @property = params[:property] @is_import = params[:is_import] - @limit = params[:is_import].to_i == 1 ? 15 : 25 + @limit = params[:is_import].to_i == 1 ? 15 : 10 @is_remote = true @hw_count = @homeworks.count @hw_pages = Paginator.new @hw_count, @limit, params['page'] || 1 @@ -827,28 +826,24 @@ class UsersController < ApplicationController #用户主页过滤作业 def user_search_homeworks - @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc" + @order,@b_sort = params[:order] || "publish_time",params[:sort] || "desc" @r_sort = @b_sort == "desc" ? "asc" : "desc" @user = User.current search = params[:name].to_s.strip.downcase - type_ids = params[:property]=="" || params[:property].nil? ? "(1, 2, 3)" : "(" + params[:property] + ")" + type_ids = (params[:property]=="" || params[:property].nil? || params[:property]=="0") ? "(1, 2, 3)" : "(" + params[:property] + ")" if(params[:type].blank? || params[:type] == "1") #我的题库 courses = @user.courses.where("is_delete = 1") course_ids = courses.empty? ? "(-1)" : "(" + courses.map{|course| course.id}.join(",") + ")" if @order == "course_name" - sql = "SELECT homework_commons.* FROM homework_commons INNER JOIN courses ON homework_commons.course_id = courses.id where homework_commons.course_id not in #{course_ids} and homework_commons.user_id = #{@user.id} and homework_type in #{type_ids} and publish_time <= '#{Date.today}' and (homework_commons.name like '%#{search}%') order by CONVERT (courses.name USING gbk) COLLATE gbk_chinese_ci #{@b_sort}" + sql = "SELECT homework_commons.* FROM homework_commons INNER JOIN courses ON homework_commons.course_id = courses.id where homework_commons.course_id not in #{course_ids} and homework_commons.user_id = #{@user.id} and homework_type in #{type_ids} and (homework_commons.name like '%#{search}%') order by CONVERT (courses.name USING gbk) COLLATE gbk_chinese_ci #{@b_sort}" @homeworks = HomeworkCommon.find_by_sql(sql) elsif @order == "user_name" - @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids} and publish_time <= '#{Date.today}' and (name like '%#{search}%') and homework_type in #{type_ids}").joins(:user).order("CONVERT (lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, CONVERT (firstname USING gbk) COLLATE gbk_chinese_ci #{@b_sort},login #{@b_sort}") + @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids} and (name like '%#{search}%') and homework_type in #{type_ids}").joins(:user).order("CONVERT (lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, CONVERT (firstname USING gbk) COLLATE gbk_chinese_ci #{@b_sort},login #{@b_sort}") else - @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids} and publish_time <= '#{Date.today}' and (name like '%#{search}%') and homework_type in #{type_ids}").order("#{@order} #{@b_sort}") + @homeworks = HomeworkCommon.where("user_id = #{@user.id} and course_id not in #{course_ids} and (name like '%#{search}%') and homework_type in #{type_ids}").order("#{@order} #{@b_sort}") end elsif params[:type] == "2" #题库 - if params[:is_import].to_i == 1 - visible_course = Course.where("is_public = 1 && is_delete = 0") - elsif params[:is_import].to_i == 0 - visible_course = Course.where("is_delete = 0") - end + visible_course = Course.where("is_public = 1 && is_delete = 0") visible_course_ids = visible_course.empty? ? "(-1)" : "(" + visible_course.map{|course| course.id}.join(",") + ")" all_homeworks = HomeworkCommon.where("course_id in #{visible_course_ids} and publish_time <= '#{Date.today}'") all_user_ids = all_homeworks.map{|hw| hw.user_id} @@ -886,7 +881,7 @@ class UsersController < ApplicationController end =end @type = params[:type] - @limit = params[:is_import].to_i == 1 ? 15 : 25 + @limit = params[:is_import].to_i == 1 ? 15 : 10 @is_remote = true @hw_count = @homeworks.count @hw_pages = Paginator.new @hw_count, @limit, params['page'] || 1 @@ -900,6 +895,19 @@ class UsersController < ApplicationController end end + #检查改作业是否可以选用 + def check_homework + homework = HomeworkCommon.find_by_id params[:homework] + student_ids = homework.course.student.empty? ? [] : homework.course.student.map{|student| student.student_id}.join(',') + resultObj = {status: 2} + if student_ids.include?(User.current.id.to_s) + resultObj[:status] = 1 + else + resultObj[:status] = 0 + end + render :json => resultObj + end + #导入作业,确定按钮 def user_select_homework homework = HomeworkCommon.find_by_id params[:checkMenu] @@ -1444,26 +1452,14 @@ class UsersController < ApplicationController #显示更多用户课程 def user_courses4show @page = params[:page].to_i + 1 - @type = params[:type] - if @type == 'User' - @courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) - @all_count = @user.courses.visible.where("is_delete =?", 0).count - elsif @type == 'Syllabus' - @syllabus = Syllabus.where("id = #{params[:syllabus]}").first - if User.current == @syllabus.user || User.current.admin? - all_courses = @syllabus.courses.where("is_delete = 0").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc") - else - all_courses = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc") - end - @courses = all_courses.limit(5).offset(@page * 5) - @all_count = all_courses.count - end + @courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(10).offset(@page * 10) + @all_count = @user.courses.visible.where("is_delete =?", 0).count end #显示更多用户项目 def user_projects4show @page = params[:page].to_i + 1 - @projects = @user.projects.visible.select("projects.*,(SELECT MAX(updated_at) FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS a").order("a desc").limit(5).offset(@page * 5) + @projects = @user.projects.visible.select("projects.*,(SELECT MAX(updated_at) FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS a").order("a desc").limit(10).offset(@page * 10) end def user_course_activities @@ -1529,6 +1525,107 @@ class UsersController < ApplicationController render :action=>'user_course_activities',:layout=>nil end + #首页-》我的作业 + def my_homeworks + tea_courses = @user.courses.visible.not_deleted.select{|course| @user.has_teacher_role(course)} + tea_course_ids = tea_courses.empty? ? "(-1)" : "(" + tea_courses.map{|course| course.id}.join(',') + ")" + @manage_homeworks = HomeworkCommon.where("course_id in #{tea_course_ids}").order("created_at desc").limit(5) + stu_courses = @user.courses.visible.not_deleted.select{|course| @user.has_student_role(course)} + stu_course_ids = stu_courses.empty? ? "(-1)" : "(" + stu_courses.map{|course| course.id}.join(',') + ")" + @receive_homeworks = HomeworkCommon.where("course_id in #{stu_course_ids} and publish_time <= '#{Date.today}'").order("created_at desc").limit(5) + if (@manage_homeworks.empty? && @receive_homeworks.empty?) || (@receive_homeworks.empty?) || (!@manage_homeworks.empty? && !@receive_homeworks.empty? && @manage_homeworks.first.publish_time > @receive_homeworks.first.publish_time) + @manage_pre = true + else + @manage_pre = false + end + respond_to do |format| + format.js + format.html {render :layout => 'static_base'} + end + end + + #我管理/收到的作业 + def manage_or_receive_homeworks + @order,@b_sort,@type = params[:order] || "created_at",params[:sort] || "desc",params[:type] || 1 + @r_sort = @b_sort == "desc" ? "asc" : "desc" + @type = @type.to_i + if @type == 1 + tea_courses = @user.courses.visible.not_deleted.select{|course| @user.has_teacher_role(course)} + tea_course_ids = tea_courses.empty? ? "(-1)" : "(" + tea_courses.map{|course| course.id}.join(',') + ")" + @homeworks = HomeworkCommon.where("course_id in #{tea_course_ids}").order("#{@order} #{@b_sort}") + else + stu_courses = @user.courses.visible.not_deleted.select{|course| @user.has_student_role(course)} + stu_course_ids = stu_courses.empty? ? "(-1)" : "(" + stu_courses.map{|course| course.id}.join(',') + ")" + @homeworks = HomeworkCommon.where("course_id in #{stu_course_ids} and publish_time <= '#{Date.today}'").order("#{@order} #{@b_sort}") + end + if params[:property] + all_homework_ids = @homeworks.empty? ? "(-1)" : "(" + @homeworks.map{|h| h.id}.join(",") + ")" + if params[:property] == "1" + @homeworks = HomeworkCommon.find_by_sql("select * from homework_commons where id in #{all_homework_ids} and homework_type = 1") + elsif params[:property] == "2" + @homeworks = HomeworkCommon.find_by_sql("select * from homework_commons where id in #{all_homework_ids} and homework_type = 2") + elsif params[:property] == "3" + @homeworks = HomeworkCommon.find_by_sql("select * from homework_commons where id in #{all_homework_ids} and homework_type = 3") + end + end + @limit = 10 + @is_remote = true + @hw_count = @homeworks.count + @hw_pages = Paginator.new @hw_count, @limit, params['page'] || 1 + @offset ||= @hw_pages.offset + @homeworks = paginateHelper @homeworks,@limit + @search = "" + @property = params[:property] + respond_to do |format| + format.js + format.html {render :layout => 'static_base'} + end + end + + #搜索作业 + def search_m_r_homeworks + @order,@b_sort,@type = params[:order] || "created_at",params[:sort] || "desc",params[:type].to_i || 1 + @r_sort = @b_sort == "desc" ? "asc" : "desc" + search = params[:name].to_s.strip.downcase + type_ids = (params[:property]=="" || params[:property].nil? || params[:property]=="0") ? "(1, 2, 3)" : "(" + params[:property] + ")" + if @type == 1 + tea_courses = @user.courses.visible.not_deleted.select{|course| @user.has_teacher_role(course)} + tea_course_ids = tea_courses.empty? ? "(-1)" : "(" + tea_courses.map{|course| course.id}.join(',') + ")" + #user_ids = hw_publisher_user_ids search, tea_course_ids + @homeworks = HomeworkCommon.where("course_id in #{tea_course_ids} and homework_type in #{type_ids} and name like '%#{search}%'").order("#{@order} #{@b_sort}") + else + stu_courses = @user.courses.visible.not_deleted.select{|course| @user.has_student_role(course)} + stu_course_ids = stu_courses.empty? ? "(-1)" : "(" + stu_courses.map{|course| course.id}.join(',') + ")" + #user_ids = hw_publisher_user_ids search, stu_course_ids + @homeworks = HomeworkCommon.where("course_id in #{stu_course_ids} and homework_type in #{type_ids} and publish_time <= '#{Date.today}' and name like '%#{search}%'") + if @order == "status" + @homeworks.each do |homework| + work = cur_user_works_for_homework homework + if work.blank? + homework[:infocount] = 0 + else + homework[:infocount] = 1 + end + end + @b_sort == "asc" ? (@homeworks = @homeworks.sort{|x,y| x[:infocount] <=> y[:infocount] }) : (@homeworks = @homeworks.sort{|x,y| y[:infocount] <=> x[:infocount]}) + @homeworks = sortby_time_countcommon_nosticky @homeworks,"created_at" + else + @homeworks = @homeworks.order("#{@order} #{@b_sort}") + end + end + @limit = 10 + @is_remote = true + @hw_count = @homeworks.count + @hw_pages = Paginator.new @hw_count, @limit, params['page'] || 1 + @offset ||= @hw_pages.offset + @homeworks = paginateHelper @homeworks,@limit + @search = search + @property = params[:property] + respond_to do |format| + format.js + end + end + def user_feedback4show query = @user.journals_for_messages if params[:lastid]!=nil && !params[:lastid].empty? @@ -3247,6 +3344,7 @@ class UsersController < ApplicationController @join_syllabuses = syllabus_course_list_sort @join_syllabuses @my_syllabuses = @my_syllabuses.sort{|x,y| y[:last_update] <=> x[:last_update]} @join_syllabuses = @join_syllabuses.sort{|x,y| y[:last_update] <=> x[:last_update]} + @is_course = 1 #分页 # @limit = 10 @@ -3356,6 +3454,7 @@ class UsersController < ApplicationController @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1 @offset ||= @atta_pages.offset @projects = paginateHelper @projects,@limit + @is_project = 1 respond_to do |format| format.js diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 23a443925..c5ef8c24e 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -10,8 +10,8 @@ class WechatsController < ActionController::Base #邀请码 if join_class_request(request) sendBindClass(request, {invite_code: content}) - # elsif join_project_request(request) - # sendBindProject(request, {invite_code: content}) + elsif join_project_request(request) + sendBindProject(request, {invite_code: content}) else request.reply.text "您的意见已收到,非常感谢~ \n更多问题可以通过以下方式联系我们:\n官方QQ群:173184401\n我们会认真聆听您的意见和建议。" end @@ -49,7 +49,7 @@ class WechatsController < ActionController::Base # When no any on :scan responder can match subscribe user scaned scene_id on :event, with: 'scan' do |request| if request[:EventKey].present? - sendBindClass(request, {ticket: request[:Ticket]}) + checkTicket(request, {ticket: request[:Ticket]}) end end @@ -149,13 +149,13 @@ class WechatsController < ActionController::Base end on :click, with: 'JOIN_PROJECT' do |request, key| - request.reply.text "该功能将在近日开放,敬请期待!" - # uw = user_binded?(request[:FromUserName]) - # unless uw - # sendBind(request) - # else - # request.reply.text "请直接回复6位项目邀请码\n(不区分大小写):" - # end + # request.reply.text "该功能将在近日开放,敬请期待!" + uw = user_binded?(request[:FromUserName]) + unless uw + sendBind(request) + else + request.reply.text "请直接回复6位项目邀请码\n(不区分大小写):" + end end on :click, with: 'JOIN_CLASS' do |request, key| @@ -209,6 +209,39 @@ class WechatsController < ActionController::Base end end + def checkTicket(request,params) + begin + uw = user_binded?(request[:FromUserName]) + if !uw + return sendBind(request) + end + + course = nil + course = Course.where(qrcode: params[:ticket]).first if params[:ticket] + course = Course.where(invite_code: params[:invite_code]).first if params[:invite_code] + + if course + return join_class(params, uw.user, request) + else + project = nil + project = Project.where(qrcode: params[:ticket]).first if params[:ticket] + project = Project.where(invite_code: params[:invite_code]).first if params[:invite_code] + if project + return join_project(params, uw.user, request) + end + end + + raise "该二维码已失效" + + rescue => e + logger.error e.inspect + logger.error e.backtrace.join("\n") + return request.reply.text e + end + + + end + def default_msg(request) uw = user_binded?(request[:FromUserName]) if uw && uw.user @@ -273,9 +306,9 @@ class WechatsController < ActionController::Base role = 5 ps = ProjectsService.new - status = ps.join_project({invite_code: project.invite_code}, user) - if status[:state] != 0 - raise ProjectService::JoinProjectError.message(status) + status = ps.join_project({role:5, invite_code: project.invite_code}, user) + if status != 0 + raise ProjectsService::JoinProjectError.message(status) end creator = User.find(project.user_id) @@ -284,7 +317,7 @@ class WechatsController < ActionController::Base content: "项目名称:#{project.name}\n发起人:#{creator.name}\n进入项目,和小伙伴轻松的研发吧!"} } return request.reply.news(news) do |article, n, index| # article is return object url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities#/project?id='+project.id.to_s}&response_type=code&scope=snsapi_base&state=myproject#wechat_redirect" - pic_url = "#{ROOT_URL}/images/wechat/class.jpg" + pic_url = "#{ROOT_URL}/images/wechat/project.jpg" article.item title: "#{n[:title]}", description: n[:content], pic_url: pic_url, @@ -350,7 +383,15 @@ class WechatsController < ActionController::Base render 'wechats/user_activities', layout: nil end + + def user_activities + + @appid = Wechat.config.appid + ## sign + + @sign_params = wechat.jsapi_ticket.signature(current_url) + session[:wechat_code] = params[:code] if params[:code] @path = '/'+(params[:state] || '') open_id = get_openid_from_code(params[:code]) rescue @@ -398,6 +439,9 @@ class WechatsController < ActionController::Base uw = UserWechat.where(openid: openid).first end + def current_url + "#{request.protocol}#{request.host_with_port}#{request.fullpath}" + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d64d95223..b225c3099 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -43,6 +43,12 @@ module ApplicationHelper user.nil? ? User.find(2) : user end + # 通过系统外部用户名查找用户,如果用户不存在则用邮箱替换 + def get_user_by_login_and login + user = User.find_by_login(login) + user.nil? ? User.find(2) : user + end + # 历史数据(老版本库数据)处理完则可以修改该放放 def get_rep_identifier_by_project project identifier = Repository.where(:project_id => project.id, :type => "Repository::Gitlab").first.try(:identifier) @@ -814,6 +820,18 @@ module ApplicationHelper return @result end + # 必须是项目成,项目必须提交过代码 + def allow_pull_request project + return false if project.gpid.nil? + g = Gitlab.client + count = g.user_static(project.gpid, :rev => "master").count + if User.current.member_of?(project) && count > 0 + true + else + false + end + end + # 判断版本库是否初始为gitlab def rep_is_gitlab?(project) rep = project.repositories.where("type =?", "Repository::Gitlab") @@ -2736,7 +2754,39 @@ module ApplicationHelper else link_to "作品(#{count})",student_work_index_url_in_org(homework.id),:class => "c_blue" end + end + #根据传入作业确定显示为提交作品、补交作品、查看作品等 + def student_for_homework_common homework + if User.current.member_of_course?(homework.course) + work = cur_user_works_for_homework homework + project = cur_user_projects_for_homework homework + if work.nil? && Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") + if homework.homework_type ==3 && project.nil? && homework.homework_detail_group.base_on_project == 1 + link_to "查看详情", homework_common_index_path(:course_id => homework.course_id), :class => 'hw_btn_green2 fr mt5',:title => '查看分组作业详情', :target => '_blank' + else + link_to "提交作品", new_student_work_url_without_domain(homework.id),:class => 'hw_btn_green2 fr mt5', :target => '_blank' + end + elsif work.nil? && Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") < Time.now.strftime("%Y-%m-%d") + if homework.homework_type ==3 && project.nil? && homework.homework_detail_group.base_on_project == 1 + link_to "查看详情", homework_common_index_path(:course_id => homework.course_id), :class => 'hw_btn_green2 fr mt5',:title => '查看分组作业详情', :target => '_blank' + else + link_to "补交作品", new_student_work_url_without_domain(homework.id),:class => 'btn_orange_big fr mt5', :target => '_blank' + end + else + if homework.homework_detail_manual && homework.homework_detail_manual.comment_status == 2 #匿评作业,且作业状态不是在开启匿评之前 + link_to "作品匿评", student_work_index_url_in_org(homework.id), :class => 'hw_btn_green2 fr mt5', :title => "开启匿评后不可修改作品", :target => '_blank' + elsif homework.homework_detail_manual && homework.homework_detail_manual.comment_status == 3 + link_to "查看作品",student_work_index_url_in_org(homework.id), :class => 'hw_btn_green2 fr mt5', :title => "匿评已结束", :target => '_blank' + elsif homework.homework_type == 2 && Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d")#编程作业不能修改作品 + link_to "修改作品", new_student_work_url_without_domain(homework.id),:class => 'hw_btn_green2 fr mt5', :target => '_blank' + elsif Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") && work.user_id == User.current.id + link_to "修改作品", edit_student_work_url_without_domain(work.id),:class => 'hw_btn_green2 fr mt5', :target => '_blank' + else + link_to "查看作品", student_work_index_url_in_org(homework.id), :class => 'hw_btn_green2 fr mt5', :title => "作业截止后不可修改作品", :target => '_blank' + end + end + end end def relate_project homework,is_teacher,is_in_course,user_activity_id,course_activity @@ -2788,6 +2838,17 @@ module ApplicationHelper homework.student_work_projects.where("user_id = ?",User.current).first end + #获取当前作业的提交截止时间/互评截止时间 + def cur_homework_end_time homework + str = "" + if homework.anonymous_comment == 0 && homework.end_time < Date.today && homework.homework_detail_manual + str = "互评截止:#{format_date homework.homework_detail_manual.evaluation_end}" + else + str = "提交截止:#{homework.end_time ? (format_date homework.end_time) : ' -- '}" + end + str + end + def file_preview_tag(file, html_options={}) if %w(pdf pptx doc docx xls xlsx).any?{|x| file.filename.downcase.end_with?(x)} link_to '预览', download_named_attachment_path(file.id, file.filename, preview: true),html_options diff --git a/app/helpers/pull_requests_helper.rb b/app/helpers/pull_requests_helper.rb new file mode 100644 index 000000000..82d4edc0f --- /dev/null +++ b/app/helpers/pull_requests_helper.rb @@ -0,0 +1,17 @@ +module PullRequestsHelper + + # 获取diff内容行号 + def diff_line_num content + content.scan(/@@ -(\d+),\d+ \+\d+,\d+ @@/).first.nil? ? "" : content.scan(/@@ -(\d+),\d+ \+\d+,\d+ @@/).first.join("").to_i + end + + # 处理内容 + def diff_content content + content.gsub!(/.*@@ -\d+,\d+ \+\d+,\d+ @@\n/m,'') + end + + def get_user_name user_id + User.find(user_id).try(:login) + end + +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index c21446e86..398fb8510 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -80,6 +80,19 @@ module UsersHelper # end end + def applied_project_status applied_message + case applied_message.status + when 4 + "被拒绝" + when 5 + "您已拒绝" + when 6 + "已通过" + when 7 + "您已同意" + end + end + # 项目申请消息通过状态判断tip描述 def applied_project_tip applied_message case applied_message.status @@ -108,6 +121,19 @@ module UsersHelper end end + def applied_project_tip_header applied_message + case applied_message.status + when 4 + "婉拒您" + when 5,3,2,1,7 + "申请:" + when 6 + "同意您" + end + end + + + def get_resource_origin attach type = attach.container_type content = attach.container @@ -758,4 +784,17 @@ module UsersHelper end syllabuses end + + #获取按作业的发布者排序的用户ID + def hw_publisher_user_ids search, course_ids + if search && search != "" + all_homeworks = HomeworkCommon.where("course_id in #{course_ids}") + all_user_ids = all_homeworks.map{|hw| hw.user_id} + user_str_ids = search_user_by_name all_user_ids, search + user_ids = user_str_ids.empty? ? "(-1)" : "(" + user_str_ids.join(",") + ")" + else + user_ids = "(-1)" + end + return user_ids + end end diff --git a/app/models/applied_project.rb b/app/models/applied_project.rb index b1945a937..a6eef8417 100644 --- a/app/models/applied_project.rb +++ b/app/models/applied_project.rb @@ -1,3 +1,4 @@ +#coding=utf-8 class AppliedProject < ActiveRecord::Base attr_accessible :project_id, :user_id, :role @@ -11,6 +12,14 @@ class AppliedProject < ActiveRecord::Base def send_appliled_message self.project.managers.each do |member| self.applied_messages << AppliedMessage.new(:user_id => member.user_id, :status => true, :viewed => false, :applied_user_id => self.user_id, :role => self.role, :project_id => self.project_id) + + #----------------微信通知---------------------- + count = ShieldWechatMessage.where("container_type='User' and container_id=#{member.user_id} and shield_type='Project' and shield_id=#{self.project_id}").count + if count == 0 + ws = WechatService.new + ws.project_review_notice member.user_id, "review_project_member", self.project_id, "项目成员审批通知。", self.project.name, self.user.show_name, format_time(Time.now),"点击查看申请详情。",self.user.id + end + #-------------------------------------------- end # end end diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index a915b1545..86aab8260 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -34,6 +34,20 @@ class HomeworkCommon < ActiveRecord::Base after_save :act_as_course_activity after_destroy :delete_kindeditor_assets + #作业类型 + def homework_type_ch + type = self.homework_type + case type + when 1 + type = "普通" + when 2 + type = "编程" + when 3 + type = "分组" + end + type + end + def act_as_activity self.acts << Activity.new(:user_id => self.user_id) end diff --git a/app/models/project.rb b/app/models/project.rb index 67f010210..0751c902f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -928,6 +928,18 @@ class Project < ActiveRecord::Base code end + def generate_qrcode + ticket = self.qrcode + if !ticket || ticket.size < 10 + response = Wechat.api.qrcode_create_scene(invite_code, 2592000) + logger.debug "response = #{response}" + self.qrcode = response['ticket'] + save! + ticket = qrcode + end + ticket + end + private def after_parent_changed(parent_was) @@ -1224,8 +1236,7 @@ class Project < ActiveRecord::Base # 创建项目后在项目下同步创建一个讨论区 def create_board_sync @board = self.boards.build - self.name=" #{l(:label_borad_project) }" - @board.name = self.name + @board.name = " #{l(:label_borad_project) }" @board.description = self.name.to_s if @board.save logger.debug "[Project Model] ===> #{@board.to_json}" diff --git a/app/models/student_work.rb b/app/models/student_work.rb index 3fcc9fb8a..3ba3ee2b2 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -1,6 +1,6 @@ #学生提交作品表 class StudentWork < ActiveRecord::Base - attr_accessible :name, :description, :homework_common_id, :user_id, :final_score, :teacher_score, :student_score, :teaching_asistant_score, :project_id, :is_test, :simi_id, :simi_value + attr_accessible :name, :description, :homework_common_id, :user_id, :final_score, :teacher_score, :student_score, :teaching_asistant_score, :project_id, :is_test, :simi_id, :simi_value, :work_status belongs_to :homework_common belongs_to :user diff --git a/app/models/user.rb b/app/models/user.rb index a4b7f3b25..57663f3eb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -926,6 +926,13 @@ class User < Principal !role.blank? end + #是否具有学生角色 + def has_student_role(course) + member = course.members.where("user_id = #{self.id}").first + role = MemberRole.where("member_id = #{member.id} and role_id = 10") + !role.blank? + end + # Return true if the user is allowed to do the specified action on a specific context # Action can be: # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index ce3157d5f..c6854f3dd 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -101,16 +101,151 @@ class CoursesService gender = m.user.user_extensions.gender.nil? ? 0 : m.user.user_extensions.gender work_unit = get_user_work_unit m.user location = get_user_location m.user - users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, - :work_unit => work_unit, :mail => m.user.mail, :location => location, - role_name: m.roles.first.name, - name: m.user.show_name, - roles_id: m.roles[0].id, - :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname} + + role_ids = [] + m.roles.each do |r| + role_ids << r.id + end + + #双重身份 学生列表中不显示 + unless (params[:role] == '2' && role_ids.length >= 2) + users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, + :work_unit => work_unit, :mail => m.user.mail, :location => location, + role_name: m.roles.first.name, + name: m.user.show_name, + roles_id: role_ids.include?(7) ? 7 : (role_ids.include?(9) ? 9 : 10 ), + :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname} + end + end users end + def reviewers_list course_id + reviewers = [] + c = Course.find(course_id) + + if c + messages = CourseMessage.where("course_id=? and course_message_type = 'JoinCourseRequest' and status = 0 ",course_id) + + messages.each do |m| + user = User.find(m.course_message_id) + + if user + img_url = url_to_avatar(user) + gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender + work_unit = get_user_work_unit user + location = get_user_location user + roles_ids = m.content.split(",") + reviewers << {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, + :work_unit => work_unit, :mail => user.mail, :location => location, + role_name: "", + name: user.show_name, + roles_id: roles_ids.include?("7") ? 7 : 9, + :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} + end + end + + end + + reviewers + end + + def get_reviewer_info params + status = -1 + info = nil + c = Course.find(params[:course_id]) + if c + messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' ",params[:course_id],params[:user_id]).last + if messages + #status 0未处理 1同意 2 通过 + status = messages.status + user = User.find(params[:user_id]) + if user + img_url = url_to_avatar(user) + gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender + work_unit = get_user_work_unit user + location = get_user_location user + roles_ids = messages.content.split(",") + info = {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, + :work_unit => work_unit, :mail => user.mail, :location => location, + role_name: "", + name: user.show_name, + roles_id: roles_ids.include?("7") ? 7 : 9, + :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} + end + end + end + + {status:status,reviewer:info} + end + + def deal_join_apply params,current_user + status = -1 + message = "" + + c = Course.find(params[:course_id]) + + if c + messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' and status = 0 ",params[:course_id],params[:user_id]).first + if messages + apply_user = User.find(params[:user_id]) + ids = messages.content.split(",") # content保存的是申请的职位角色 + integer_ids = [] + ids.each do |role_id| + integer_ids << role_id.to_i + end + + if params[:type] == 0 + + if apply_user.member_of_course?(c) + #将角色改为老师或者教辅 + member = c.members.where(:user_id=>apply_user.id).all[0] + member.role_ids = integer_ids + #删除为学生的记录 + unless member.role_ids.include?(10) + joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,c.id) + joined.each do |join| + join.delete + end + end + + member.course_group_id = 0 + member.save + CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>1) + messages.update_attributes(:status=>1,:viewed=>1) + else + members = [] + members << Member.new(:role_ids => integer_ids, :user_id => apply_user.id) + c.members << members + CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>1) + messages.update_attributes(:status=>1,:viewed=>1) + end + if integer_ids.include?(9) + message = "您已同意教师"+apply_user.show_name+",加入班级" + else + message = "您已同意助教"+apply_user.show_name+",加入班级" + end + else + CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>2) + messages.update_attributes(:status=>2,:viewed=>1) + if integer_ids.include?(9) + message = "您已拒绝教师"+apply_user.show_name+",加入班级" + else + message = "您已拒绝助教"+apply_user.show_name+",加入班级" + end + end + status = 0 + else + message = "该申请不存在或已被处理" + end + else + message = "该班级不存在或已被删除" + end + + {:status => status,:message => message} + end + #获取用户的工作单位 def get_user_work_unit user work_unit = "" @@ -329,15 +464,17 @@ class CoursesService 0, '加入成功', 1, '密码错误', 2, '班级已过期 请联系班级管理员重启班级。', - 3, '您已经加入了班级', + 3, '您已经是该班级的成员了', 4, '您的邀请码不正确', 5, '您还未登录', - 6, '申请成功,请等待审核完毕', + 6, '您的申请已提交,请等待管理员审批', 7, '您已经发送过申请了,请耐心等待', 8, '您已经是该班级的教师了', 9, '您已经是该班级的教辅了', 10, '您已经是该班级的管理员了', 11, '该班级不存在或已被删除啦', + 12, '您已经发送过申请了,请耐心等待', + 13, '您的申请已提交,请等待管理员审批', '未知错误,请稍后再试' ] end @@ -460,15 +597,31 @@ class CoursesService is_stu = true end #如果已经发送过消息了,那么就要给个提示 - if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_str}' and course_message_id = #{User.current.id} and course_id = #{course.id} and status = 0").count != 0 + if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_str}' and course_message_id = #{current_user.id} and course_id = #{course.id} and status = 0").count != 0 if is_stu @state = 12 else @state = 7 end else - Mailer.run.join_course_request(course, User.current, params[:role]) - CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> role_str,:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest',:status=>0) + Mailer.run.join_course_request(course, current_user, params[:role]) + CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> role_str,:course_message_id=>current_user.id,:course_message_type=>'JoinCourseRequest',:status=>0) + + #----------------微信通知---------------------- + + if role_ids.include?("7") || role_ids.include?("9") + tea_user = User.find(course.tea_id) + count = ShieldWechatMessage.where("container_type='User' and container_id=#{tea_user.id} and shield_type='Course' and shield_id=#{course.id}").count + if count == 0 + + rolename = role_ids.include?("7") ? "助教" : "教师" + content = current_user.show_name + "申请以"+rolename+"身份加入班级,等待您的审批。" + ws = WechatService.new + ws.class_notice tea_user.id, "review_class_member", course.id, "班级成员审批通知。", course.name, tea_user.show_name, format_time(Time.now), content, "点击查看申请详情。",current_user.id + end + end + #-------------------------------------------- + if is_stu @state = 13 else @@ -1054,20 +1207,21 @@ class CoursesService # end #修改班级成员角色 - def modify_user_course_role params + def modify_user_course_role params,roles_id status = -1 c = Course.find("#{params[:id]}") - member = c.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first + # member = c.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first + member = c.members.where("user_id=?",params[:user_id]).first if member - role = Role.find(params[:role_id]) + member.role_ids = roles_id - member.member_roles[0].role_id = params[:role_id] + role = Role.find(roles_id[0]) # 这里的判断只能通过角色名,可以弄成常量 - if params[:role_id] == 10 + if roles_id && roles_id.include?(10) StudentsForCourse.create(:student_id => params[:user_id], :course_id =>params[:id]) else joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:id]) @@ -1090,7 +1244,7 @@ class CoursesService Role.givable.all[3..5] - if member.member_roles[0].save + if member.save status = 0 end end diff --git a/app/services/projects_service.rb b/app/services/projects_service.rb index 2441ea9e5..1b342c122 100644 --- a/app/services/projects_service.rb +++ b/app/services/projects_service.rb @@ -3,6 +3,9 @@ class ProjectsService include ApplicationHelper + include ApiHelper + include ActionView::Helpers::DateHelper + include ProjectsHelper #获取指定用户的项目列表 def user_projects(user) @@ -13,8 +16,8 @@ class ProjectsService #显示项目 def show_project(params,current_user) project = Project.find(params[:id]) - # project.generate_invite_code - # project.generate_qrcode + project.generate_invite_code + project.generate_qrcode project end @@ -101,20 +104,22 @@ class ProjectsService class JoinProjectError < Errors define_error [ - 0, '加入成功', + 0, '您已成功加入项目', 1, '您的邀请码不正确', 2, '您还未登录', 3, '您已经是该项目的管理人员', 4, '您已经是该项目的开发人员', 5, '您已经是该项目的报告人员', 6, '该项目不存在或已被删除啦', + 7, '您的申请已提交,请等待管理员审批', + 8, '您已经发送过申请了,请耐心等待', '未知错误,请稍后再试' ] end def join_project params,current_user status = -1 - project = project.find_by_invite_code(params[:invite_code]) if params[:invite_code] + project = Project.find_by_invite_code(params[:invite_code]) if params[:invite_code] if project if project[:is_delete] == 1 @@ -125,21 +130,166 @@ class ProjectsService status = member.member_roles[0].role_id else if params[:invite_code].present? - members = [] - members << Member.new(:role_ids => [5], :user_id => current_user.id) - project.members << members - projectInfo = ProjectInfo.new(:user_id => current_user.id, :project_id => project.id) - projectInfo.save - status = 0 + + if params[:role] == 5 + members = [] + user_grades = [] + project_info = [] + + user_grades << UserGrade.new(:user_id => current_user.id, :project_id => project.id) + project.user_grades << user_grades unless user_grades.first.user_id.nil? + + members << Member.new(:role_ids => ["5"], :user_id => current_user.id) + project.members << members + + project_info << ProjectInfo.new(:user_id => current_user.id, :project_id => project.id) + project.project_infos << project_info + + status = 0 + else + if !AppliedProject.where(:project_id => project.id, :user_id => current_user.id).first.nil? + status = 8 + else + AppliedProject.create(:user_id => current_user.id, :project_id => project.id, :role => params[:role]) + + status = 7 + end + end else status = 4 end end end else - status = 4 + status = 1 end status end + def get_project_review_members(project,role_id,current_user) + review_members = [] + + if role_id == 3 || role_id == 4 + + #AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, + #:applied_type => "AppliedProject") + + + apply_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :role=>role_id) + + apply_messages.each do |m| + user = User.find(m.applied_user_id) + + if user + img_url = url_to_avatar(user) + gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender + work_unit = get_user_work_unit user + location = get_user_location user + review_members << {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, + :work_unit => work_unit, :mail => user.mail, :location => location, + role_name: "", + name: user.show_name, + roles_id: role_id, + :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname,:real_name=>user.realname} + end + end + end + + review_members + end + + def get_reviewer_info params,current_user + status = -1 + info = nil + project = Project.find(params[:project_id]) + if project + # messages = AppliedProject.where(:project_id=> project.id, :user_id=>params[:user_id]).first + #status 1未处理 5拒绝 7同意 + applied_message = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :applied_user_id=>params[:user_id],:applied_type => "AppliedProject").last + if applied_message + status = applied_message.status + user = User.find(params[:user_id]) + if user + img_url = url_to_avatar(user) + gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender + work_unit = get_user_work_unit user + location = get_user_location user + info = {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, + :work_unit => work_unit, :mail => user.mail, :location => location, + role_name: "", + name: user.show_name, + roles_id: applied_message.role, + :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} + end + end + end + + {status:status,reviewer:info} + end + + def deal_join_apply params,current_user + status = -1 + message = "" + + project = Project.find(params[:project_id]) + user = User.find(params[:user_id]) + if project + applied_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :applied_user_id=>user.id,:applied_type => "AppliedProject") + apply_message = applied_messages.first + if apply_message + if user.member_of?(project) + message = "已经是该项目的成员了" + applied_messages.update_all(:status=>7) + else + applied_project = apply_message.applied + ap_role = applied_project.try(:role) + if ap_role + rolename = ap_role == 3 ? "管理人员" : "开发人员" + if params[:type] == 0 + #同意 + members = [] + user_grades = [] + project_info = [] + members << Member.new(:role_ids => ["#{ap_role}"], :user_id => user.id) + user_grades << UserGrade.new(:user_id => user.id, :project_id => project.id) + role = Role.find(ap_role) + project_info << ProjectInfo.new(:project_id => project.id, :user_id => user.id) if role.allowed_to?(:is_manager) + project.members << members + project.project_infos << project_info + project.user_grades << user_grades unless user_grades.first.user_id.nil? + + # 添加成功后所有管理员收到的消息状态都要更新 + applied_messages.update_all(:status => 7, :viewed => true) + # 添加成功后,申请人收到消息 + AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id , + :status => 6, :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id) + + message = "您已同意"+rolename+user.show_name+",加入项目" + + else + #拒绝 + AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 4, + :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id) + + applied_messages.update_all(:status => 5, :viewed => true) + applied_project.delete + + message = "您已拒绝"+rolename+user.show_name+",加入项目" + end + + status = 0 + else + message = "该申请不存在或已被处理" + end + end + else + message = "该申请不存在或已被处理" + end + else + message = "该项目不存在或已被删除" + end + + {:status => status,:message => message} + end + end diff --git a/app/services/wechat_service.rb b/app/services/wechat_service.rb index 5f52aea49..9a6351391 100644 --- a/app/services/wechat_service.rb +++ b/app/services/wechat_service.rb @@ -139,11 +139,16 @@ class WechatService data end - def three_keys_template(openid, template_id, type, id, first, key1, key2, key3, remark="") + def three_keys_template(openid, template_id, type, id, first, key1, key2, key3, remark="",uid) + tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}" + if uid && uid != 0 + tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}"+ "&user_id="+uid.to_s + end + data = { touser:openid, template_id:template_id, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}",#/assets/wechat/app.html#/#{type}/#{id} + url:tmpurl,#/assets/wechat/app.html#/#{type}/#{id} topcolor:"#FF0000", data:{ first: { @@ -171,11 +176,16 @@ class WechatService data end - def four_keys_template(openid, template_id, type, id, first, key1, key2, key3, key4, remark="") + def four_keys_template(openid, template_id, type, id, first, key1, key2, key3, key4, remark="",uid) + tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}" + if uid && uid != 0 + tmpurl = "#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}?id=#{id}"+ "&user_id="+uid.to_s + end + data = { touser:openid, template_id:template_id, - url:"#{Setting.protocol}://#{Setting.host_name}/wechat/user_activities#/#{type}/#{id}", #/assets/wechat/app.html#/#{type}/#{id} + url:tmpurl, #/assets/wechat/app.html#/#{type}/#{id} topcolor:"#FF0000", data:{ first: { @@ -269,10 +279,10 @@ class WechatService end end - def class_notice(user_id, type, id, first, key1, key2, key3, key4, remark="") + def class_notice(user_id, type, id, first, key1, key2, key3, key4, remark="",uid=0) uw = UserWechat.where(user_id: user_id).first unless uw.nil? - data = four_keys_template uw.openid,Wechat.config.class_notice, type, id, first, key1, key2, key3, key4, remark + data = four_keys_template uw.openid,Wechat.config.class_notice, type, id, first, key1, key2, key3, key4, remark, uid begin req = Wechat.api.template_message_send Wechat::Message.to(uw.openid).template(data) rescue Exception => e @@ -360,4 +370,17 @@ class WechatService end end + def project_review_notice(user_id, type, id, first, key1, key2,key3,remark="",uid=0) + uw = UserWechat.where(user_id: user_id).first + unless uw.nil? + data = three_keys_template uw.openid,Wechat.config.project_review_notice, type, id, first, key1, key2, key3, remark,uid + begin + req = Wechat.api.template_message_send Wechat::Message.to(uw.openid).template(data) + rescue Exception => e + Rails.logger.error "[project_review_notice] ===> #{e}" + end + Rails.logger.info "send over. #{req}" + end + end + end \ No newline at end of file diff --git a/app/views/applied_project/_applied_project_tip.js.erb b/app/views/applied_project/_applied_project_tip.js.erb index c2bc555db..24eb9b036 100644 --- a/app/views/applied_project/_applied_project_tip.js.erb +++ b/app/views/applied_project/_applied_project_tip.js.erb @@ -17,10 +17,16 @@
您的申请已提交,请等待项目管理员审批
<% elsif @flag == 5 %>您已经申请加入该项目了,请耐心等待
+ <% elsif @flag == 6 %> +您已成功加入项目
<% end %>