You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/controllers/subjects_controller.rb

402 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# encoding: utf-8
class SubjectsController < ApplicationController
layout 'base_subject'
# 如要添加或修改before_filter时请将handle_openi_request这个before_filter放至第一位
before_filter :handle_openi_request, if: -> { user_login_and_from_openi? }, only: [:show]
before_filter :require_login, :except => [:show, :index]
before_filter :check_authentication, :except => [:show, :index]
before_filter :find_subject, :except => [:index, :new, :create, :create_subject, :new_subject, :append_to_stage, :send_to_course]
before_filter :require_admin, :only => [:destroy]
include ApplicationHelper
include SubjectsHelper
def index
@tech_system = Repertoire.where(nil).order("updated_at asc")
@order = params[:order] || "publish_time"
@select = params[:select]
@search = params[:search]
# 为了本地版部署
# if @order == "myshixun_count" && !request.host.include?("educoder")
# @order = "status = 2"
# end
if @select.blank?
if @order == "myshixun_count"
@subjects = Subject.find_by_sql("SELECT subjects.id, subjects.name, subjects.stages_count, subjects.status,
COUNT(myshixuns.id) AS myshixun_member_count FROM myshixuns, stage_shixuns, subjects
WHERE myshixuns.shixun_id = stage_shixuns.shixun_id AND stage_shixuns.subject_id = subjects.id
AND `subjects`.`hidden` = 0 AND `subjects`.`status` = 2 AND `subjects`.`name` like '%#{@search}%'
GROUP BY subjects.id ORDER BY myshixun_member_count DESC")
elsif @order == "mine"
subject_ids = StageShixun.where(:shixun_id => User.current.myshixuns.map(&:shixun_id)).map(&:subject_id) + User.current.subject_members.map(&:subject_id)
@subjects = Subject.where(:id => subject_ids.uniq).where("name like '%#{@search}%'").reorder("updated_at desc")
elsif @order == "updated_at"
@subjects = Subject.where("hidden = 0 and name like '%#{@search}%' and status = 2").reorder("#{@order} desc")
else
@subjects = Subject.where("hidden = 0 and name like '%#{@search}%'").reorder("status = 2 desc, #{@order} asc")
end
else
if @order == "myshixun_count"
@subjects = Subject.find_by_sql("SELECT subjects.id, subjects.name, subjects.stages_count, subjects.status, COUNT(myshixuns.id) AS myshixun_member_count FROM myshixuns, stage_shixuns, subjects WHERE myshixuns.shixun_id = stage_shixuns.shixun_id AND stage_shixuns.subject_id = subjects.id AND `subjects`.`hidden` = 0 AND `subjects`.`status` = 2 AND `subjects`.`name` like '%#{@search}%' AND `subjects`.`repertoire_id` = #{@select} GROUP BY subjects.id ORDER BY myshixun_member_count DESC")
elsif @order == "mine"
subject_ids = StageShixun.where(:shixun_id => User.current.myshixuns.map(&:shixun_id)).map(&:subject_id) + User.current.subject_members.map(&:subject_id)
@subjects = Subject.where(:id => subject_ids.uniq, :repertoire_id => @select.to_i).where("name like '%#{@search}%'").reorder("updated_at desc")
elsif @order == "updated_at"
@subjects = Subject.where("hidden = 0 and repertoire_id = #{@select.to_i} and name like '%#{@search}%' and status = 2").reorder("#{@order} desc")
else
@subjects = Subject.where("hidden = 0 and repertoire_id = #{@select.to_i} and name like '%#{@search}%'").reorder("status = 2 desc, #{@order} asc")
end
end
@subjects = paginateHelper @subjects, 16
respond_to do |format|
format.js
format.html { render :layout => "base_edu" }
end
end
def show
@stages = @subject.stages.includes(stage_shixuns: [{shixun: :users}])
@is_member = User.current.member_of_subject?(@subject)
@is_manager = User.current.manager_of_subject?(@subject)
@admin = User.current.admin?
@challenge_tags = ChallengeTag.where(:challenge_id => Challenge.where(:shixun_id => @subject.shixuns.where(:status => 2).pluck(:id)).pluck(:id)).pluck(:name).uniq
end
def new
@subject = Subject.new
render :layout => "base_edu"
end
def create
ActiveRecord::Base.transaction do
begin
subject = Subject.create!(:name => params[:name], :learning_notes => params[:learning_notes], :description => params[:description], :user_id => User.current.id, :visits => 1, :status => 0)
SubjectMember.create!(:subject_id => subject.id, :role => 1, :user_id => subject.user_id)
redirect_to subject_path(subject)
rescue Exception => e
logger.error("create subject error info: #{e}")
redirect_to new_subject_path
end
end
end
def edit
render :layout => "base_edu"
end
def update
@subject.update_attributes(:name => params[:name], :learning_notes => params[:learning_notes], :description => params[:description])
redirect_to subject_path(@subject)
end
def destroy
if @subject
ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).destroy_all
@subject.destroy
respond_to do |format|
format.js
format.html{redirect_to subjects_path}
end
end
end
def send_to_course
params[:shixun_ids].each do |shixun_id|
shixun = Shixun.where(:id => shixun_id).first
if shixun.present? && shixun.status == 2
homework = HomeworkCommon.new(:name => shixun.name, :description => shixun.description, :anonymous_comment => 1, :homework_type => 4, :late_penalty => 5, :teacher_priority => 1, :user_id => User.current.id, :course_id => params[:course_id])
homework_detail_manual = HomeworkDetailManual.new(:te_proportion => 1.0, :ta_proportion => 0, :comment_status => 0, :evaluation_num => 0, :absence_penalty => 0)
homework.homework_detail_manual = homework_detail_manual
if homework.save
homework_detail_manual.save if homework_detail_manual
HomeworkCommonsShixuns.create(:homework_common_id => homework.id, :shixun_id => shixun.id)
create_shixun_homework_cha_setting homework, shixun
create_works_list homework
end
end
end
redirect_to homework_common_index_path(:course => params[:course_id], :homework_type => 4)
end
def update_attr
if params[:name]
@subject.update_attributes(:name => params[:name])
elsif params[:description]
@subject.update_attributes(:description => params[:description])
end
end
def new_subject
if Course.where(:tea_id => User.current.id).count > 0
@status = 1
@course_lists = CourseList.where(:id => ShixunMajorCourse.where(:shixun_id => Shixun.where(:user_id => User.current.id).map(&:id)).map(&:course_list_id))
else
@status = 0
end
respond_to do |format|
format.js
end
end
def create_subject
if params[:course_list_id]
course = CourseList.find params[:course_list_id]
if course
subject = Subject.create(:name => course.name, :user_id => User.current.id, :visits => 0, :status => 0, :course_list_id => course.id)
end
end
redirect_to subject_path(subject)
end
def choose_subject_shixun
#course_list = @subject.course_list
@search = params[:search]
@type = params[:type]
if User.current.admin?
@shixuns = Shixun.select([:id, :name, :status, :myshixuns_count, :identifier])
published_shixun_ids = Shixun.pluck(:id)
tag_ids = ShixunTagRepertoire.where(:shixun_id => published_shixun_ids).pluck(:tag_repertoire_id).uniq
@tags = TagRepertoire.select([:id, :name]).where(:id => tag_ids)
else
shixun_ids = ShixunMember.where(:user_id => @subject.subject_members.map(&:user_id)).pluck(:shixun_id).uniq
tag_ids = ShixunTagRepertoire.where(:shixun_id => shixun_ids).pluck(:tag_repertoire_id).uniq
@tags = TagRepertoire.select([:id, :name]).where(:id => tag_ids)
@shixuns = Shixun.select([:id, :name, :status, :myshixuns_count, :identifier]).where(:id => shixun_ids)
end
if params[:search]
@shixuns = @shixuns.where("name like ?", "%#{@search}%")
end
unless @type.nil? || @type == "" || @type == "all"
shixun_ids = ShixunTagRepertoire.where(:tag_repertoire_id => @type).pluck(:shixun_id).uniq
@shixuns = @shixuns.select([:id, :name, :myshixuns_count, :identifier, :status]).where(:id => shixun_ids)
end
@shixuns = @shixuns.reorder("created_at desc")
@limit = 10
@page = params['page'] || 1
@shixuns_count = @shixuns.size
@total_pages = (@shixuns_count / 10.0).ceil
@shixuns = paginateHelper @shixuns, @limit
@shixuns = @shixuns.includes(:myshixuns)
respond_to do |format|
format.js
format.json {
render json: shixun_json_data(@shixuns)
}
end
end
def append_to_stage
@shixuns = Shixun.where(:id => params[:shixun_homework]).reorder("id desc")
end
def publish
apply = ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).order("created_at desc").first
if apply && apply.status == 0
@status = 0
else
#if Shixun.where(:id => @subject.stage_shixuns.map(&:shixun_id), :status => [0, 1]).count > 0
# @status = 2
#else
@subject.update_attributes(:status => 1)
ApplyAction.create(:container_type => "ApplySubject", :container_id => @subject.id, :user_id => User.current.id, :status => 0)
# notes = User.current.show_name.to_s + " 申请发布课程实训:<a href='#{subject_path(@subject)}'>#{@subject.name}</a>"
# JournalsForMessage.create(:jour_id => 1, :jour_type => 'Principal', :user_id => User.current.id, :notes => notes, :private => 1, :reply_id => 0)
begin
status = Trustie::Sms.send(mobile: '15388083362', send_type:'publish_subject' , name: '管理员')
rescue => e
Rails.logger.error "发送验证码出错: #{e}"
end
@status = 1
# end
end
end
def cancel_publish
apply = ApplyAction.where(:container_type => "ApplySubject", :container_id => @subject.id).order("created_at desc").first
if apply && apply.status == 0
apply.update_attributes(:status => 3)
apply.tidings.destroy_all
end
@subject.update_attributes(:status => 0)
redirect_to subject_path(@subject)
end
def cancel_has_publish
@subject.update_attributes(:status => 0)
redirect_to subject_path(@subject)
end
def add_collaborators
if !params[:search].nil?
member_ids = "(" + @subject.subject_members.map(&:user_id).join(',') + ")"
condition = "%#{params[:search].strip}%".gsub(" ","")
@users = User.where("id not in #{member_ids} and status = 1 and LOWER(concat(lastname, firstname, login, mail)) LIKE '#{condition}'").includes(:user_extensions)
end
end
def add_subject_members
unless params[:membership][:user_ids].blank?
memberships = params[:membership][:user_ids]
memberships.each do |member|
user = User.find(member)
SubjectMember.create!(:user_id => member, :subject_id => @subject.id, :role => 2,
:position => @subject.subject_members.size + 1)
end
end
end
def delete_member
if User.current.admin?
ActiveRecord::Base.transaction do
member = @subject.subject_members.where(:id => params[:mem_id]).first
if member.present? && member.role != 1
@subject.subject_members.where("position > #{member.position}").update_all("position = position - 1")
member.destroy
end
end
else
render_403
end
end
def up_member_position
if User.current.member_of_subject?(@subject)
ActiveRecord::Base.transaction do
member = @subject.subject_members.where(:id => params[:mem_id]).first
raise "不能再上移了" if member.position == 1
up_member = @subject.subject_members.where(:position => member.position - 1).first
up_member.update_attribute(:position, member.position)
member.update_attribute(:position, member.position - 1)
end
else
render_403
end
end
def down_member_position
if User.current.member_of_subject?(@subject)
ActiveRecord::Base.transaction do
begin
member = @subject.subject_members.where(:id => params[:mem_id]).first
raise "不能再下移了" if member.position == @subject.subject_members.count
down_member = @subject.subject_members.where(:position => member.position + 1).first
down_member.update_attribute(:position, member.position)
member.update_attribute(:position, member.position + 1)
rescue Exception => e
raise ActiveRecord::Rollback
end
end
else
render_403
end
end
def statistics
@learn_count = @subject.subject_users
shixun_ids = @subject.stage_shixuns.pluck(:shixun_id)
homework_common_id = HomeworkCommonsShixuns.where(:shixun_id => shixun_ids).pluck(:homework_common_id).uniq
homework_common_id = homework_common_id.blank? ? -1 : homework_common_id.join(",")
# 受用课堂(已经发布的实训(在此路径中的实训)作业的个数)
homework_common_id = HomeworkDetailManual.where("homework_common_id in(#{homework_common_id}) and comment_status > 0").pluck(:homework_common_id)
course_ids = HomeworkCommon.where(:id => homework_common_id).pluck(:course_id).uniq
@course_count = course_ids.count
course_ids = course_ids.blank? ? -1 : course_ids.join(",")
# 受用院校
user_ids = Myshixun.where(:shixun_id => shixun_ids).pluck(:user_id).uniq
school_ids = UserExtensions.where(:user_id => user_ids).pluck(:school_id).uniq
@schools_count = school_ids.count
# type 1: 采用课堂情况+章节使用情况 2实训使用详情 + 实训学习统计 3 院校学习情况
if params[:type].to_i == 3
@schools = School.select([:id, :name]).where(:id => school_ids)
@schools =
@schools.map do |s|
users = UserExtensions.where(:school_id => s.id, :user_id => user_ids).pluck(:user_id)
student_count = users.count
pass_count = Myshixun.where(:user_id => users, :status => 1).pluck(:user_id).uniq.count
unpass_count = student_count - pass_count
ss = s.attributes.dup.merge({student_count: student_count, pass_count: pass_count, unpass_count: unpass_count}).to_json
JSON.parse(ss)
end
@schools = @schools.sort{|x,y| y['student_count'] <=> x['student_count']}.first(10)
elsif params[:type].to_i == 2
@stages = @subject.stages.select([:id, :position]).includes(stage_shixuns: [{shixun: {myshixuns: {user: :user_extensions}}}])
else
# 采用课堂情况
courses = Course.where("is_delete = 0 and id in (#{course_ids}) and school_id is not null")
school_ids = courses.map(&:school_id).uniq
@schools = School.select([:id, :name]).where(:id => school_ids)
@schools =
@schools.map do |s|
school_courses = courses.where(:school_id => s.id)
course_count = school_courses.count
course_student_ids = []
school_courses.each do |c|
course_student_ids += c.student.map(&:student_id)
end
student_count = course_student_ids.uniq.size
homework_count = HomeworkCommon.find_by_sql("select count(*) cnt from homework_commons hc join courses c on hc.course_id = c.id
where c.school_id = #{s.id} and hc.id in(#{homework_common_id.join(",")})").first.try(:cnt)
ss = s.attributes.dup.merge({course_count: course_count, student_count: student_count,homework_count: homework_count}).to_json
JSON.parse(ss)
end
@schools = @schools.sort{|x,y| y['homework_count'] <=> x['homework_count']}
@schools = paginateHelper @schools, 10
# TODO: 这个可以异步加载,让页面刷新完成后再加载图形数据
# 章节使用情况
@stage_user_info = []
sum = 0 #总数
@subject.stages.includes(:stage_shixuns).each do |stage|
shixun_ids = stage.stage_shixuns.pluck(:shixun_id)
if shixun_ids.present?
homework_common_id = HomeworkCommonsShixuns.where(:shixun_id => shixun_ids).pluck(:homework_common_id).uniq
if homework_common_id.present?
publish_homework = HomeworkDetailManual.where("homework_common_id in(#{homework_common_id.join(",")}) and comment_status > 0").pluck(:homework_common_id)
use_count = publish_homework.present? ? HomeworkCommon.find_by_sql("select count(*) cnt from homework_commons hc join courses c on hc.course_id = c.id
where hc.id in(#{publish_homework.join(",")}) and c.school_id is not null").first.try(:cnt) : 0
sum += use_count
else
sum += 0
use_count = 0
end
@stage_user_info << use_count
else
sum += 0
@stage_user_info << 0
end
end
# 章节占整体的百分数
@stage_user_info = @stage_user_info.map{|x| sum ==0 ? 0 : (x * 100 / sum.to_f).round}
@data = []
@data_info = []
@stage_user_info.each_with_index do |s, index|
@data << "#{index + 1}"
@data_info << { value: s, name:"#{index + 1}"}
end
end
respond_to do |format|
format.js
format.html{render :layout => 'base_edu'}
end
end
private
# Find subject of id params[:id]
def find_subject
@subject = Subject.find_by_id(params[:id])
render_404 if @subject.nil?
rescue ActiveRecord::RecordNotFound
render_404
end
end