diff --git a/app/controllers/contestant_works_controller.rb b/app/controllers/contestant_works_controller.rb index 50adc24b1..95df7db36 100644 --- a/app/controllers/contestant_works_controller.rb +++ b/app/controllers/contestant_works_controller.rb @@ -5,7 +5,7 @@ class ContestantWorksController < ApplicationController require 'bigdecimal' require "base64" before_filter :find_contestwork, :only => [:new, :index, :create, :new_student_work_project,:student_work_project,:cancel_relate_project, - :search_course_students,:work_canrepeat,:add_group_member,:change_project] + :delete_work,:search_contest_students,:work_canrepeat,:add_group_member,:change_project] before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work,:retry_work,:revise_attachment] before_filter :member_of_contest, :only => [:new, :create, :show] before_filter :author_of_work, :only => [:edit, :update, :destroy] @@ -13,11 +13,80 @@ class ContestantWorksController < ApplicationController before_filter :is_logged, :only => [:index] def new + #更新消息 + noEvaluation = @contestwork.contest_messages.where("user_id =? and viewed =?", User.current.id, 0) + noEvaluation.update_all(:viewed => true) + @user = User.current + @student_work = ContestantWork.new + respond_to do |format| + format.html{ render :layout => "base_contests"} + end end def index + # 作业消息状态更新? + work_messages = ContestMessage.where(:user_id => User.current.id, :viewed => 0, :contest_message_id => @contestwork.id, :contest_message_type => "Work") + work_messages.update_all(:viewed => true) + studentwork_messages = ContestMessage.where(:user_id => User.current.id, :viewed => 0, :contest_id => @contestwork.contest, :contest_message_type => "ContestantWork") + studentwork_messages.update_all(:viewed => true) + # 作品打分消息状态更新 + #studentworks_scores = ContestMessage.where("user_id =? and contest_id =? and contest_message_type =? and viewed =?", User.current.id, @contestwork.contest, "StudentWorksScore", 0) + #studentworks_scores.update_all(:viewed => true) + # 作品评论消息状态更新 + #journals_for_teacher = ContestMessage.where("user_id =? and contest_id =? and contest_message_type =? and viewed =?", User.current.id, @contestwork.contest, "JournalsForMessage", 0) + #journals_for_teacher.update_all(:viewed => true) + ################################################################################################################## + @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name].to_s.strip || "",params[:group] + @homework_commons = @contest.works.where("publish_time <= ?",Time.now.strftime("%Y-%m-%d")).order("created_at desc") + @all_homework_commons = @contest.works.order("created_at desc") + @is_teacher = User.current.admin_of_contest?(@contest) || User.current.admin? + @is_judge = User.current.judge_of_contest?(@contest) + + @show_all = false + + if @is_teacher || @is_judge + # if @order == 'lastname' + # @stundet_works = search_homework_member @homework.student_works.no_copy.select("student_works.*,student_works.work_score as score").joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name + # elsif @order == 'student_id' + # @stundet_works = search_homework_member @homework.student_works.no_copy.select("student_works.*,student_works.work_score as score").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name + # else + @stundet_works = @contestwork.contestant_works.no_copy.select("contestant_works.*,contestant_works.work_score as score").includes(:user => {:user_extensions => []}, :project => {}, :contestant_work_scores => {}).order("#{@order} #{@b_sort}") + #end + @show_all = true + elsif User.current.member_of_contest?(@contest) + if @contestwork.work_type == 3 + pro = @contestwork.contestant_work_projects.where(:user_id => User.current.id).first + if pro.nil? + @stundet_works = [] + else + @stundet_works = @contestwork.contestant_works.select("contestant_works.*,contestant_works.work_score as score").where(:id => pro.contestant_work_id) + end + else + @stundet_works = @contestwork.contestant_works.select("contestant_works.*,contestant_works.work_score as score").where(:user_id => User.current.id) + end + else + render_403 + return + end + @student_work_count = @contestwork.contestant_works.has_committed.select("contestant_works.*,contestant_works.work_score as score").order("#{@order} #{@b_sort}").count + + @score = @b_sort == "desc" ? "asc" : "desc" + @is_focus = params[:is_focus] ? params[:is_focus].to_i : 0 + # 消息传过来的ID + @message_student_work_id = params[:student_work_id] + @left_nav_type = 3 + @tab = params[:tab].to_i + respond_to do |format| + format.js + format.html + # format.xls { + # filename = "#{@contest.user.lastname.to_s + @contest.user.firstname}_#{@contest.name}_#{@contestwork.name}#{l(:excel_homework_list)}.xls" + # send_data(homework_to_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present", + # :filename => filename_for_content_disposition(filename)) + # } + end end def show @@ -25,7 +94,72 @@ class ContestantWorksController < ApplicationController end def create + # 提交作品前先判断是否已经提交 + @has_commit = false; + if hsd_committed_work?(User.current.id, @contestwork.id) + @work = ContestantWork.where("user_id =? and work_id =?", User.current.id, @contestwork.id).first + @has_commit = true; + #flash[:notice] = l(:notice_successful_create) + #redirect_to edit_student_work_url(params[:student_work]) + respond_to do |format| + format.js + end + return + end + if params[:student_work] + @submit_result = true + student_work = ContestantWork.find(params[:student_work_id]) if params[:student_work_id] + student_work ||= ContestantWork.new + student_work.name = params[:student_work][:name] == "#{@contestwork.name}的作品提交(可修改)" ? "#{@contestwork.name}的作品提交" : params[:student_work][:name] + student_work.description = params[:student_work][:description] + student_work.work_id = @contestwork.id + student_work.user_id = User.current.id + student_work.commit_time = Time.now + student_work.save_attachments(params[:attachments]) + render_attachment_warning_if_needed(student_work) + if @contestwork.work_type == 3 && @contestwork.work_detail_group.base_on_project + @student_work_project = @contestwork.contestant_work_projects.where("user_id = #{User.current.id}").first + student_work.project_id = @student_work_project.project_id + end + #提交作品时,计算是否迟交 + student_work.work_status = Time.parse(@contestwork.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(Time.now.to_s).strftime("%Y-%m-%d") ? 2 : 1 + if student_work.save + if @contestwork.work_type == 3 + if @contestwork.work_detail_group.base_on_project + @student_work_project.contestant_work_id = student_work.id + @student_work_project.save + else + stu_project = ContestantWorkProject.new(:work_id => @contestwork.id, :contestant_work_id => student_work.id, :project_id => student_work.project_id, :user_id => student_work.user_id, :is_leader => 1, :contest_id => @contestwork.contest_id) + stu_project.save + end + members = params[:group_member_ids].split(',') + for i in 1 .. members.count-1 + stu_work = ContestantWork.new(:name => student_work.name, :description => student_work.description,:user_id =>members[i].to_i, :work_id => @contestwork.id, :project_id => student_work.project_id, :work_status => 3, :commit_time => student_work.commit_time) + if stu_work.save + stu_project = ContestantWorkProject.new(:work_id => @contestwork.id, :contestant_work_id => student_work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => members[i].to_i, :is_leader => 0, :contest_id => @contestwork.contest_id) + stu_project.save + end + end + end + @contestwork.update_column(:updated_at, Time.now) + update_contest_activity(@contestwork.class,@contestwork.id) + update_user_activity(@contestwork.class,@contestwork.id) + + contest_message = ContestMessage.new(:user_id =>User.current.id,:content=>"new",:contest_message_id=>student_work.id,:contest_id => @contest.id,:contest_message_type=>"ContestantWork", :status => 9) #作品提交记录 + contest_message.save + + @student_work = ContestantWork.where(work_id: @contestwork.id, user_id: User.current.id).first + respond_to do |format| + format.js + end + return + end + end + @submit_result = false + respond_to do |format| + format.js + end end def edit @@ -40,6 +174,72 @@ class ContestantWorksController < ApplicationController end + def delete_work + @work = ContestantWork.where("user_id =? and work_id =?", User.current.id, @contestwork.id).first + if @work + @work.destroy + if @contestwork.work_type == 3 && @contestwork.work_detail_group.base_on_project + pros = @work.contestant_work_projects.where("is_leader = 0") + pros.each do |pro| + pro.destroy + end + project = @work.contestant_work_projects.where("is_leader = 1").first + project.update_attributes(:contestant_work_id => nil) + elsif @contestwork.work_type == 3 && !@contestwork.work_detail_group.base_on_project + @work.contestant_work_projects.each do |pro2| + pro2.destroy + end + end + end + redirect_to works_path(:contest => @contestwork.contest_id) + end + + def retry_work + if @contestwork.work_type == 3 + pros = @work.contestant_work_projects.where("is_leader = 0") + user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")" + student_works = @contestwork.contestant_works.where("user_id in #{user_ids}") + student_works.delete_all + pros.delete_all + + project = @work.contestant_work_projects.where("is_leader = 1").first + if @contestwork.work_detail_group.base_on_project + project.update_attributes(:contestant_work_id => nil) + else + project.destroy + end + end + @work.destroy + @work.attachments.destroy_all + @work.contest_messages.destroy_all + + @student_work = ContestantWork.new + respond_to do |format| + format.js + end + end + + #查找竞赛中的参赛者 + def search_contest_students + name = "" + unless params[:name].nil? + name = params[:name] + end + if !@contestwork.work_detail_group.base_on_project + all_student_ids = "(" + @contestwork.contest.contestants.map{|student| student.student_id}.join(",") + ")" + else + pro = Project.find @contestwork.contestant_work_projects.where("user_id=?",User.current.id).first.project_id + all_student_ids = "(" + pro.members.map{|member| member.user_id}.join(",") + ")" + end + all_students = User.where("id in #{all_student_ids}") + student_work_id = @contestwork.contestant_work_projects.where("user_id=? and contestant_work_id is not null",User.current.id).first.nil? ? -1 : @contestwork.contestant_work_projects.where("user_id=?",User.current.id).first.contestant_work_id + @commit_student_ids = @contestwork.contestant_works.where("id != #{student_work_id}").map{|student| student.user_id} + @users = searchstudent_by_name all_students,name + respond_to do |format| + format.js + end + end + def new_student_work_project @user_activity_id = params[:user_activity_id].to_i @hw_status = params[:hw_status].to_i @@ -80,6 +280,12 @@ class ContestantWorksController < ApplicationController end private + def hsd_committed_work?(user, homework) + sw = ContestantWork.where("user_id =? and work_id =?", user, homework).first + sw.nil? ? result = false : result = true + result + end + #获取题目 def find_contestwork @contestwork = Work.find params[:work] diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 806a2e13b..92858d45b 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -1344,22 +1344,6 @@ class StudentWorkController < ApplicationController end private - def searchstudent_by_name users, name - mems = [] - if name != "" - name = name.to_s.downcase - users.each do |m| - username = m.lastname.to_s.downcase + m.firstname.to_s.downcase - if(m.login.to_s.downcase.include?(name) || m.user_extensions[:student_id].to_s.downcase.include?(name) || username.include?(name)) - mems << m - end - end - else - mems = users - end - mems - end - def hsd_committed_work?(user, homework) sw = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", user, homework).first sw.nil? ? result = false : result = true diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5bb5e14d6..fd0cd6a5f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -37,6 +37,21 @@ module ApplicationHelper # super # end + # 获取竞赛的管理人员 + def contest_managers contest + contest.contest_members.select{|cm| cm.roles.to_s.include?("ContestManager")} + end + + # 获取竞赛的评委人员 + def contest_judges contest + contest.contest_members.select{|cm| cm.roles.to_s.include?("Judge")} + end + + # 获取竞赛的参赛人员 + def contest_contestants contest + contest.contest_members.select{|cm| cm.roles.to_s.include?("Contestant")} + end + # 获取多种类型的user用户名 def user_message_username user user.try(:show_name) @@ -4022,6 +4037,22 @@ def visable_contest_work contest work_num end +def searchstudent_by_name users, name + mems = [] + if name != "" + name = name.to_s.downcase + users.each do |m| + username = m.lastname.to_s.downcase + m.firstname.to_s.downcase + if(m.login.to_s.downcase.include?(name) || m.user_extensions[:student_id].to_s.downcase.include?(name) || username.include?(name)) + mems << m + end + end + else + mems = users + end + mems +end + def add_reply_adapter obj, options #modify by nwb #添加对课程留言的支持 diff --git a/app/models/contestant_work.rb b/app/models/contestant_work.rb index 1922391b9..3db9dd160 100644 --- a/app/models/contestant_work.rb +++ b/app/models/contestant_work.rb @@ -2,13 +2,16 @@ class ContestantWork < ActiveRecord::Base belongs_to :work belongs_to :user belongs_to :project - attr_accessible :commit_time, :description, :is_delete, :name, :work_score, :work_status + attr_accessible :commit_time, :description, :is_delete, :name, :work_score, :work_status, :work_id, :user_id, :project_id has_many :contestant_work_projects, :dependent => :destroy has_many :contestant_work_scores, :dependent => :destroy has_many :contest_messages, :class_name =>'ContestMessage', :as => :contest_message, :dependent => :destroy has_many :attachments, :dependent => :destroy + scope :has_committed, lambda{where("work_status != 0 and work_status != 3")} + scope :no_copy, lambda{where("work_status != 3")} + after_create :act_as_message acts_as_attachable diff --git a/app/models/contestant_work_project.rb b/app/models/contestant_work_project.rb index 5142ddaad..71d53c532 100644 --- a/app/models/contestant_work_project.rb +++ b/app/models/contestant_work_project.rb @@ -4,5 +4,5 @@ class ContestantWorkProject < ActiveRecord::Base belongs_to :contestant_work belongs_to :project belongs_to :user - attr_accessible :is_leader + attr_accessible :is_leader, :contest_id, :work_id, :contestant_work_id, :project_id, :user_id end diff --git a/app/models/contestant_work_score.rb b/app/models/contestant_work_score.rb index 8b1d2aefd..b051647a6 100644 --- a/app/models/contestant_work_score.rb +++ b/app/models/contestant_work_score.rb @@ -1,5 +1,5 @@ class ContestantWorkScore < ActiveRecord::Base belongs_to :contestant_work belongs_to :user - attr_accessible :comment, :reviewer_role, :score + attr_accessible :comment, :reviewer_role, :score, :contestant_work_id, :user_id end diff --git a/app/views/contestant_works/_choose_group_member.html.erb b/app/views/contestant_works/_choose_group_member.html.erb new file mode 100644 index 000000000..51ca02d7d --- /dev/null +++ b/app/views/contestant_works/_choose_group_member.html.erb @@ -0,0 +1,125 @@ +<% if @contestwork.work_detail_group %> +
+ 作品名称:<%=@student_work.name%> +
+ ++ 附件: + <% if @student_work.attachments.empty? %> + <%= "无附件"%> + <% else %> +
+ | 测试集输入 | +测试集输出 | +
---|---|---|
<%=i+1 %> | +<%=test.input %> |
+ <%=test.output %> |
+