|
|
|
|
#coding=utf-8
|
|
|
|
|
|
|
|
|
|
class ZipdownController < ApplicationController
|
|
|
|
|
#查找项目(课程)
|
|
|
|
|
# before_filter :find_project_by_bid_id, :only => [:assort]
|
|
|
|
|
#检查权限
|
|
|
|
|
#勿删 before_filter :authorize, :only => [:assort,:download_user_homework]
|
|
|
|
|
## 200M
|
|
|
|
|
MAX_DOWN_SIZE = 500 * 1024 * 1024
|
|
|
|
|
|
|
|
|
|
include ZipService
|
|
|
|
|
|
|
|
|
|
if RUBY_PLATFORM =~ /linux/
|
|
|
|
|
require 'pdfkit'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
#统一下载功能
|
|
|
|
|
def download
|
|
|
|
|
if User.current.logged?
|
|
|
|
|
begin
|
|
|
|
|
if params[:base64file]
|
|
|
|
|
file = decode64(params[:base64file])
|
|
|
|
|
send_file "#{OUTPUT_FOLDER}/#{file}", :filename => filename_for_content_disposition(file), :type => detect_content_type(file)
|
|
|
|
|
else
|
|
|
|
|
send_file "#{OUTPUT_FOLDER}/#{params[:file]}", :filename => filename_for_content_disposition(params[:filename]), :type => detect_content_type(params[:file])
|
|
|
|
|
end
|
|
|
|
|
rescue => e
|
|
|
|
|
render file: 'public/no_file_found.html'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
render_403
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
#一个作业下所有文件打包下载,只有admin和课程老师有权限
|
|
|
|
|
def assort
|
|
|
|
|
if params[:obj_class] == "Bid"
|
|
|
|
|
bid = Bid.find params[:obj_id]
|
|
|
|
|
#render_403 if User.current.allowed_to?(:as_teacher,bid.courses.first)
|
|
|
|
|
zipfile = checkfileSize(bid.homeworks) {
|
|
|
|
|
zip_bid bid
|
|
|
|
|
}
|
|
|
|
|
elsif params[:obj_class] == "Exercise"
|
|
|
|
|
exercise = Exercise.where(:id => params[:obj_id]).first
|
|
|
|
|
course = exercise.course
|
|
|
|
|
# render_403 unless User.current.allowed_to?(:as_teacher,course)
|
|
|
|
|
order,b_sort,name,group,comment,status = params[:order] || "end_at",params[:sort] || "desc",params[:name].to_s.strip || "",params[:ex_group], params[:ex_comment], params[:ex_status]
|
|
|
|
|
student_id = course.student.blank? ? "(-1)" : "(" + course.student.map{|student| student.student_id}.join(",") + ")"
|
|
|
|
|
if group
|
|
|
|
|
group_students = course.members.where(:course_group_id => group).joins("join users on members.user_id = users.id").select{|m| m.roles.to_s.include?("Student")}
|
|
|
|
|
|
|
|
|
|
if group_students.empty?
|
|
|
|
|
student_in_group = '(-1)'
|
|
|
|
|
else
|
|
|
|
|
student_in_group = '(' + group_students.map{ |member| member.user_id }.join(',') + ')'
|
|
|
|
|
end
|
|
|
|
|
exercise_users_list = exercise.exercise_users.where("user_id in #{student_in_group}").order("#{order} #{b_sort}")
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
exercise_users_list = exercise.exercise_users.where("user_id in #{student_id}").order("#{order} #{b_sort}")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless comment.blank?
|
|
|
|
|
if comment.include?('0')
|
|
|
|
|
exercise_users_list = exercise_users_list.where(:subjective_score => -1)
|
|
|
|
|
else
|
|
|
|
|
exercise_users_list = exercise_users_list.where("subjective_score != -1")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless status.blank?
|
|
|
|
|
exercise_users_list = exercise_users_list.where(:commit_status => status)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if name && name != ""
|
|
|
|
|
name = name.downcase
|
|
|
|
|
exercise_users_list = exercise_users_list.select{ |exercise| exercise.user.user_extensions[:student_id].to_s.downcase.include?(name) || (exercise.user[:lastname].to_s.downcase + exercise.user[:firstname].to_s.downcase).include?(name)}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
zipfile = zip_user_exercise exercise, exercise_users_list.select{|exercise| exercise.commit_status = 1}
|
|
|
|
|
|
|
|
|
|
file = decode64(zipfile[0][:base64file])
|
|
|
|
|
send_file "#{OUTPUT_FOLDER}/#{file}", :filename => filename_for_content_disposition(file), :type => detect_content_type(file)
|
|
|
|
|
elsif params[:obj_class] == "HomeworkCommon" || params[:obj_class] == "ShixunWork"
|
|
|
|
|
homework = HomeworkCommon.find params[:obj_id]
|
|
|
|
|
course = homework.course
|
|
|
|
|
# render_403 unless User.current.allowed_to?(:as_teacher,course)
|
|
|
|
|
name,group,comment,status = params[:name].to_s.strip || "",params[:group], params[:comment], params[:status]
|
|
|
|
|
member = course.members.where(:user_id => params[:user_id]).first
|
|
|
|
|
group_teacher = member.present? && member.teacher_course_groups.count > 0
|
|
|
|
|
if group || group_teacher
|
|
|
|
|
group_ids = group || member.teacher_course_groups.pluck(:course_group_id)
|
|
|
|
|
group_students = course.members.where(:course_group_id => group_ids)
|
|
|
|
|
stundet_works = homework.student_works.where(:user_id => group_students.map(&:user_id)).includes(:user => {:user_extensions => []})
|
|
|
|
|
else
|
|
|
|
|
stundet_works = homework.student_works.includes(:user => {:user_extensions => []})
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless comment.blank?
|
|
|
|
|
has_comment_works = User.current.student_works_scores.where(:student_work_id => homework.student_works.map(&:id), :reviewer_role => [1, 2])
|
|
|
|
|
student_work_ids = has_comment_works.blank? ? '(-1)' : '(' + has_comment_works.map(&:student_work_id).join(',') + ')'
|
|
|
|
|
if comment.include?('0')
|
|
|
|
|
stundet_works = stundet_works.where("student_works.id not in #{student_work_ids}")
|
|
|
|
|
else
|
|
|
|
|
stundet_works = stundet_works.where("work_status != 0 and student_works.id in #{student_work_ids}")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless status.blank?
|
|
|
|
|
stundet_works = stundet_works.where(:work_status => status)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if name && name != ""
|
|
|
|
|
name = name.downcase
|
|
|
|
|
stundet_works = stundet_works.select{ |work| work.user.user_extensions[:student_id].to_s.downcase.include?(name) || (work.user[:lastname].to_s.downcase + work.user[:firstname].to_s.downcase).include?(name)}
|
|
|
|
|
end
|
|
|
|
|
if params[:obj_class] == "HomeworkCommon"
|
|
|
|
|
zipfile = checkfileSize(stundet_works) {
|
|
|
|
|
zip_homework_common homework, stundet_works
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
zipfile = zip_shixun_work homework, stundet_works.select{|work| work.work_status != 0}
|
|
|
|
|
|
|
|
|
|
file = decode64(zipfile[0][:base64file])
|
|
|
|
|
send_file "#{OUTPUT_FOLDER}/#{file}", :filename => filename_for_content_disposition(file), :type => detect_content_type(file)
|
|
|
|
|
end
|
|
|
|
|
elsif params[:obj_class] == "GraduationTask"
|
|
|
|
|
task = GraduationTask.find params[:obj_id]
|
|
|
|
|
course = task.course
|
|
|
|
|
name,group,comment,status,cross = params[:name].to_s.strip || "",params[:graduation_group], params[:graduation_comment], params[:graduation_status], params[:cross_limit]
|
|
|
|
|
|
|
|
|
|
works = task.graduation_works
|
|
|
|
|
|
|
|
|
|
# 0表示没有分组的学生,-1表示所有分组的学生
|
|
|
|
|
member = course.members.where(:user_id => User.current.id).first
|
|
|
|
|
group_teacher = member.present? && member.teacher_course_groups.count > 0
|
|
|
|
|
|
|
|
|
|
if task.cross_comment && task.status == 3
|
|
|
|
|
assign_work_ids = task.graduation_work_comment_assignations.where(:user_id => User.current.id).pluck(:graduation_work_id).uniq
|
|
|
|
|
else
|
|
|
|
|
assign_work_ids = []
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if group.present?
|
|
|
|
|
group_students = course.members.where(:course_group_id => group)
|
|
|
|
|
# 有分组只可能是老师身份查看列表
|
|
|
|
|
works = works.where(:user_id => group_students.map(&:user_id))
|
|
|
|
|
elsif group_teacher
|
|
|
|
|
group_ids = member.teacher_course_groups.pluck(:course_group_id)
|
|
|
|
|
group_students = course.members.where(:course_group_id => group_ids)
|
|
|
|
|
works = works.where(:user_id => group_students.map(&:user_id))
|
|
|
|
|
if assign_work_ids.length > 0
|
|
|
|
|
work_ids = works.pluck(:id) + assign_work_ids
|
|
|
|
|
works = task.graduation_works.where(:id => work_ids.uniq)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
works = works
|
|
|
|
|
if task.cross_comment && task.status == 3 && assign_work_ids.length > 0
|
|
|
|
|
work_ids = works.pluck(:id) + assign_work_ids
|
|
|
|
|
works = task.graduation_works.where(:id => work_ids.uniq)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless comment.blank?
|
|
|
|
|
has_comment_works = GraduationWorkScore.where(:graduation_work_id => works.map(&:id), :reviewer_role => [1, 2])
|
|
|
|
|
graduation_work_ids = has_comment_works.blank? ? '(-1)' : '(' + has_comment_works.map(&:graduation_work_id).join(',') + ')'
|
|
|
|
|
if comment.include?('0')
|
|
|
|
|
works = works.where("graduation_works.id not in #{graduation_work_ids}")
|
|
|
|
|
else
|
|
|
|
|
works = works.where("work_status != 0 and graduation_works.id in #{graduation_work_ids}")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
unless status.blank?
|
|
|
|
|
works = works.where(:work_status => status)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if cross.present?
|
|
|
|
|
works = works.where(:id => assign_work_ids)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if name && name != ""
|
|
|
|
|
name = name.downcase
|
|
|
|
|
works = works.select{ |work| work.user.user_extensions[:student_id].to_s.downcase.include?(name) || (work.user[:lastname].to_s.downcase + work.user[:firstname].to_s.downcase).include?(name)}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
zipfile = checkfileSize(works) {
|
|
|
|
|
zip_homework_common task, works
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
elsif params[:obj_class] == "Work"
|
|
|
|
|
contest_work = Work.find params[:obj_id]
|
|
|
|
|
render_403 if User.current.admin_of_contest?(contest_work.contest)
|
|
|
|
|
zipfile = checkfileSize(contest_work.contestant_works) {
|
|
|
|
|
zip_contest_work contest_work
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
logger.error "[ZipDown#assort] ===> #{params[:obj_class]} unKown !!"
|
|
|
|
|
end
|
|
|
|
|
unless params[:obj_class] == "Exercise" || params[:obj_class] == "ShixunWork"
|
|
|
|
|
respond_to do |format|
|
|
|
|
|
format.json {
|
|
|
|
|
render json: zipfile.to_json
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
#下载某一学生的作业的所有文件
|
|
|
|
|
def download_user_homework
|
|
|
|
|
homework = HomeworkAttach.find params[:homework]
|
|
|
|
|
if User.current.admin? || User.current.member_of_course?(homework.bid.courses.first)
|
|
|
|
|
if homework != nil
|
|
|
|
|
unless homework.attachments.empty?
|
|
|
|
|
zipfile = zip_homework_by_user homework
|
|
|
|
|
filename = ((homework.user.user_extensions.nil? || homework.user.user_extensions.student_id.nil?) ? "" : homework.user.user_extensions.student_id) +
|
|
|
|
|
"_" + homework.user.show_name +
|
|
|
|
|
"_" + homework.name + ".zip"
|
|
|
|
|
send_file zipfile.file_path, :filename => filename_for_content_disposition(filename), :type => detect_content_type(zipfile.file_path) if(zipfile)
|
|
|
|
|
else
|
|
|
|
|
render file: 'public/no_file_found.html'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
render file: 'public/file_not_found.html'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
render_403
|
|
|
|
|
end
|
|
|
|
|
#rescue => e
|
|
|
|
|
# render file: 'public/file_not_found.html'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
#通过作业Id找到项目(课程)
|
|
|
|
|
def find_project_by_bid_id
|
|
|
|
|
obj_class = params[:obj_class]
|
|
|
|
|
obj_id = params[:obj_id]
|
|
|
|
|
obj = obj_class.constantize.find(obj_id)
|
|
|
|
|
case obj.class.to_s.to_sym
|
|
|
|
|
when :Bid
|
|
|
|
|
@project = obj.courses[0]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def checkfileSize(works)
|
|
|
|
|
file_count = 0
|
|
|
|
|
file_size = 0
|
|
|
|
|
works.each do |work|
|
|
|
|
|
file_count += work.attachments.count
|
|
|
|
|
work.attachments.each do |attach|
|
|
|
|
|
file_size += attach.filesize
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if file_size > MAX_DOWN_SIZE
|
|
|
|
|
{err: -1, message: 'file size to large'}
|
|
|
|
|
elsif file_count > 0
|
|
|
|
|
yield if block_given?
|
|
|
|
|
else
|
|
|
|
|
{err: -2, :message => "no file"}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|