#encoding: utf-8
class CoursesController < ApplicationController
# layout 'base_courses'
include CoursesHelper
include ActivitiesHelper
helper :activities
helper :members
helper :words
helper :attachments
helper :files
helper :activity_notifys
helper :graduation_tasks
include ApplicationHelper
helper SyllabusesHelper
# before_filter :auth_login1, :only => [:show, :course_activity, :feedback]
if Redmine::Configuration['gitlab_address'].include?("test")
skip_before_filter :verify_authenticity_token, :only => [:update_course_module, :join_course_multi_role]
before_filter :require_login, :only => [:join, :unjoin]
else
skip_before_filter :verify_authenticity_token, :only => [:update_course_module]
before_filter :require_login, :only => [:join, :unjoin, :join_course_multi_role, :join_private_courses]
end
# before_filter :check_authentication, :except => [:update_course_module]
menu_item :overview
menu_item :feedback, :only => :feedback
menu_item :homework, :only => :homework
menu_item :new_homework, :only => :new_homework
menu_item l(:label_sort_by_time), :only => :index
menu_item l(:label_sort_by_active), :only => :index
menu_item l(:label_sort_by_influence), :only => :index
#before_filter :can_show_course, :except => []
before_filter :logged_user_by_apptoken,:only => [:show,:feedback]
before_filter :find_course, :except => [ :index, :search, :new, :join, :unjoin, :create, :new_join, :course, :join_private_courses, :join_course_multi_role, :unjoin_group, :search_course_list, :validate_copy_permission]
# before_filter :authorize_course, :only => [:show, :settings, :update, :course]
before_filter :authorize_course_global, :only => [:new,:create]
before_filter :toggleCourse, :only => [:finishcourse, :restartcourse]
before_filter :is_deleted, :only => [:show, :settings]
#before_filter :allow_join, :only => [:join]
require 'bundler/setup'
if RUBY_PLATFORM =~ /linux/
require 'simple_xlsx_reader'
require 'roo-xls'
end
# params[:search] 搜索课程的名称
# params[:select] "join" "create" "all" 参与的 创建的 所有的课程
#
def index
@user = User.current
@search = params[:search].nil? ? '' : params[:search]
@select = params[:select].nil? ? '' : params[:select]
# @is_over = params[:is_over] # 是否是新建课程页面跳转的查看归档
# @syllabuses_num = Course.count
# @my_courses_count = @user.courses.not_deleted_not_end.count
if params[:order].present?
@order = params[:order]
order_str = params[:order] == "members_count" ? "c.members_count" : (params[:order] == "created_at" ? "c.created_at" : "c.updated_at")
else
@order = "all"
end
# @hidden = params[:hidden] ? params[:hidden].to_i : 0
if params[:search].present?
user_ids = User.where("concat(lastname,firstname) = '#{@search}'").pluck(:id)
user_ids = user_ids.present? ? user_ids.join(",") : -1
course_ids = Course.where("courses.name like '%#{@search}%' or courses.tea_id in (#{user_ids})").pluck(:id)
end
# 页面筛选的课程
# join users 是为了过滤掉用户为nil的课堂
=begin
if @select == "private"
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_public = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by #{order_str} desc")
elsif @select == "public"
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_public = 1 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc")
else
# 全部课堂
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc")
end
=end
if @order == "all"
course_ids = course_ids.present? ? course_ids.join(",") : -1
@courses = Course.where("courses.is_delete = 0 and courses.is_hidden = 0 #{course_ids == -1 ? "" : "and courses.id in (#{course_ids})"}").select("courses.id, courses.tea_id, courses.name, courses.is_public, courses.members_count, courses.homework_commons_count,(SELECT MAX(created_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("courses.id = 1309 desc, a desc")
elsif @order == "mine"
my_course_ids = Course.find_by_sql("SELECT c.id FROM courses c, members m, member_roles mr WHERE m.course_id = c.id AND m.id=mr.member_id AND mr.role_id in (3,7,9,10) AND m.user_id=#{@user.id} AND c.is_delete = 0")
course_ids = course_ids.present? ? my_course_ids.map(&:id) & course_ids : my_course_ids.map(&:id)
course_ids = course_ids.size > 0 ? course_ids.join(",") : "-1"
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 and c.id in (#{course_ids}) order by c.id = 1309 desc, #{order_str} desc")
elsif @order == "created_at"
course_ids = course_ids.present? ? course_ids.join(",") : -1
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 and c.is_end = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc")
else
course_ids = course_ids.present? ? course_ids.join(",") : -1
@courses = Course.find_by_sql("select c.id, c.tea_id, c.name, c.is_public, c.members_count, c.homework_commons_count, u.login, u.nickname, u.lastname, u.firstname, u.show_realname, ue.school_id from courses c, users u, user_extensions ue where c.tea_id = u.id and u.id = ue.user_id and c.is_delete = 0 and c.is_hidden = 0 #{course_ids == -1 ? "" : "and c.id in (#{course_ids})"} order by c.id = 1309 desc, #{order_str} desc")
end
@courses = paginateHelper @courses, 16
respond_to do |format|
format.js
format.html { render :layout => "base_edu" }
end
end
def import_excel
attachments = params[:attachments]
attachments.each do |attachment|
attachment = Attachment.find_by_token_only(attachment[1]['token'])
attachment.container_id = @course.id
attachment.container_type = "ImportStudent"
attachment.save
end
@import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent")
end
def shixun_statistics
if params[:homework_id]
@homeworks = @course.homework_commons.where(:id => params[:homework_id])
else
@homeworks = @course.homework_commons.where("homework_type = 4 and publish_time < '#{Time.now}'").order("publish_time desc")
end
#filename="#{format_date(Time.now)}_#{@course.teacher.show_real_name.to_s}_#{@course.name}_实训数据报告";
filename="#{format_date(Time.now)}_#{@course.teacher.show_real_name.to_s}_#{@course.name}_#{@homeworks.first.name}_实训数据报告";
respond_to do |format|
format.xls {
send_data(shixun_xls(@homeworks,@course), :type => 'application/octet-stream', :filename => filename_for_content_disposition("#{filename}.xls"))
}
end
end
# REDO:性能需要优化,这块是管理员后台任务,不影响用户使用
def sync_students
# school_id = User.find(@course.tea_id).try(:user_extensions).try(:school_id)
school_id = nil
@import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent")
@had_import_count = 0
@list_count = 0
if @import_attachments.present?
@import_attachments.each do |attachment|
path = attachment.disk_directory
name = attachment.disk_filename
if name.split(".").last == "xls" || name.split(".").last == "xlsx"
lists = readData("files/#{path}/#{name}")
@list_count += lists.count
lists.each_with_index do |list, index|
logger.info("#{list[0]}---#{list[1]}---#{list[2]}")
if list[0]
if index == 0
school_id = list[1]
elsif index > 1
course_group = @course.course_groups.where(:name => list[2]).first
if !course_group && list[2]
course_group = CourseGroup.create(:name => list[2], :course_id => @course.id, :members_count => 0)
end
import_user = ImportCourseUser.new(:user_group_name => list[2], :user_name => list[1], :user_student_id => list[0], :course_id => @course.id, :school_id => school_id)
user = User.find_by_sql("SELECT u.* FROM `users` u, `user_extensions` ue where u.id = ue.user_id and ue.school_id='#{school_id}' and ue.student_id='#{list[0]}'").last
# 用户存在并且用户是非课程成员
if user.present?
member = Member.where(:course_id => @course, :user_id => user.id).first
if !member.present?
members = []
members << Member.new(:role_ids => [10], :user_id => user.id, :course_group_id => course_group ? course_group.id : 0)
@course.members << members
StudentsForCourse.create(:student_id => user.id, :course_id => @course.id)
elsif course_group && member.course_group_id != course_group.id
member.update_attributes(:course_group_id => course_group.id)
end
@had_import_count += 1
import_user.status = 1
end
import_user.save
end
end
end
attachment.destroy
end
end
end
# @members = @course.members.joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id asc").select{|m| m.roles.to_s.include?("Student")}
# @member_count = @members.count
# @limit = 20
# @is_remote = true
# @page = (params['page'] || 1).to_i
# @member_pages = Paginator.new @member_count, @limit, params['page'] || 1
# @offset ||= @member_pages.offset
# @members = paginateHelper @members,@limit
#
# @teacher_count = TeacherAndAssistantCount @course
# @student_count = studentCount(@course)
# @no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
end
def none_register_students
student_ids = UserExtensions.where(:user_id => @course.student.map(&:student_id)).map{|ue| ue.student_id if ue.student_id.present?}
student_ids = student_ids.empty? ? "(-1)" : "(" + student_ids.compact.join(",") + ")"
@import_users = @course.import_course_users.where("school_id = #{@course.teacher.try(:user_extensions).try(:school_id)} and user_student_id not in #{student_ids}")
@curr_page = '尚未注册学生列表'
render :layout => "base_edu_course"
end
def readData(xlsx)
doc = SimpleXlsxReader.open(xlsx)
sheet = doc.sheets.first
return sheet.rows
# sheet.rows.inject([]) { |l, row|
# if row.size >= 3 && row[1] && row[2]
# l << [row[1], row[2]]
# else
# l
# end
# }
end
# 邀请码停用/启用
def set_invite_code_halt
if User.current.allowed_to?(:as_teacher, @course) || User.current.admin?
@course.update_attribute('invite_code_halt', @course.invite_code_halt == 0 ? 1 : 0)
@course_group = @course.course_groups.where(:id => params[:group_id]).first if params[:group_id]
end
end
#查找组织
def search_public_orgs_not_in_course
condition = '%%'
if !params[:name].nil?
condition = "%#{params[:name].strip}%".gsub(" ","")
end
limit = 15
course_org_ids = OrgCourse.find_by_sql("select distinct organization_id from org_courses where course_id = #{params[:id]}").map(&:organization_id)
#@orgs_not_in_course = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).page(params[:page].to_i || 1).per(limit)
#@org_count = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).count
if course_org_ids.empty?
@orgs_not_in_course = User.current.organizations.where("name like ?",condition).page((params[:page].to_i || 1)).per(limit)
@org_count = @orgs_not_in_course.count
else
course_org_ids = "(" + course_org_ids.join(',') + ")"
@orgs_not_in_course = User.current.organizations.where("organizations.id not in #{course_org_ids} and organizations.name like ?", condition).page((params[:page].to_i || 1)).per(limit)
@org_count = @orgs_not_in_course.empty? ? 0 : @orgs_not_in_course.count
end
@course_count = Project.course_entities.visible.like(params[:name]).page(params[:page]).count
@orgs_page = Paginator.new @org_count, limit,params[:page]
@hint_flag = params[:hint_flag]
#render :json => {:orgs => @orgs_not_in_course, :count => @org_count}.to_json
respond_to do |format|
format.js
end
end
def join
if User.current.logged?
cs = CoursesService.new
@user = User.current
join = cs.join_course params,@user
@state = join[:state]
@course = join[:course]
# else
# @course = Course.find_by_id params[:object_id]
# CourseMessage.create(:user_id => @course.tea_id, :course_id => @course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest')
# @state = 6
# end
else
@state = 5 #未登录
end
@object_id = @course.id if @course
respond_to do |format|
format.js #{ render :partial => 'set_join', :locals => {:user => @user, :course => @course, :object_id => params[:object_id]} }
end
end
def join_course_multi_role
=begin
if Redmine::Configuration['gitlab_address'].include?("test")
User.current = User.find(12)
end
=end
if User.current.logged?
cs = CoursesService.new
@user = User.current
join = cs.join_course_roles params,@user
@state = join[:state]
@course = join[:course]
if @state == 6 || @state == 13
# 给课堂老师发留言
if params[:role].include?("7") || params[:role].include?("9")
# notes = @user.show_real_name.to_s + " 申请以#{params[:role].include?('7') ? '教辅' : '教师'}的身份加入班级:#{@course.name}"
@course.course_teachers.each do |mem|
Tiding.create(:user_id => mem.user_id, :trigger_user_id => User.current.id, :container_id => @course.id, :container_type => 'JoinCourse', :status => 0, :belong_container_id => @course.id, :belong_container_type => "Course", :tiding_type => "Apply", :extra => params[:role].include?("7") ? "7" : "9")
end
begin
user = User.where(:id => @course.tea_id).first
if user.phone.present?
status = Trustie::Sms.send(mobile: user.phone.to_s, send_type:'join_course_multi_role', user_name: user.show_name, name: @course.id)
end
rescue => e
Rails.logger.error "发送验证码出错: #{e}"
end
end
end
if @state == 0 || @state == 13
@course.course_teachers.each do |mem|
Tiding.create(:user_id => mem.user_id, :trigger_user_id => @user.id, :container_id => @course.id, :container_type => 'StudentJoinCourse', :belong_container_id => @course.id, :belong_container_type => "Course", :tiding_type => "System")
end
end
else
@state = 5 #未登录
end
@object_id = @course.id if @course
respond_to do |format|
format.js
format.json {
render json: {:state => @state, :course_id => @course.try(:id)}
}
end
end
def unjoin
if User.current.logged?
cs = CoursesService.new
cs.exit_course params,User.current
end
redirect_to user_path(User.current)
end
def join_private_courses
@invitation_code = params[:invitation_code]
respond_to do |format|
format.js
end
end
#更新课程信息
def update
cs = CoursesService.new
c = cs.edit_course params,@course,User.current
@course = c[:course]
if @course.errors.full_messages.count <= 0
respond_to do |format|
format.js
format.api { render_api_ok }
end
else
respond_to do |format|
format.js
format.api { render_validation_errors(@course) }
end
end
end
def new_join
@course = Course.find(params[:object_id])
respond_to do |format|
format.js
end
end
# 课程搜索
# add by nwb
def search
if params[:name].empty?
courses = Course.visible
@courses = paginateHelper courses,10
else
courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'").order("time desc, created_at desc")
@courses = paginateHelper courses,10
end
@name = params[:name]
@type = 'courses'
respond_to do |format|
format.html {
render :layout => 'course_base'
}
format.atom {
courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
}
end
rescue Exception => e
if e.message == 'sumbit empty'
(redirect_to courses_url, :notice => l(:label_sumbit_empty);return)
end
end
def searchmembers
@subPage_title = l :label_student_list
@canShowCode = User.current.allowed_to?(:as_teacher,@course) && params[:role] != '1'
# @is_remote = true
@sort_type = 'score'
@score_sort_by = "desc"
@search_name = "#{params[:name].strip}"
q = "#{params[:name].strip}"
if params[:incourse]
results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q)
elsif params[:ingroup]
if params[:search_group_id] == "-1"
@group = -1
results = searchmember_by_name(student_homework_score(-1,0,0,"desc"), q)
else
@group = CourseGroup.find(params[:search_group_id])
results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q)
end
end
@is_remote = true
#@result_count = results.count
#@results = paginateHelper results, 10
@results = results
@search_name = q
@limit = 50
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @results.count
@mem_pages = Paginator.new @members_count, @limit, @page
@results = paginateHelper @results, @limit
end
def addgroups
data = {:result=>1}
@subPage_title = l :label_student_list
if params[:group_name]
if @course.course_groups.where(:name => params[:group_name]).count > 0
data[:result] = 0
else
group = CourseGroup.new
group.name = params[:group_name]
group.course_id = @course.id
group.save
end
end
render :json => data
end
def deletegroup
data = {:result=>1}
group = CourseGroup.find params[:group_id]
if group
if group.members.count == 0
group.destroy
else
group.members.update_all(:course_group_id => 0)
group.destroy
end
end
render :json => data
end
def updategroupname
data = {:result=>1}
@subPage_title = l :label_student_list
if params[:group_name] && params[:group_id]
group = CourseGroup.find(params[:group_id])
if @course.course_groups.where("name = '#{params[:group_name]}' and id != #{params[:group_id]}").count > 0
data[:result] = 0
else
group.name = params[:group_name]
group.save
end
end
render :json => data
end
def choose_group_allow
@course.update_attributes(:choose_group_allow => !@course.choose_group_allow)
end
# 显示/隐藏课程"开源检索"的入口
def open_or_close_os_interface
os_status = @course.os_allow == 0 ? 1 : 0
@course.update_attribute(:os_allow, os_status)
respond_to do |format|
format.js
end
end
def valid_ajax
req = Hash.new(false)
req[:message] = ''
valid_attr = params[:valid]
valid_value = params[:value]
group_id = params[:group_id]
# faker = CourseGroup.new
if valid_attr.eql?('name')
course = Course.find params[:course_id]
group_names = course.course_groups.map{|group| group.name unless group.id.to_s == group_id}.select{|group| !group.nil?}
if group_names.include?(valid_value)
req[:valid] = false
req[:message] = l(:modal_valid_unpassing)
else
req[:valid] = true
req[:message] = l(:modal_valid_passing)
end
# faker.name = valid_value
# faker.course_id = params[:course_id]
# faker.valid?
# req[:valid] = faker.errors[:name].blank?
# req[:message] = faker.errors[:name]
end
# req[:message] = l(:modal_valid_passing) if req[:message].blank?
render :json => req
end
def delete_course_students
if params[:member_ids]
params[:member_ids].split(",").each do |member_id|
member = Member.find member_id
if member
ActiveRecord::Base.transaction do
if member.member_roles.count == 1
StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id).destroy_all
member.destroy
else
member.member_roles.where("role_id = 10").destroy_all
StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id).destroy_all
member.update_attributes(:course_group_id => 0)
member_role = member.member_roles.where("role_id = 7 or role_id = 9 or role_id = 3").first
member_role.update_attributes(:is_current => 1) if member_role.present?
end
end
end
end
end
respond_to do |format|
format.js
end
end
def teacher_assign_group
if params[:course_group_id] == '0'
@group = 0
else
@group = @course.course_groups.where(:id => params[:course_group_id].to_i).first
end
if params[:member_ids] && @group
params[:member_ids].each do |member_id|
member = Member.find member_id
@old_group = member.course_group
member.update_attributes(:course_group_id => params[:course_group_id].to_i) if member
end
end
respond_to do |format|
format.js
end
end
def join_group
group = CourseGroup.find(params[:group_id])
member = Member.where(:course_id => @course.id, :user_id => User.current.id).first
member.course_group_id = group.id
member.save
@group = group
respond_to do |format|
format.js
end
#@course_groups = @course.course_groups
#@no_group_count = @course.student.count - @course.members.where("course_group_id != 0").count
# redirect_to has_group_student_list_course_path(@course, :group_id => @group.id)
#search_group_members group
end
def change_manager
if params[:chooseteacher]
man_member = Member.where(:course_id => @course.id, :user_id => @course.tea_id).first
cha_member = Member.find params[:chooseteacher]
if man_member && cha_member
cha_member.member_roles.where("role_id = 9 || role_id = 7").first.update_attributes(:role_id => 3, :is_current => 1)
if cha_member.member_roles.where("role_id = 10").count > 0
cha_member.member_roles.where("role_id = 10").first.destroy
StudentsForCourse.where(:course_id => @course.id, :student_id => cha_member.user_id).destroy_all
end
@course.update_attributes(:tea_id => cha_member.user_id)
man_member.member_roles.first.update_attributes(:role_id => 9)
course_act = CourseActivity.where(:course_id => @course.id, :course_act_id => @course.id, :course_act_type => 'Course').first
course_act.update_column('user_id', cha_member.user_id)
UserActivity.where(:act_id => @course.id, :container_type => 'Course', :act_type => 'Course', :container_id => @course.id).first.update_column('user_id', cha_member.user_id)
=begin
ws = WechatService.new
title = "您已成为班级管理员"
ws.create_class_notice cha_member.user_id, "create_course_notice", @course.id,title, @course.name, man_member.user.show_name, @course.members.count, "点击查看班级详情。"
=end
end
end
end
def choose_graduation_group
if User.current.allowed_to?(:as_teacher, @course)
@member_ids = params[:member_ids]
@graduation_groups = @course.graduation_groups
@default_group_name = @graduation_groups.count == 0 ? "分组1" : "分组#{(@graduation_groups.count+1)}"
@page = params[:page]
else
render_403
end
end
def teacher_graduation_group
if User.current.admin? || User.current.allowed_to?(:as_teacher, @course)
if params[:graduation_group_name].strip != ""
graduation_group = @course.graduation_groups.where(:name => params[:graduation_group_name].strip).first
unless graduation_group.present?
graduation_group = @course.graduation_groups.new(:name => params[:graduation_group_name].strip, :user_id => User.current.id)
graduation_group.save
end
Member.where(:course_id => @course.id, :id => params[:member_ids].split(",")).update_all(:graduation_group_id => graduation_group.id)
end
redirect_to teachers_course_path(@course, :page => params[:page])
else
render_403
end
end
def switch_teacher_role
if User.current.admin? || User.current.has_teacher_role(@course)
member = @course.members.where(:id => params[:member_id]).first
if member.present?
member.member_roles.where(:role_id => params[:role].to_i == 7 ? 9 : 7).update_all(:role_id => params[:role])
end
redirect_to teachers_course_path(@course)
else
render_403
end
end
# 给教师分配管理权限
def assign_teacher_groups
status = 0
if params[:member_id] && params[:group_id] && params[:check]
member = @course.members.where(:id => params[:member_id]).first
course_group = @course.course_groups.where(:id => params[:group_id]).first
if member.present? && course_group.present?
teacher_group = member.teacher_course_groups.where(:course_group_id => params[:group_id])
if params[:check].to_i == 1
if teacher_group.count == 0
member.teacher_course_groups << TeacherCourseGroup.new(:user_id => member.user_id, :course_id => @course.id, :course_group_id => params[:group_id])
end
status = 1
elsif params[:check].to_i == 0
teacher_group.destroy_all
status = 1
end
end
end
render :json => {status: status}
end
def import_course_group
attachments = params[:attachments]
attachments.each do |attachment|
attachment = Attachment.find_by_token_only(attachment[1]['token'])
if attachment.present?
attachment.container_id = @course.id
attachment.container_type = "ImportCourseGroup"
attachment.save
end
end
new_atta = Attachment.where(:container_id => @course.id, :container_type => "ImportCourseGroup").last
if new_atta.present?
path = new_atta.disk_directory
name = new_atta.disk_filename
if name.split(".").last == "xls"
begin
xls = Roo::Spreadsheet.open("files/#{path}/#{name}",extension: :xls)
worksheet = xls.sheet(0)
rows = worksheet.last_row #最后一行数
if rows < 2
@status = 0
@message = "请按照模板格式导入"
else
group_count = 0
for row in 2 .. rows do
name = worksheet.cell(row, 1).to_s
# Rails.logger.info("-----user_id #{worksheet.cell(row, 1)}-------------group_name #{name}")
if @course.course_groups.where(:name => name).count == 0
@course.course_groups << CourseGroup.new(:name => name)
group_count += 1
end
end
@status = 1
@message = "已导入#{group_count}个分班"
end
rescue
@status = 0
@message = "无法完成导入,原因:文件内容无法读取"
end
else
@status = 0
@message = "无法完成导入,原因:文件类型错误(只支持.xls文件)"
end
new_atta.destroy
else
@status = 0
@message = "无法完成导入,原因:文件不存在"
end
end
def teachers
@search = params[:search]
q = params[:search] ? "#{params[:search].strip.downcase}" : ""
if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582
@teachers = @course.members.includes(:roles, :user).where("roles.id in (3, 7, 9) and LOWER(concat(users.lastname, users.firstname)) LIKE '%#{q}%'")
else
@teachers = @course.members.includes(:roles, :user).where("(roles.id in (3, 7) or (members.user_id = #{User.current.id} and roles.id = 9)) and LOWER(concat(users.lastname, users.firstname)) LIKE '%#{q}%'")
end
@apply_users = CourseMessage.where(:course_id => @course.id,:course_message_type => 'JoinCourseRequest', :status => 0)
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
@has_graduation = @course.course_modules.where(:module_type => "graduation").first.try(:hidden).to_i == 0
@teachers_count = @teachers.size
@limit = 20
@page = params[:page] ? params[:page].to_i : 1
@teachers = paginateHelper @teachers, @limit
respond_to do |format|
format.js
format.html { render :layout => 'base_courses' }
end
end
def students
@order, @r_sort = params[:order] || "student_id", params[:sort] || "asc"
@sort = @r_sort == "desc" ? "asc" : "desc"
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
@search = params[:search]
q = params[:search] ? "#{params[:search].strip.downcase}" : ""
@group = params[:group_id].to_i if params[:group_id].present? && params[:group_id] != "undefined"
if @group
group_ids = "(#{params[:group_id]})"
else
group_ids = "(#{@course.course_groups.blank? ? 0 : @course.course_groups.map(&:id).join(",") + ",0"})"
end
=begin
if q.nil? || q == ""
@members = Member.find_by_sql("SELECT members.*,
(SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.homework_type IN (1, 3, 4)
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,
(SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id
AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score,
(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score,
(SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num,
(SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num,
(SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num,
(SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num,
(SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.work_status != 0 AND gw.user_id = members.user_id) AS graduation_num,
(SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num,
(SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND eu.commit_status = 1 AND eu.user_id = members.user_id) AS exercise_num,
(SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{@course.id} AND pu.commit_status = 1 AND pu.user_id = members.user_id) AS poll_num,
ue.student_id, CONCAT(u.lastname,u.firstname) AS username
FROM members, users u, user_extensions ue, students_for_courses sfc
WHERE sfc.student_id = members.user_id AND sfc.course_id = members.course_id AND members.`user_id`= u.id AND u.id = ue.user_id
AND members.course_id = #{@course.id} and members.course_group_id in #{group_ids}")
else
@members = Member.find_by_sql("SELECT members.*,
(SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.homework_type IN (1, 3, 4)
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,
(SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id
AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score,
(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score,
(SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num,
(SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num,
(SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num,
(SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num,
(SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.work_status != 0 AND gw.user_id = members.user_id) AS graduation_num,
(SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num,
(SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND eu.commit_status = 1 AND eu.user_id = members.user_id) AS exercise_num,
(SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{@course.id} AND pu.commit_status = 1 AND pu.user_id = members.user_id) AS poll_num,
ue.student_id, CONCAT(u.lastname,u.firstname) AS username
FROM members, users u, user_extensions ue, students_for_courses sfc
WHERE sfc.student_id = members.user_id AND sfc.course_id = members.course_id AND members.`user_id`= u.id AND u.id = ue.user_id
AND members.course_id = #{@course.id} and (ue.student_id like '%#{q}%' OR LOWER(CONCAT(u.lastname,u.firstname)) LIKE '%#{q}%')
and members.course_group_id in #{group_ids}")
end
@members.each do |member|
member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.graduation_score.nil? ? 0 : member.graduation_score) + (member.ex_score.nil? ? 0 : member.ex_score)
end
=end
=begin
if @order == "student_id"
@r_sort == "desc" ? @members.sort! {|x,y| y[:student_id].to_s <=> x[:student_id].to_s} : @members.sort! {|x,y| x[:student_id].to_s <=> y[:student_id].to_s}
else
@r_sort == "desc" ? @members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] } : @members = @members.sort{|x,y| x[:course_score] <=> y[:course_score] }
end
=end
@members = @course.members.where(:user_id => @course.student.pluck(:student_id)
).where("course_group_id in #{group_ids}").includes(:user => [:user_extensions]).
where("user_extensions.student_id like '%#{q}%' OR LOWER(CONCAT(users.lastname,users.firstname)) LIKE '%#{q}%'").reorder("user_extensions.student_id #{@r_sort}")
#分页
@member_count = @members.count
@all_member_ids = @members.map(&:id).join(",")
@limit = 20
@is_remote = true
@page = (params['page'] || 1).to_i
@member_pages = Paginator.new @member_count, @limit, @page
@offset ||= @member_pages.offset
@members = paginateHelper @members,@limit
@import_attachments = Attachment.where(:container_id => @course.id, :container_type => "ImportStudent") # 统计上传的Excel数量
if !@group.present?
@left_nav_type = 8
@group_name = @course.student_list
else
@left_nav_type = @group == 0 ? 9 : 10
if @group == 0
@group_name = "未分班"
else
@course_group = @course.course_groups.where(:id => @group).first
@group_name = @course_group.try(:name)
end
end
respond_to do |format|
format.js
format.html{render :layout => 'base_courses'}
end
end
def no_group_student_list
@order, @r_sort = params[:order] || "student_id", params[:sort] || "asc"
@sort = @r_sort == "desc" ? "asc" : "desc"
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
@search = params[:search]
q = params[:search] ? "#{params[:search].strip}" : ""
@members = Member.find_by_sql("SELECT members.*,(
SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.homework_type in (1, 3, 4)
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score
FROM members
JOIN students_for_courses
ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
WHERE members.course_id = #{@course.id} AND members.course_group_id = 0")
# if @order == "student_id"
# @members = @course.members.where(:course_group_id => 0).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")}
# else
# @members = @course.members.where(:course_group_id => 0).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")}
# end
if q.nil? || q == ""
else
members = []
@members.each do |m|
username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q))
members << m
end
end
@members = members
end
@members.each do |member|
member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.ex_score.nil? ? 0 : member.ex_score)
end
@members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] }
#分页
@member_count = @members.count
@all_member_ids = @members.map(&:id).join(",")
@limit = 20
@is_remote = true
@page = (params['page'] || 1).to_i
@member_pages = Paginator.new @member_count, @limit, params['page'] || 1
@offset ||= @member_pages.offset
@members = paginateHelper @members,@limit
# @teacher_count = TeacherAndAssistantCount @course
if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582
@teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7,9]).count
else
@teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7]).count
end
@student_count = studentCount(@course)
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
@left_nav_type = 9
respond_to do |format|
format.js
format.html{render :layout => 'base_courses'}
end
end
def has_group_student_list
#@order, @r_sort = params[:order] || "student_id", params[:sort] || "asc"
#@sort = @r_sort == "desc" ? "asc" : "desc"
@search = params[:search]
q = params[:search] ? "#{params[:search].strip}" : ""
@group = @course.course_groups.find params[:group_id]
@members = Member.find_by_sql("SELECT members.*,(
SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.homework_type in (1, 3, 4)
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score
FROM members
JOIN students_for_courses
ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
WHERE members.course_id = #{@course.id} AND members.course_group_id = #{@group.id}")
# if @order == "student_id"
# @members = @course.members.where(:course_group_id => @group.id).joins("join user_extensions on members.user_id = user_extensions.user_id").select{|m| m.roles.to_s.include?("Student")}.reorder("student_id #{@sort}")
# else
# @members = @course.members.where(:course_group_id => @group.id).joins("join users on members.user_id = users.id").select{|m| m.roles.to_s.include?("Student")}.reorder("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}")
# end
if q.nil? || q == ""
else
members = []
@members.each do |m|
username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q))
members << m
end
end
@members = members
end
@members.each do |member|
member[:course_score] = (member.score.nil? ? 0 : member.score) + (member.ex_score.nil? ? 0 : member.ex_score)
end
@members = @members.sort{|x,y| y[:course_score] <=> x[:course_score] }
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
#分页
@member_count = @members.count
@all_member_ids = @members.map(&:id).join(",")
@limit = 20
@is_remote = true
@page = (params['page'] || 1).to_i
@member_pages = Paginator.new @member_count, @limit, params['page'] || 1
@offset ||= @member_pages.offset
@members = paginateHelper @members,@limit
# @teacher_count = TeacherAndAssistantCount @course
if @course.try(:id) != 1309 || User.current.admin? || User.current.try(:id) == 15582
@teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7,9]).count
else
@teacher_count = @course.members.includes(:roles, :user).where("roles.id" => [3,7]).count
end
@student_count = studentCount(@course)
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
@left_nav_type = 10
respond_to do |format|
format.js
format.html{render :layout => 'base_courses'}
end
end
def choose_course_group
@member_ids = params[:member_ids].split(",")
if params[:group_id]
@groups = @course.course_groups.where("id != #{params[:group_id]}").order("name asc")
else
@groups = @course.course_groups.order("name asc")
end
@group_id = params[:group_id]
respond_to do |format|
format.js
end
end
def search_course_teacher_list
q = params[:search] ? "#{params[:search].strip}" : ""
@members = searchTeacherAndAssistantNoManager(@course)
if q.nil? || q == ""
else
members = []
@members.each do |m|
username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
if m && m.user && (m.user[:login].to_s.downcase.include?(q) || m.user[:mail].to_s.downcase.include?(q) || username.include?(q))
members << m
end
end
@members = members
end
end
#查找未分班的学生
def search_not_group_member
@group = CourseGroup.find params[:group_id]
@search = params[:search]
q = params[:search] ? "#{params[:search].strip}" : ""
@members = []
@members = @course.members.where("course_group_id = 0").joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id asc").select{|m| m.roles.to_s.include?("Student")}
if q.nil? || q == ""
else
members = []
@members.each do |m|
username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
if m && m.user && (m.user[:login].to_s.downcase.include?(q) || m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q))
members << m
end
end
@members = members
end
@is_search = params[:is_search] ? 1 : 0
respond_to do |format|
format.js
end
end
def add_members
@group = CourseGroup.find params[:group_id]
if @group && params[:chooseStudent]
params[:chooseStudent].each do |mem|
member = Member.find mem
if member && member.course == @course
member.update_attribute('course_group_id', @group.id)
end
end
redirect_to group_member_course_path(@course, :group_id => @group.id)
end
end
def unjoin_group
#@subPage_title = l :label_student_list
group = CourseGroup.find(params[:group_id])
member = Member.find params[:member]
@user = member.user
member.course_group_id = 0
member.save
@group = group
@course = @group.course
@teacher_count = searchTeacherAndAssistant(@course).count
@student_count = @course.student.count
@no_group_count = @course.members.where("course_group_id = 0").select{|m| m.roles.to_s.include?("Student")}.count
end
def searchgroupmembers
@subPage_title = l :label_student_list
@render_file = 'new_member_list'
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
@is_remote = true
@sort_type = 'score'
@score_sort_by = "desc"
@search_name = ""
if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1"
@group = CourseGroup.find(params[:group_id])
@results = student_homework_score(@group.id,0, 0,"desc")
# @results = paginateHelper @results, 10
elsif params[:group_id] && params[:group_id] == "-1"
@group = -1
@results = student_homework_score(-1, 0, 10,"desc")
else
page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1)
@results = student_homework_score(0,page_from, 10,"desc")
end
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
@course_groups = @course.course_groups
@limit = 50
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @results.count
@mem_pages = Paginator.new @members_count, @limit, @page
@results = paginateHelper @results, @limit
end
def group_member
@canShowCode = isCourseTeacher(User.current.id,@course)
@sort_type = 'score'
@score_sort_by = "desc"
if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1"
@group = CourseGroup.find(params[:group_id])
@results = student_homework_score(@group.id,0, 0,"desc")
else
page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1)
@results = student_homework_score(0,page_from, 10,"desc")
end
@limit = 50
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @results.count
@mem_pages = Paginator.new @members_count, @limit, @page
@results = paginateHelper @results, @limit
respond_to do |format|
format.html {render :layout => 'base_courses'}
format.js
end
end
def member
if User.current.member_of_course?(@course) || User.current.admin?
# 当前用户查看班级消息时,设置消息为已读
update_messsages_to_viewed("CourseMessage", @course)
## 有角色参数的才是课程,没有的就是项目
@order, @r_sort = params[:order] || "student_id", params[:sort] || "asc"
@sort = @r_sort == "desc" ? "asc" : "desc"
@search = params[:search]
q = params[:search] ? "#{params[:search].strip}" : ""
if params[:role] == 't'
@members = searchTeacherAndAssistant(@course)
elsif params[:role] == 'as'
if @order == "student_id"
@members = @course.members.joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")}
else
@members = @course.members.joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")}
end
elsif params[:role] == 'ns'
if @order == "student_id"
@members = @course.members.where(:course_group_id => 0).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")}
else
@members = @course.members.where(:course_group_id => 0).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")}
end
else
@group = @course.course_groups.find params[:role]
if @order == "student_id"
@members = @course.members.where(:course_group_id => @group.id).joins("join user_extensions on members.user_id = user_extensions.user_id").order("student_id #{@sort}").select{|m| m.roles.to_s.include?("Student")}
else
@members = @course.members.where(:course_group_id => @group.id).joins("join users on members.user_id = users.id").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@sort}, login #{@b_sort}").select{|m| m.roles.to_s.include?("Student")}
end
end
if q.nil? || q == ""
else
members = []
@members.each do |m|
username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
if m && m.user && (m.user.user_extensions[:student_id].to_s.downcase.include?(q) || username.include?(q))
members << m
end
end
@members = members
end
#分页
@member_count = @members.count
@limit = 20
@is_remote = true
@page = (params['page'] || 1).to_i
@member_pages = Paginator.new @member_count, @limit, params['page'] || 1
@offset ||= @member_pages.offset
@members = paginateHelper @members,@limit
@teacher_count = TeacherAndAssistantCount @course
@student_count = studentCount(@course)
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
respond_to do |format|
if @search
format.js
else
format.html {render :layout => 'base_edu'}
format.js
end
end
else
render_403
end
end
def export_course_member_excel
q = params[:name] ? "#{params[:name].strip}" : ""
filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_#{l(:excel_member_list)}";
if params[:group_id] && params[:group_id] != "0" && params[:group_id] != "-1"
group = CourseGroup.find params[:group_id]
unless group.nil?
@all_members = searchmember_by_name(student_homework_score(group.id,0,0,"desc"), q)
filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_#{group.name}_#{l(:excel_member_list)}"
end
elsif params[:group_id] && params[:group_id] == "0"
@all_members = searchmember_by_name(student_homework_score(-1, 0, 10,"desc"), q)
filename="#{@course.teacher.show_real_name.to_s }_#{@course.name}_未分班_#{l(:excel_member_list)}"
else
@all_members = searchmember_by_name(student_homework_score(0, 0, 10,"desc"), q)
end
@homeworks = @course.homework_commons.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc")
@exercises = @course.exercises.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc")
@tasks = @course.graduation_tasks.where("publish_time <= '#{Time.now}'").order("publish_time asc, created_at asc")
@homeworks.where(:homework_type => 4).each do |homework|
items = homework.student_works.where("work_status != 0")
if items.count == 0 && homework.publish_time < Time.now && !@course.is_end
update_shixun_work_status homework
end
end
respond_to do |format|
format.xls {
send_data(member_to_xls(@homeworks, @exercises, @tasks, @course,@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present",
:filename => filename_for_content_disposition("#{filename}.xls"))
}
end
end
def member_score_sort
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
@subPage_title = l :label_student_list
@render_file = 'new_member_list'
@is_remote = true
@sort_type = params[:sort_type] if params[:sort_type]
@score_sort_by = params[:sort_by] if params[:sort_by]
@search_name = params[:search_name] if params[:search_name]
group_id = params[:group_id]
if !@search_name.nil?
if group_id == '0'
#page = params[:page].nil? ? 0 : (params['page'].to_i - 1)
@results = searchmember_by_name(student_homework_score(0,0,0,@score_sort_by,@sort_type), @search_name)
# @results = paginateHelper @results, 10
elsif group_id == '-1'
@group = -1
@results = searchmember_by_name(student_homework_score(-1,0,0,@score_sort_by,@sort_type), @search_name)
else
@group = CourseGroup.find(group_id)
@results = searchmember_by_name(student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type),@search_name)
# @results = paginateHelper @results, 10
end
else
if group_id == '0'
page = params[:page].nil? ? 0 : (params['page'].to_i - 1)
@results = student_homework_score(0,page, 10,@score_sort_by,@sort_type)
elsif group_id == '-1'
@group = -1
@results = student_homework_score(-1,0, 10,@score_sort_by,@sort_type)
else
@group = CourseGroup.find(group_id)
@results = student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type)
end
end
@limit = 50
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @results.count
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
@mem_pages = Paginator.new @members_count, @limit, @page
@results = paginateHelper @results, @limit
end
# 显示每个学生的作业评分详情
def show_member_score
@member_score = Member.find(params[:member_id]) if params[:member_id]
respond_to do |format|
format.html {render :layout => 'course_base'}
format.js
end
end
# 显示每个学生的作业评分详情
def show_member_act_score
@member = Member.find(params[:member_id]) if params[:member_id]
respond_to do |format|
format.html {render :layout => 'course_base'}
format.js
end
end
def delete_member
member = @course.members.find params[:member_id]
student_role = member.member_roles.where("role_id = 10").first
teacher_role = member.member_roles.where("role_id = 7 || role_id = 9").first
joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@course.id)
joined.destroy_all
if member && member.deletable? && student_role
user_admin = CourseInfos.where("user_id = ? and course_id = ?", member.user_id, @course.id)
if user_admin.size > 0
user_admin.destroy_all
end
if member.member_roles.count > 1&& student_role && teacher_role
student_role.destroy
teacher_role.update_attribute("is_current", 1)
member.update_attribute("course_group_id", 0)
else
member.destroy
end
#移出课程发送消息
CourseMessage.create(:user_id => member.user_id, :course_id => @course.id, :course_message_type => "RemoveFromCourse", :viewed => false, :course_message_id => User.current.id)
@course_groups = @course.course_groups
@no_group_count = @course.members.where(:course_group_id => 0).select{|m| m.roles.to_s.include?("Student")}.count
@canShowCode = isCourseTeacher(User.current.id,@course)
respond_to do |format|
format.js
end
end
end
def handle_course courses, activities
course_activity_count_array=activities.values()
course_array=[]
i=0;
courses.each do |course|
course_array[i]=course
i=i+1
end
courses=desc_sort_course_by_avtivity(course_activity_count_array, course_array)
return courses
end
def settings
if User.current.allowed_to?(:as_teacher,@course)
@board = @course.boards.where(:parent_id => 0).first
@course_boards = @board.children.reorder("position asc")
@tab = params[:tab] ? params[:tab].to_i : 1
@curr_page = "设置"
respond_to do |format|
format.html { render :layout => 'base_edu_course' }
format.api { render_validation_errors(@course) }
end
else
render_403
end
end
def update_course_module
course_modules = @course.course_modules
course_modules.where(:module_type => 'activity').first.update_attributes(:module_name => params[:name][0])
for i in 1..9
course_module = course_modules.where(:module_type => params[:position][i]).first
if course_module.present?
course_module.update_attributes(:position => i+1, :module_name => params[:name][i] == "" ? course_module.default_module_name : params[:name][i])
end
end
# params[:message] 有值 就更行字段: 0为不隐藏,1为隐藏
type = ["shixun_homework", "common_homework", "group_homework", "graduation", "exercise", "poll", "attachment", "board", "course_group"]
hidden = type - params[:message]
course_modules.where(:module_type => params[:message]).update_all(:hidden => 0)
course_modules.where(:module_type => hidden).update_all(:hidden => 1)
if params[:teacher_list] && params[:teacher_list].strip != ""
@course.update_attributes(:teacher_list => params[:teacher_list].strip)
end
if params[:student_list] && params[:student_list].strip != ""
@course.update_attributes(:student_list => params[:student_list].strip)
end
respond_to do |format|
format.js
end
end
def private_or_public
if @course.is_public == 0
@course.update_attributes(:is_public => 1)
else
@course.update_attributes(:is_public => 0)
end
if @course.is_public == 0
course_status = CourseStatus.find_by_course_id(@course.id)
course_status.destroy if course_status
elsif @course.is_public == 1
course_status = CourseStatus.find_by_course_id(@course.id)
course_status.destroy if course_status
course_status = CourseStatus.create(:course_id => @course.id, :grade => 0)
end
@syllabus = @course.syllabus
respond_to do |format|
format.js
end
end
def search_member
if User.current.allowed_to?(:as_teacher,@course) || User.current.admin
q = "#{params[:name].strip}"
@roles = Role.givable.all[3..5]
if q.nil? || q == ""
@members = @course.member_principals.includes(:roles, :principal).all.sort
else
@members = searchmember_by_name(@course.member_principals.includes(:roles, :principal).all.sort,q)
end
else
render_403
end
end
def create
cs = CoursesService.new
@course = cs.create_course(params,User.current)[:course]
if @course
#发送微信消息
# count = ShieldWechatMessage.where("container_type='User' and container_id=#{User.current.id} and shield_type='Course' and shield_id=#{@course.id}").count
# if count == 0
# ss = SyllabusesService.new
# ss.send_wechat_create_class_notice User.current,@course
# end
respond_to do |format|
flash[:notice] = l(:notice_successful_create)
format.html {redirect_to course_url(@course)}
format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) }
end
else
respond_to do |format|
flash[:notice] = l(:notice_create_failed)
# @course = Course.new
format.html { redirect_to new_course_path } #Added by young
format.api { render_validation_errors(@course) }
end
end
end
def course
@school_id = params[:school_id]
per_page_option = 10
if @school_id == "0" or @school_id.nil?
@courses_all = Course.active.visible.
joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
else
@courses_all = Course.active.visible.
joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
joins(:course_extra).
where("#{Course.table_name}.school_id = ?", @school_id)
end
@course_count = @courses_all.count
@course_pages = Paginator.new @course_count, per_page_option, params['page']
@course_activity_count=Hash.new
@courses_all.each do |course|
@course_activity_count[course.id]=0
end
case params[:course_sort_type]
when '0'
@courses = @courses_all.order("created_on desc")
@s_type = 0
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
@course_activity_count=get_course_activity @courses,@course_activity_count
when '1'
@courses = @courses_all.order("course_ac_para desc")
@s_type = 1
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
@course_activity_count=get_course_activity @courses,@course_activity_count
when '2'
@courses = @courses_all.order("watchers_count desc")
@s_type = 2
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
@course_activity_count=get_course_activity @courses,@course_activity_count
when '3'
@course_activity_count=get_course_activity @courses_all,@course_activity_count
@courses=handle_course @courses_all,@course_activity_count
@s_type = 3
@courses = @courses[@course_pages.offset, @course_pages.per_page]
else
@s_type = 0
@courses = @courses_all.order("created_on desc")
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
@course_activity_count=get_course_activity @courses,@course_activity_count
end
respond_to do |format|
format.html {
render :layout => 'new_base'
}
format.api {
}
format.atom {
courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
}
end
end
def new
if User.current.login?
if User.current.user_extensions.try(:identity) == 1
render_403
else
@course = Course.new
@course.safe_attributes = params[:course]
# month = Time.now.month
render :layout => 'base_edu'
end
else
redirect_to signin_url
end
end
def search_course_list
data = {courses: []}
search = params[:search] ? "%#{params[:search].strip}%" : "%%"
CourseList.where("name like '#{search}'").each do |course|
option = []
option << course.name.to_s
option << course.id
data[:courses] << option
end
render :json => data
end
def desc_sort_course_by_avtivity(activity_count, courses)
return courses if activity_count.size<2
(activity_count.size-2).downto(0) do |i|
(0..i).each do |j|
if activity_count[j] params[:category_name])
end
# redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4)
end
# 重命名实训作业目录
def rename_homework_category
if request.get?
@category = @course.course_homework_categories.where(:id => params[:category_id]).first
else
category = @course.course_homework_categories.where(:id => params[:category_id]).first
if category.present?
category.update_attributes(:name => params[:category_name])
end
redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4, :category => params[:category_id])
end
end
# 删除实训作业子目录
def delete_homework_category
category = @course.course_homework_categories.where(:id => params[:category_id]).first
if category.present?
category.homework_commons.update_all(:course_homework_category_id => nil)
category.destroy
end
redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4)
end
def toggleCourse
@course_prefs = Course.find_by_extra(@course.extra)
unless (User.current.allowed_to?(:as_teacher,@course_prefs) || User.current.admin?)
render_403
end
end
def is_deleted
if @course.is_delete == 1 and !User.current.admin?
render_404
return
end
end
def get_courses
@user = User.current
membership = @user.coursememberships.all
membership.sort! {|older, newer| newer.created_on <=> older.created_on }
@memberships = []
membership.collect { |e|
@memberships.push(e)
}
@memberships_doing = []
@memberships_done = []
now_time = Time.now.year
@memberships.map { |e|
end_time = e.course.get_time.year
isDone = course_endTime_timeout?(e.course)
if isDone
@memberships_done.push e
else
@memberships_doing.push e
end
}
end
def finishcourse
yesterday = Date.today.prev_day.to_time
@course_prefs.endup_time = yesterday
@save_flag = @course_prefs.save
get_courses
respond_to do |format|
format.js
end
end
def restartcourse
day = Time.parse("3000-01-01")
@course_prefs.endup_time = day
@save_flag = @course_prefs.save
get_courses
respond_to do |format|
format.js {
render action:'finishcourse'
}
end
end
def course_activity
redirect_to course_url(@course, type: params[:type], page: params[:page])
end
def show
# 被删除的课程只有超级管理员才能看到,is_delete为1的时候,标记课程被删除
# if @course.is_delete == 1 && !User.current.admin?
# render_403
# return
# end
#更新创建课程消息状态
# course_request_messages = CourseMessage.where(:user_id => User.current.id, :course_id => @course.id, :course_message_type => ["CourseRequestDealResult", "Course"], :viewed => false)
# course_request_messages.update_all(:viewed => true)
# create_course_messages = @course.course_messages.where("user_id =? and course_message_type =? and course_id =? and viewed =?", User.current.id, 'Course', @course.id, 0)
# create_course_messages.update_all(:viewed => true)
#更新申请结果反馈消息的状态
# course_request_messages = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @course.id, 'CourseRequestDealResult', false)
# course_request_messages.update_all(:viewed => true)
@course_modules = @course.course_modules.where(:hidden => 0)
course_module_type = @course_modules.map(&:module_type)
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? || User.current.business?
if User.current.member_of_course?(@course) && !@is_teacher
member = @course.members.where(:user_id => User.current.id).first
if member.try(:course_group_id).to_i == 0
common_homework_ids = @course.homework_commons.where("homework_type = 1 and unified_setting = 1")
shixun_homework_ids = @course.homework_commons.where("homework_type = 4 and unified_setting = 1")
group_homework_ids = @course.homework_commons.where("homework_type = 3 and unified_setting = 1")
exercise_ids = @course.exercises.where("unified_setting = 1")
poll_ids = @course.polls.where("unified_setting = 1")
atta_ids = @course.attachments.where("unified_setting = 1")
else
not_homework_ids = @course.homework_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)")
not_homework_ids = not_homework_ids.blank? ? "(-1)" : "(" + not_homework_ids.map(&:homework_common_id).join(",") + ")"
common_homework_ids = @course.homework_commons.where("homework_type = 1 and id not in #{not_homework_ids}")
shixun_homework_ids = @course.homework_commons.where("homework_type = 4 and id not in #{not_homework_ids}")
group_homework_ids = @course.homework_commons.where("homework_type = 3 and id not in #{not_homework_ids}")
not_exercise_ids = @course.exercise_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)")
not_exercise_ids = not_exercise_ids.blank? ? "(-1)" : "(" + not_exercise_ids.map(&:exercise_id).join(",") + ")"
exercise_ids = @course.exercises.where("id not in #{not_exercise_ids}")
not_poll_ids = @course.poll_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)")
not_poll_ids = not_poll_ids.blank? ? "(-1)" : "(" + not_poll_ids.map(&:poll_id).join(",") + ")"
poll_ids = @course.polls.where("id not in #{not_poll_ids}")
not_atta_ids = @course.attachment_group_settings.where("course_group_id = #{member.try(:course_group_id)} and publish_time > '#{Time.now}'")
not_atta_ids = not_atta_ids.blank? ? "(-1)" : "(" + not_atta_ids.map(&:attachment_id).join(",") + ")"
atta_ids = @course.attachments.where("id not in #{not_atta_ids}")
end
else
common_homework_ids = @course.homework_commons.where("homework_type = 1")
shixun_homework_ids = @course.homework_commons.where("homework_type = 4")
group_homework_ids = @course.homework_commons.where("homework_type = 3")
exercise_ids = @course.exercises
poll_ids = @course.polls
atta_ids = @course.attachments
end
common_homework_ids = common_homework_ids.blank? ? "(-1)" : "(" + common_homework_ids.map(&:id).join(",") + ")"
shixun_homework_ids = shixun_homework_ids.blank? ? "(-1)" : "(" + shixun_homework_ids.map(&:id).join(",") + ")"
group_homework_ids = group_homework_ids.blank? ? "(-1)" : "(" + group_homework_ids.map(&:id).join(",") + ")"
exercise_ids = exercise_ids.blank? ? "(-1)" : "(" + exercise_ids.map(&:id).join(",") + ")"
poll_ids = poll_ids.blank? ? "(-1)" : "(" + poll_ids.map(&:id).join(",") + ")"
atta_ids = atta_ids.blank? ? "(-1)" : "(" + atta_ids.map(&:id).join(",") + ")"
if @is_teacher && course_module_type.include?('board')
course_act_type = "('Message', 'JoinCourse')"
elsif @is_teacher
course_act_type = "('JoinCourse')"
elsif course_module_type.include?('board')
course_act_type = "('Message')"
else
course_act_type = "('0')"
end
sql_str = "course_act_type in #{course_act_type}"
@course_modules.each do |course_module|
case course_module.module_type
when "shixun_homework"
sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{shixun_homework_ids})"
when "common_homework"
sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{common_homework_ids})"
when "group_homework"
sql_str += " or (course_act_type = 'HomeworkCommon' && course_act_id in #{group_homework_ids})"
when "graduation"
sql_str += " or (course_act_type = 'GraduationTopic' or course_act_type = 'GraduationTask')"
when "exercise"
sql_str += " or (course_act_type = 'Exercise' && course_act_id in #{exercise_ids})"
when "poll"
sql_str += " or (course_act_type = 'Poll' && course_act_id in #{poll_ids})"
when "attachment"
sql_str += " or (course_act_type = 'Attachment' && course_act_id in #{atta_ids})"
end
end
@page = params[:page] ? params[:page].to_i + 1 : 0
if params[:type].present?
case params[:type]
when "common_homework"
# homework_ids = @course.homework_commons.where("homework_type = 1 and id in #{homework_ids}")
@course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{common_homework_ids}").order('updated_at desc')
when "shixun_homework"
# homework_ids = @course.homework_commons.where("homework_type = 4 and id in #{homework_ids}")
@course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{shixun_homework_ids}").order('updated_at desc')
when "group_homework"
# homework_ids = @course.homework_commons.where("homework_type = 3 and id in #{homework_ids}")
@course_activities = @course.course_activities.where("course_act_type = 'HomeworkCommon' and course_act_id in #{group_homework_ids}").order('updated_at desc')
when "graduation_topic"
@course_activities = @course.course_activities.where("course_act_type = 'GraduationTopic'").order('updated_at desc')
when "graduation_task"
@course_activities = @course.course_activities.where("course_act_type = 'GraduationTask'").order('updated_at desc')
when "news"
@course_activities = @course.course_activities.where("course_act_type = 'News'").order('updated_at desc')
when "message"
@course_activities = @course.course_activities.where("course_act_type = 'Message'").order('updated_at desc')
when "poll"
@course_activities = @course.course_activities.where("course_act_type = 'Poll' && course_act_id in #{poll_ids}").order('updated_at desc')
when "exercise"
@course_activities = @course.course_activities.where("course_act_type = 'Exercise' && course_act_id in #{exercise_ids}").order('updated_at desc')
when "attachment"
@course_activities = @course.course_activities.where("course_act_type = 'Attachment' && course_act_id in #{atta_ids}").order('updated_at desc')
when 'JoinCourse'
@course_activities = @course.course_activities.where("course_act_type = 'JoinCourse'").order('updated_at desc')
when "journalsForMessage"
@course_activities = @course.course_activities.where("course_act_type = 'JournalsForMessage'").order('updated_at desc')
else
@course_activities = @course.course_activities.where("#{sql_str}").order('updated_at desc')
end
else
@course_activities = @course.course_activities.where("#{sql_str}").order('updated_at desc')
end
@course_activities_count = @course_activities.size
@course_activities = @course_activities.limit(10).offset(@page * 10)
@type = params[:type]
@left_nav_type = 1
@show_page = true
respond_to do |format|
format.js
format.html{render :layout => 'base_courses'}
format.api
end
end
#判断指定用户是否为课程教师
def isCourseTeacher(id,course)
result = false
user = User.find(id)
if !user.nil? && user.allowed_to?(:as_teacher,course)
result = true
end
result
end
def feedback
CourseMessage.where("user_id = ? and course_id = ?", User.current, @course.id).update_all(:viewed => true)
if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course)))
page = params[:page]
# Find the page of the requested reply
@jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
@jour_count = @jours.count
@limit = 10
if params[:r] && page.nil?
offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
page = 1 + offset / @limit
end
@jour = paginateHelper @jours,10
@state = false
@left_nav_type = 6
respond_to do |format|
format.html{render :layout => 'base_courses'}
format.api
end
else
render_403
end
end
def search_homework_member homeworks,name
if name == ""
select_homework = homeworks
else
name = name.downcase
select_homework = homeworks.select{ |homework|
homework.user[:login].to_s.downcase.include?(name) || homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
}
end
select_homework
end
# 作业查重
def code_repeat
#代码查重新加的
@index = params[:index]
@order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name] || "",params[:group]
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
if !@is_teacher
render_403
return
end
@homework = HomeworkCommon.find params[:homework]
#order("#{@order} #{@b_sort}"
@student_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,IF(final_score = 0, 0, final_score - absence_penalty - late_penalty)) as score").order("simi_value desc").has_committed,@name
@works_hash = {}
@student_works.each do |tmpwork|
@works_hash[tmpwork.id] = tmpwork
puts tmpwork.id
end
respond_to do |format|
format.html {render :layout => 'base_edu'}
end
end
def show_comparecode
@index = params[:index]
src_id = params[:src_id]
dst_id = params[:dst_id]
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
if !@is_teacher
render_403
return
end
src_work = StudentWork.where("id =?", src_id).first
@homework = HomeworkCommon.find params[:homework_id]
@simi_value = src_work.simi_value.to_i
@src_code = src_work.description
src_user = User.where("id =?", src_work.user_id).first
@src_username = src_user.try(:realname) != " " ? src_user.lastname + src_user.firstname : src_user.try(:login)
#descriotion user name
dst_work = StudentWork.where("id =?", dst_id).first
@dst_code = dst_work.description
dst_user = User.where("id =?", dst_work.user_id).first
@dst_username = dst_user.try(:realname) != " " ? dst_user.lastname + dst_user.firstname : dst_user.try(:login)
respond_to do |format|
format.html{render :layout => 'base_edu'}
end
end
# 判断非本课堂成员的老师是否有权限复制课堂
def validate_copy_permission
status = 0
if User.current.professional_certification && User.current.user_extensions.identity == 0
status = 1
end
render :json => {:status => status}
end
#根据已有课程复制课程
#param id:已有课程ID
def copy_course
unless User.current.logged?
return render_403
end
cs = CoursesService.new
course = cs.copy_a_course(@course)[:course]
if course
redirect_to course_path(course)
end
end
#从课程创建的老师那里选择课程大纲
def course_outline
@teacher = User.find(@course.tea_id)
@blog_articles = @teacher.blog.articles
@is_in_show_outline_page = params[:is_in_show_outline_page]
respond_to do |format|
format.js
end
end
#根据关键字搜索,查找方法一样的,但返回内容不一样
def search_course_outline
@article_title = params[:title]
@teacher = User.find(@course.tea_id)
@blog_articles = @teacher.blog.articles.like(@article_title)
render :json=>@blog_articles.to_json
end
#设置或者更改课程的大纲
def set_course_outline
@course.outline = params[:outline_id]
@course.save
@is_in_show_outline_page = params[:is_in_show_outline_page]
respond_to do |format|
format.js
end
end
#显示课程大纲
def syllabus
@article = BlogComment.find(@course.outline)
respond_to do |format|
format.html {render :layout => 'base_courses'}
end
end
#删除课程
#删除课程只是将课程的is_deleted状态改为false,is_deleted为false状态的课程只有管理员可以看到
def destroy
@course_id = @course.id
syllabus = @course.syllabus
@course.delete!
respond_to do |format|
format.js
format.html{redirect_to courses_path()}
end
# redirect_to :back
end
#归档班级
def archive_course
if params[:source] == "1"
@syllabus = @course.syllabus
end
if params[:type] == "0"
@course.delete!
else
@course.update_attribute(:is_delete, false)
end
respond_to do |format|
format.js
end
end
# 恢复已删除的课程
def renew
if User.current.admin?
@course.update_attributes(:is_delete => false)
redirect_to course_path(@course)
else
return 404
end
end
#搜索作业
def homework_search
@search = "%#{params[:search].strip.downcase}%"
@is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course))
@page = params[:page] ? params[:page].to_i + 1 : 0
if @is_teacher
@homeworks = @course.homework_commons.where("name like '%#{@search}%'").order("created_at desc").limit(10).offset(@page * 10)
else
@homeworks = @course.homework_commons.where("name like '%#{@search}%' and publish_time <= '#{Time.now}'").order("created_at desc").limit(10).offset(@page * 10)
end
end
#统计
def course_statistics
@left_nav_type = 10
@order = params[:order] ? params[:order] : 'desc'
@tab = params[:tab] ? params[:tab].to_i : nil
if !params[:tab] || params[:tab] == "1"
@type = params[:type] ? params[:type] : 'act_score'
sql = "SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1) AS act_score,
message_num, message_reply_num, news_reply_num, news_num, resource_num, journal_num, homework_journal_num, ccs.user_id FROM course_contributor_scores ccs
JOIN students_for_courses ON students_for_courses.course_id = ccs.course_id AND students_for_courses.student_id = ccs.user_id
WHERE ccs.course_id = #{@course.id} ORDER BY #{@type} #{@order}, act_score #{@order}"
@members = CourseContributorScore.find_by_sql(sql)
elsif params[:tab] == "2"
@type = params[:type] ? params[:type] : 'total_score'
@members = @course.course_homework_statisticss.reorder("#{@type} #{@order}, total_score #{@order}")
elsif params[:tab] == "3"
@homework_id = params[:homework_id] ? params[:homework_id].to_i : 0
@type = params[:type] ? params[:type] : 'project_act_score'
if @homework_id == 0
sql = "SELECT (IFNULL(changeset_num, 0)*4 + issue_num*4 + issue_journal_num*1 + attach_num*5 + board_num*2 + board_message_num*1) AS project_act_score,
changeset_num, issue_num, issue_journal_num, attach_num, board_num, board_message_num, pss.project_id FROM project_scores pss
JOIN student_work_projects ON student_work_projects.project_id = pss.project_id AND student_work_projects.course_id = #{@course.id}
GROUP BY pss.project_id ORDER BY #{@type} #{@order}, project_act_score #{@order}"
else
sql = "SELECT (IFNULL(changeset_num, 0)*4 + issue_num*4 + issue_journal_num*1 + attach_num*5 + board_num*2 + board_message_num*1) AS project_act_score,
changeset_num, issue_num, issue_journal_num, attach_num, board_num, board_message_num, pss.project_id FROM project_scores pss
JOIN student_work_projects ON student_work_projects.project_id = pss.project_id AND student_work_projects.course_id = #{@course.id} AND student_work_projects.homework_common_id = #{@homework_id}
GROUP BY pss.project_id ORDER BY #{@type} #{@order}, project_act_score #{@order}"
end
@members = ProjectScore.find_by_sql(sql)
end
@limit = 20
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @members.count
@mem_pages = Paginator.new @members_count, @limit, @page
@members = paginateHelper @members, @limit
respond_to do |format|
format.js
format.html {render :layout => 'base_courses'}
end
end
#切换身份
def switch_role
members = @course.members.where("user_id = #{params[:user_id]}")
unless members.blank?
#role = MemberRole.where("member_id = #{members.first.id} and role_id = #{params[:role]}").first
curr_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:curr_role])
tar_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:tar_role])
unless (curr_role.nil? || tar_role.nil?)
curr_role.update_column('is_current', 0)
tar_role.update_column('is_current', 1)
end
end
redirect_to course_path(@course)
end
def search_not_teachers
# members = searchTeacherAndAssistant @course
member_ids = Member.find_by_sql("SELECT user_id from members where id in (SELECT member_id FROM `member_roles` where role_id in (3,7,9)
and member_id in (select id from members where course_id=#{@course.id}))")
member_ids = "(" + member_ids.map(&:user_id).join(',') + ")"
condition = "%#{params[:search]}%".gsub(" ","")
@school = params[:school] || @course.teacher.school_name
if @school != ""
school_s = "%#{@school}%".gsub(" ","")
school_ids = School.where("name like '#{school_s}'").blank? ? "(-1)" : "(" + School.where("name like '#{school_s}'").map(&:id).join(",") + ")"
@users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname)) LIKE '#{condition}' and user_extensions.school_id in #{school_ids}")
else
@users = User.where("id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname)) LIKE '#{condition}'").includes(:user_extensions)
end
@role = params[:role].to_i
@user_ids = @users.map(&:id).join(",")
@limit = 10
@page = params[:page].nil? ? 1 : params['page'].to_i
@users_count = @users.count
@total_pages = (@users_count / 10.0).ceil
@users_pages = Paginator.new @users_count, @limit, @page
@users = paginateHelper @users, @limit
respond_to do |format|
format.js
format.json {
render json: search_teacher_json_data(@users)
}
end
end
def search_not_students
members = @course.members.select{|m| m.roles.to_s.include?("Student")}
member_ids = members.empty? ? "(-1)" : "(" + members.map(&:user_id).join(',') + ")"
condition = "%#{params[:search]}%".gsub(" ","")
@school = params[:school] || @course.teacher.school_name
if @school != ""
school_s = "%#{@school}%".gsub(" ","")
school_ids = School.where("name like '#{school_s}'").blank? ? "(-1)" : "(" + School.where("name like '#{school_s}'").map(&:id).join(",") + ")"
@users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and user_extensions.school_id in #{school_ids} and (LOWER(concat(lastname, firstname)) LIKE '#{condition}' or user_extensions.student_id LIKE '#{condition}')")
else
@users = User.joins(:user_extensions).where("users.id not in #{member_ids} and status = 1 and (LOWER(concat(lastname, firstname)) LIKE '#{condition}' or user_extensions.student_id LIKE '#{condition}')")
end
@user_ids = @users.map(&:id).join(",")
@limit = 8
@page = params[:page].nil? ? 1 : params['page'].to_i
@users_count = @users.count
@total_pages = (@users_count / 10.0).ceil
@users_pages = Paginator.new @users_count, @limit, @page
@users = paginateHelper @users, @limit
respond_to do |format|
format.js
format.json {
render json: search_student_json_data(@users)
}
end
end
private
def allow_join course
if course_endTime_timeout? course
respond_to do |format|
format.js {
@state = 2
render :partial => 'set_join',
:locals => {:user => User.current,
:course => Course.find(params[:object_id]),
:object_id => params[:object_id]
}
}
end
end
end
#验证是否显示课程
def can_show_course
@first_page = FirstPage.find_by_page_type('project')
if @first_page.try(:show_course) == 2
render_404
end
end
def student_homework_score(groupid,start_from, nums, score_sort_by, sort_type = 'score')
start_from = start_from * nums
if groupid == 0
sql_select = "SELECT members.*,(
SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,
(SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id
AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score,
(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score,
(SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id,
(SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num,
(SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num,
(SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num,
(SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num,
(SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.work_status != 0 AND gw.user_id = members.user_id) AS graduation_num,
(SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num,
(SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND eu.commit_status = 1 AND eu.user_id = members.user_id) AS exercise_num,
(SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{@course.id} AND pu.commit_status = 1 AND pu.user_id = members.user_id) AS poll_num
FROM members
JOIN students_for_courses
ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
WHERE members.course_id = #{@course.id} ORDER BY #{sort_type} #{score_sort_by}"
elsif groupid == -1
sql_select = "SELECT members.*,(
SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,
(SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id
AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score,
(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score,
(SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id,
(SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num,
(SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num,
(SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num,
(SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num,
(SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.work_status != 0 AND gw.user_id = members.user_id) AS graduation_num,
(SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num,
(SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND eu.commit_status = 1 AND eu.user_id = members.user_id) AS exercise_num,
(SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{@course.id} AND pu.commit_status = 1 AND pu.user_id = members.user_id) AS poll_num
FROM members
JOIN students_for_courses
ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
WHERE members.course_id = #{@course.id} AND members.course_group_id = 0 ORDER BY #{sort_type} #{score_sort_by}"
else
sql_select = "SELECT members.*,(
SELECT SUM(student_works.work_score)
FROM student_works,homework_commons
WHERE student_works.homework_common_id = homework_commons.id
AND homework_commons.course_id = #{@course.id}
AND student_works.user_id = members.user_id
) AS score,
(SELECT SUM(gw.work_score) FROM graduation_works gw,graduation_tasks gt WHERE gw.graduation_task_id = gt.id
AND gt.course_id = #{@course.id} AND gw.user_id = members.user_id) AS graduation_score,
(SELECT SUM(exercise_users.score) FROM exercise_users,exercises WHERE exercise_users.exercise_id = exercises.id
AND exercises.course_id = #{@course.id} AND exercise_users.user_id = members.user_id) AS ex_score,
(SELECT max(student_id) FROM user_extensions WHERE user_extensions.user_id = members.user_id) AS student_id,
(SELECT max(message_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_num,
(SELECT max(message_reply_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS message_reply_num,
(SELECT max(resource_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS resource_num,
(SELECT max(homework_journal_num) FROM course_contributor_scores AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id) AS homework_journal_num,
(SELECT COUNT(gw.id) FROM graduation_works AS gw, graduation_tasks AS gt WHERE gw.graduation_task_id = gt.id AND gt.course_id = #{@course.id} AND gw.work_status != 0 AND gw.user_id = members.user_id) AS graduation_num,
(SELECT COUNT(ss.id) FROM student_works AS ss ,homework_commons AS hc WHERE ss.homework_common_id = hc.id AND hc.course_id = #{@course.id} AND ss.work_status != 0 AND ss.user_id = members.user_id) AS homework_num,
(SELECT COUNT(eu.id) FROM exercise_users AS eu,exercises WHERE eu.exercise_id = exercises.id AND exercises.course_id = #{@course.id} AND eu.commit_status = 1 AND eu.user_id = members.user_id) AS exercise_num,
(SELECT COUNT(pu.id) FROM poll_users AS pu, polls WHERE pu.poll_id = polls.id AND polls.course_id = #{@course.id} AND pu.commit_status = 1 AND pu.user_id = members.user_id) AS poll_num
FROM members
JOIN students_for_courses
ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
WHERE members.course_id = #{@course.id} AND members.course_group_id = #{groupid} ORDER BY #{sort_type} #{score_sort_by}"
end
sql = ActiveRecord::Base.connection()
homework_scores = Member.find_by_sql(sql_select)
sql.close()
homework_scores
end
#获取课程的老师列表
def find_course_teachers course
searchTeacherAndAssistant(course).map{|teacher| teacher.user_id}.join(",")
end
#当加入,退出分班时查询分班的学生
def search_group_members group
@render_file = 'new_member_list'
@canShowCode = isCourseTeacher(User.current.id,@course)
@is_remote = true
@score_sort_by = "desc"
@results = student_homework_score(group.id,0,0, "desc")
@limit = 50
@page = params[:page].nil? ? 1 : params['page'].to_i
@members_count = @results.count
@mem_pages = Paginator.new @members_count, @limit, @page
@results = paginateHelper @results, @limit
end
def shixun_xls homeworks, course
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
black = Spreadsheet::Format.new :color => :black, :weight => :bold, :size => 10
current_row = 0
sheet = book.create_worksheet :name => "学员统计"
sheet.row(0).default_format = blue
sheet.row(0).concat(["学生id","学生姓名","作业编号","作业/实训名称","关卡"," 经验值","金币","评测历史","评测时间","评测结果"])
course.student.each_with_index do |course, i|
# 总统计
count_exp_score = 0
count_gold_score = 0
count_test = 0
count_time = 0
game_count = 0
# end
user = course.student
current_row += 1
sheet[current_row, 0] = user.login
sheet[current_row, 1] = user.show_real_name
homeworks.each_with_index do |homework, j|
# 关卡统计
count_game_exp_score = 0
count_game_gold_score = 0
count_game_test = 0
count_game_time = 0
# end
sheet[current_row, 2] = "# #{get_hw_index(homework, true, 4)}"
sheet[current_row, 3] = homework.name
shixun = homework.homework_commons_shixuns.shixun if homework.homework_commons_shixuns
if shixun
shixun.challenges.each_with_index do |challenge, k|
sheet[current_row, 4] = "第#{k+1}关"
games = Game.where(:challenge_id => challenge.id, :user_id => user.id)
game_count = game_count + games.count
if games.count > 0
games.each do |game|
sheet[current_row, 5] = game.final_score ? "+#{game.final_score.to_s}" : "--"
sheet[current_row, 6] = game.final_score ? (game.answer_open? ? "#{-challenge.score.to_i}" : "+#{game.final_score.to_i}") : "--"
count_exp_score += (game.final_score ? game.final_score.to_i : 0)
count_gold_score += (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0)
count_game_exp_score += (game.final_score ? game.final_score.to_i : 0)
count_game_gold_score += (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0)
count = game.outputs.count
if count > 0
outputs = game.outputs.where(:test_set_position => 1).reorder("created_at asc")
outputs.each_with_index do |output, k|
count_test += 1
count_game_test += 1
sheet[current_row, 7] = "第#{k+1}次评测"
sheet[current_row, 8] = k == 0 ? game_spend_time((output.created_at - game.created_at).to_i) : game_spend_time((output.created_at - outputs[k-1].created_at).to_i)
count_time = count_time + (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i)
count_game_time += (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i)
sheet[current_row, 9] = game.outputs.where(:query_index => output.query_index).select{|ou| ou.result == false}.count > 0 ? "失败" : "成功"
current_row += 1
end
else
current_row += 1
end
end
else
current_row += 1
end
end
end
sheet[current_row,4] = "合计"
sheet[current_row,5] = count_game_exp_score >= 0 ? "+#{count_game_exp_score}" : "-#{count_game_exp_score}"
sheet[current_row,6] = count_game_gold_score >= 0 ? "+#{count_game_gold_score}" : "#{count_game_gold_score}"
sheet[current_row,7] = "共#{count_game_test}次评测"
sheet[current_row,8] = game_spend_time((count_game_time == 0 ? 0 : (count_game_time / count_test)).to_i)+"/次"
sheet.row(current_row).default_format = black
#current_row += 1
end
# sheet[current_row,2] = "合计"
# sheet[current_row,4] = "共#{game_count}"
# sheet[current_row,5] = count_exp_score >= 0 ? "+#{count_exp_score}" : "-#{count_exp_score}"
# sheet[current_row,6] = count_gold_score >= 0 ? "+#{count_gold_score}" : "#{count_gold_score}"
# sheet[current_row,7] = "共#{count_test}次评测"
# sheet[current_row,8] = game_spend_time((count_time == 0 ? 0 : (count_time / count_test)).to_i)+"/次"
# sheet.row(current_row).default_format = black
end
homeworks.each_with_index do |homework, i|
sheet = book.create_worksheet :name => "关卡统计"
sheet.row(0).default_format = blue
sheet[0,0] = "课堂编号"
sheet[0,1] = "主讲老师"
sheet[0,2] = "课堂名称"
sheet[0,3] = "作业编号"
sheet[0,4] = "作业/实训名称"
sheet[0,5] = "关卡"
sheet[0,6] = "学生id"
sheet[0,7] = "学生姓名"
sheet[0,8] = "经验值"
sheet[0,9] = "金币"
sheet[0,10] = "评测历史"
sheet[0,11] = "评测时间"
sheet[0,12] = "评测结果"
sheet[1,0] = course.id
sheet[1,1] = course.teacher.show_real_name
sheet[1,2] = course.name
sheet[1,3] = "# #{get_hw_index(homework, true, 4)}"
sheet[1,4] = homework.name
current_row = 1
shixun = homework.homework_commons_shixuns.shixun if homework.homework_commons_shixuns
if shixun
shixun.challenges.each_with_index do |challenge, j|
sheet[current_row,5] = "第#{j+1}关"
games = Game.where(:challenge_id => challenge.id, :user_id => homework.student_works.where("work_status != 0").map(&:user_id))
count_exp_score = 0
count_gold_score = 0
count_test = 0
count_time = 0
if games.count > 0
games.each do |game|
user = game.user
sheet[current_row,6] = user.login
sheet[current_row,7] = user.show_real_name
sheet[current_row,8] = game.final_score ? "+#{game.final_score.to_s}" : "--"
count_exp_score = count_exp_score + (game.final_score ? game.final_score.to_i : 0)
sheet[current_row,9] = game.final_score ? (game.answer_open? ? "#{-challenge.score.to_i}" : "+#{game.final_score.to_i}") : "--"
count_gold_score = count_gold_score + (game.final_score ? (game.answer_open? ? -challenge.score.to_i : game.final_score.to_i) : 0)
count = game.outputs.count
if count > 0
outputs = game.outputs.where(:test_set_position => 1).reorder("created_at asc")
outputs.each_with_index do |output, k|
count_test = count_test + 1
sheet[current_row,10] = "第#{k+1}次评测"
sheet[current_row,11] = k == 0 ? game_spend_time((output.created_at - game.created_at).to_i) : game_spend_time((output.created_at - outputs[k-1].created_at).to_i)
count_time = count_time + (k == 0 ? (output.created_at - game.created_at).to_i : (output.created_at - outputs[k-1].created_at).to_i)
sheet[current_row,12] = game.outputs.where(:query_index => output.query_index).select{|ou| ou.result == false}.count > 0 ? "失败" : "成功"
current_row = current_row + 1
end
else
current_row = current_row + 1
end
end
else
current_row = current_row + 1
end
sheet[current_row,6] = "合计"
sheet[current_row,7] = games.count.to_s + "人"
sheet[current_row,8] = count_exp_score >= 0 ? "+#{count_exp_score}" : "-#{count_exp_score}"
sheet[current_row,9] = count_gold_score >= 0 ? "+#{count_gold_score}" : "#{count_gold_score}"
sheet[current_row,10] = "共#{count_test}次评测"
sheet[current_row,11] = game_spend_time((count_time == 0 ? 0 : (count_time / count_test)).to_i)+"/次"
sheet.row(current_row).default_format = black
current_row = current_row + 1
end
end
end
book.write xls_report
xls_report.string
end
def member_to_xls homeworks, exercises, tasks, course, members, groups
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "总成绩"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
#sheet1.row(0).default_format = blue
#sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_class),l(:excel_f_score),l(:excel_commit_time)])
sheet1[0,0] = "课程编号"
sheet1[0,1] = course.id
sheet1[1,0] = "课程名称"
sheet1[1,1] = course.name
sheet1[2,0] = "教师团队"
sheet1[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet1[3,0] = "主讲教师"
sheet1[3,1] = course.teacher.show_real_name
sheet1[4,0] = "排名"
sheet1[4,1] = "学生姓名"
sheet1[4,2] = "昵称"
sheet1[4,3] = "学号"
sheet1[4,4] = "分班"
current_col = 4
homeworks.where(:homework_type => 4).each do |homework|
sheet1[4,current_col+=1] = "#{homework.name}"
end
for i in 0 ... homeworks.where(:homework_type => 1).count
sheet1[4,current_col+=1] = "普通作业第"+(i+1).to_s+"次"
end
for i in 0 ... homeworks.where(:homework_type => 3).count
sheet1[4,current_col+=1] = "分组作业第"+(i+1).to_s+"次"
end
for i in 0 ... exercises.count
sheet1[4,current_col+=1] = "试卷第"+(i+1).to_s+"次"
end
for i in 0 ... tasks.count
sheet1[4,current_col+=1] = "毕设任务第"+(i+1).to_s+"次"
end
sheet1[4,current_col+=1] = "实训作业总得分"
sheet1[4,current_col+=1] = "普通作业总得分"
sheet1[4,current_col+=1] = "分组作业总得分"
sheet1[4,current_col+=1] = "试卷总得分"
if tasks.count > 0
sheet1[4,current_col+=1] = "毕设任务总得分"
end
#sheet1[6,homeworks.count+6] = "社区得分"
sheet1[4,current_col+=1] = "总得分"
count_row = 5
members.each_with_index do |member, i|
column = 0
sheet1[count_row,column]= i+1
sheet1[count_row,column+=1] = member.user.show_real_name
sheet1[count_row,column+=1] = member.user.login
sheet1[count_row,column+=1] = member.user.user_extensions.student_id
sheet1[count_row,column+=1] = member.course_group_id == 0 ? "暂无" : member.course_group.name
# current_col = 5
shixun_score = 0
homeworks.where(:homework_type => 4).includes(:student_works).each do |homework|
student_works = homework.student_works.where("user_id = #{member.user.id}")
if student_works.empty?
sheet1[count_row,column+=1] = 0
else
work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score
sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1)
shixun_score += work_score < 0 ? 0 : work_score.round(1)
end
# current_col += 1
end
common_score = 0
homeworks.where(:homework_type => 1).includes(:student_works).each do |homework|
student_works = homework.student_works.where("user_id = #{member.user.id}")
if student_works.empty?
sheet1[count_row,column+=1] = 0
else
work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score
sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1)
common_score += work_score < 0 ? 0 : work_score.round(1)
end
# current_col += 1
end
group_score = 0
homeworks.where(:homework_type => 3).includes(:student_works).each do |homework|
student_works = homework.student_works.where("user_id = #{member.user.id}")
if student_works.empty?
sheet1[count_row,column+=1] = 0
else
work_score = student_works.first.work_score.nil? ? 0 : student_works.first.work_score
sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1)
group_score += work_score < 0 ? 0 : work_score.round(1)
end
# current_col += 1
end
exercise_score = 0
exercises.includes(:exercise_users).each do |exercise|
exercise_user = exercise.exercise_users.where("user_id = #{member.user.id}")
if exercise_user.empty?
sheet1[count_row,column+=1] = 0
else
work_score = exercise_user.first.score.nil? ? 0 : exercise_user.first.score
sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1)
exercise_score += work_score < 0 ? 0 : work_score.round(1)
end
# current_col += 1
end
graduation_score = 0
tasks.includes(:graduation_works).each do |task|
graduation_works = task.graduation_works.where("user_id = #{member.user.id}")
if graduation_works.empty?
sheet1[count_row,column+=1] = 0
else
work_score = graduation_works.first.work_score.nil? ? 0 : graduation_works.first.work_score
sheet1[count_row,column+=1] = work_score < 0 ? 0 : work_score.round(1)
graduation_score += work_score < 0 ? 0 : work_score.round(1)
end
# current_col += 1
end
sum = shixun_score + common_score + group_score + exercise_score + graduation_score
sheet1[count_row,column+=1] = shixun_score
sheet1[count_row,column+=1] = common_score
sheet1[count_row,column+=1] = group_score
sheet1[count_row,column+=1] = exercise_score
if tasks.count > 0
sheet1[count_row,column+=1] = graduation_score
end
sheet1[count_row,column+=1] = sum.round(1)
count_row += 1
end
if course.course_groups.count > 0
sheet = book.create_worksheet :name => "分班信息"
sheet.row(0).concat(["课程编号", course.id])
sheet.row(1).concat(["课程名称", course.name])
sheet.row(2).concat(["教师团队", (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')])
sheet.row(3).concat(["主讲教师", course.teacher.show_real_name])
sheet.row(4).concat(["序号", "分班名称", "邀请码", "学生数量"])
current_row = 5
course.course_groups.each do |course_group|
sheet[current_row,0]= current_row - 4
sheet[current_row,1]= course_group.name
sheet[current_row,2]= course_group.invite_code
sheet[current_row,3]= course_group.members.count
current_row += 1
end
end
sheet2 = book.create_worksheet :name => "活跃度"
sheet2[0,0] = "课程编号"
sheet2[0,1] = course.id
sheet2[1,0] = "课程名称"
sheet2[1,1] = course.name
sheet2[2,0] = "教师团队"
sheet2[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet2[3,0] = "主讲教师"
sheet2[3,1] = course.teacher.show_real_name
sheet2.row(4).concat(["排名","学生姓名","昵称","学号","分班","作业完成数(*10)","试卷完成数(*10)","问卷完成数(*7)","资源发布数(*5)","帖子发布数(*2)","帖子回复数(*1)","作业回复数(*1)","活跃度"])
act_members = members
act_members.each do |member|
member[:act_score] = ((member.homework_num.to_i + member.graduation_num.to_i) * 10) + (member.exercise_num.to_i * 10) + (member.poll_num.to_i * 7) + (member.resource_num.to_i * 5) + (member.message_num.to_i * 2) + member.message_reply_num.to_i + member.homework_journal_num.to_i
end
act_members = act_members.sort do |a, b|
[b[:act_score]] <=> [a[:act_score]]
end
count_row = 5
act_members.each_with_index do |act_member, index|
sheet2[count_row,0]= index + 1
sheet2[count_row,1] = act_member.user.show_real_name
sheet2[count_row,2] = act_member.user.login
sheet2[count_row,3] = act_member.user.user_extensions.student_id
sheet2[count_row,4] = act_member.course_group_id == 0 ? "暂无" : act_member.course_group.name
sheet2[count_row,5]= act_member.homework_num.to_i + act_member.graduation_num.to_i
sheet2[count_row,6]= act_member.exercise_num
sheet2[count_row,7]= act_member.poll_num
sheet2[count_row,8]= act_member.resource_num
sheet2[count_row,9]= act_member.message_num
sheet2[count_row,10]= act_member.message_reply_num
sheet2[count_row,11]= act_member.homework_journal_num
sheet2[count_row,12]= act_member.act_score
count_row += 1
end
homeworks.where(:homework_type => 4).includes(:student_works).each_with_index do |home, i|
sheet = book.create_worksheet :name => "#{home.name}"
sheet[0,0] = "课程编号"
sheet[0,1] = course.id
sheet[1,0] = "课程名称"
sheet[1,1] = course.name
sheet[2,0] = "教师团队"
sheet[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet[3,0] = "主讲教师"
sheet[3,1] = course.teacher.show_real_name
sheet[3,0] = "作业批次"
sheet[3,1] = "第#{i+1}次"
sheet[3,0] = "作业名称"
sheet[3,1] = home.name
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
count_row = 5
items = home.student_works.where("work_status != 0").order("work_score desc")
if items.count == 0 && home.publish_time < Time.now && !course.is_end
update_shixun_work_status home
items = StudentWork.where("work_status != 0 and homework_common_id = #{home.id}").order("work_score desc")
end
items.each_with_index do |stu, j|
sheet[count_row,0]= j + 1
sheet[count_row,1] = stu.user.show_real_name
sheet[count_row,2] = stu.user.login
sheet[count_row,3] = stu.user.user_extensions.student_id
sheet[count_row,4] = strip_html stu.description
sheet[count_row,5] = stu.late_penalty
sheet[count_row,6] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,7] = format_time(stu.commit_time)
count_row += 1
end
end
homeworks.where(:homework_type => 1).includes(:student_works).each_with_index do |home, i|
sheet = book.create_worksheet :name => "普通作业第#{i+1}次"
sheet[0,0] = "课程编号"
sheet[0,1] = course.id
sheet[1,0] = "课程名称"
sheet[1,1] = course.name
sheet[2,0] = "教师团队"
sheet[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet[3,0] = "主讲教师"
sheet[3,1] = course.teacher.show_real_name
sheet[3,0] = "作业批次"
sheet[3,1] = "第#{i+1}次"
sheet[3,0] = "作业名称"
sheet[3,1] = home.name
if home.anonymous_comment ==0
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des),
l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
else
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des),
l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
end
count_row = 5
items = home.student_works.where("work_status != 0").order("work_score desc")
items.each_with_index do |stu, j|
sheet[count_row,0]= j + 1
sheet[count_row,1] = stu.user.show_real_name
sheet[count_row,2] = stu.user.login
sheet[count_row,3] = stu.user.user_extensions.student_id
sheet[count_row,4] = strip_html stu.description
sheet[count_row,5] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1)
sheet[count_row,6] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(1)
if home.anonymous_comment ==0
sheet[count_row,7] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(1)
sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty
sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,11] = format_time(stu.commit_time)
else
sheet[count_row,7] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
sheet[count_row,8] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,9] = format_time(stu.commit_time)
end
count_row += 1
end
end
homeworks.where(:homework_type => 3).includes(:student_works).each_with_index do |home, i|
sheet = book.create_worksheet :name => "分组作业第#{i+1}次"
sheet[0,0] = "课程编号"
sheet[0,1] = course.id
sheet[1,0] = "课程名称"
sheet[1,1] = course.name
sheet[2,0] = "教师团队"
sheet[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet[3,0] = "主讲教师"
sheet[3,1] = course.teacher.show_real_name
sheet[3,0] = "作业批次"
sheet[3,1] = "第#{i+1}次"
sheet[3,0] = "作业名称"
sheet[3,1] = home.name
if home.anonymous_comment ==0
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des),
l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
else
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des),
l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
end
count_row = 5
items = home.student_works.where("work_status != 0").order("work_score desc")
items.each_with_index do |stu, j|
sheet[count_row,0] = j + 1
sheet[count_row,1] = stu.user.show_real_name
sheet[count_row,2] = stu.user.login
sheet[count_row,3] = stu.user.user_extensions.student_id
sheet[count_row,4] = get_group_member_names home.student_works.where(:group_id => stu.group_id).pluck(:user_id)
sheet[count_row,5] = strip_html stu.description
sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1)
sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(1)
if home.anonymous_comment ==0
sheet[count_row,8] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(1)
sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty
sheet[count_row,10] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
sheet[count_row,11] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,12] = format_time(stu.commit_time)
else
sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
sheet[count_row,9] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,10] = format_time(stu.commit_time)
end
count_row += 1
end
end
exercises.each_with_index do |exercise, i|
sheet = book.create_worksheet :name => "试卷第#{i+1}次"
sheet[0,0] = "课程编号"
sheet[0,1] = course.id
sheet[1,0] = "课程名称"
sheet[1,1] = course.name
sheet[3,0] = "教师团队"
sheet[3,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet[3,0] = "主讲教师"
sheet[3,1] = course.teacher.show_real_name
sheet[3,0] = "试卷批次"
sheet[3,1] = "第#{i+1}次"
sheet[3,0] = "试卷名称"
sheet[3,1] = exercise.exercise_name
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_objective_score),l(:excel_subjective_score),l(:excel_f_score),l(:excel_answer_time)])
count_row = 5
items = exercise.exercise_users.where("commit_status != 0").order("score desc")
items.each_with_index do |stu, j|
sheet[count_row,0] = j + 1
sheet[count_row,1] = stu.user.show_real_name
sheet[count_row,2] = stu.user.login
sheet[count_row,3] = stu.user.user_extensions.student_id
sheet[count_row,4] = stu.objective_score == -1 ? "0.0" : format("%.1f",stu.objective_score)
sheet[count_row,5] = stu.subjective_score == -1 ? "0.0" : format("%.1f",stu.subjective_score)
sheet[count_row,6] = stu.score.nil? ? '--' : stu.score.round(1)
sheet[count_row,7] = stu.commit_status == 0 ? l(:excel_no_answer) : format_time(stu.start_at)
count_row += 1
end
end
tasks.each_with_index do |task, i|
sheet = book.create_worksheet :name => "毕设任务第#{i+1}次"
sheet[0,0] = "课程编号"
sheet[0,1] = course.id
sheet[1,0] = "课程名称"
sheet[1,1] = course.name
sheet[2,0] = "教师团队"
sheet[2,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_real_name}.join('、')
sheet[3,0] = "主讲教师"
sheet[3,1] = course.teacher.show_real_name
sheet[3,0] = "作业批次"
sheet[3,1] = "第#{i+1}次"
sheet[3,0] = "作业名称"
sheet[3,1] = task.name
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id)])
if task.task_type == 2
sheet.row(4).concat([l(:excel_group_member)])
end
sheet.row(4).concat([l(:excel_homework_des), l(:excel_t_score)])
if task.cross_comment
sheet.row(4).concat(["交叉评分"])
end
sheet.row(4).concat([l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
count_row = 5
items = task.graduation_works.where("work_status != 0").order("work_score desc")
items.each_with_index do |stu, j|
column = 0
sheet[count_row,column]= j + 1
sheet[count_row,column+=1] = stu.user.show_real_name
sheet[count_row,column+=1] = stu.user.login
sheet[count_row,column+=1] = stu.user.user_extensions.student_id
if task.task_type == 2
sheet[count_row,column+=1] = get_group_member_names task.graduation_works.where(:group_id => stu.group_id).pluck(:user_id)
end
sheet[count_row,column+=1] = strip_html stu.description
sheet[count_row,column+=1] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(1)
if task.cross_comment
sheet[count_row,column+=1] = stu.cross_score.nil? ? l(:label_without_score) : stu.cross_score.round(1)
end
sheet[count_row,column+=1] = stu.late_penalty
sheet[count_row,column+=1] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(1)
sheet[count_row,column+=1] = format_time(stu.commit_time)
count_row += 1
end
=begin
if task.task_type == 1
if task.cross_comment
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des),
l(:excel_t_score),"交叉评分",l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
else
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_des),
l(:excel_t_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
end
else
if task.cross_comment
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des),
l(:excel_t_score),"交叉评分",l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
else
sheet.row(4).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_group_member),l(:excel_homework_des),
l(:excel_t_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
end
count_row = 5
items = task.graduation_works.order("work_score desc")
items.each_with_index do |stu, j|
column = 0
sheet[count_row,column]= j + 1
sheet[count_row,column+1] = stu.user.show_name
sheet[count_row,column+1] = stu.user.login
sheet[count_row,column+1] = stu.user.user_extensions.student_id
sheet[count_row,column+1] = strip_html stu.description
sheet[count_row,column+1] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2)
if task.cross_comment
sheet[count_row,column+1] = stu.cross_score.nil? ? l(:label_without_score) : stu.cross_score.round(2)
end
sheet[count_row,column+1] = stu.late_penalty
sheet[count_row,column+1] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
sheet[count_row,column+1] = format_time(stu.commit_time)
count_row += 1
end
end
=end
end
book.write xls_report
xls_report.string
end
end