ecloud_sso
jingquan huang 5 years ago
commit 8e4c06694a

@ -70,9 +70,25 @@ class HomeworkCommonsController < ApplicationController
else
case order
when '1'
if @user_course_identity == Course::STUDENT
unified_homework_ids = @homework_commons.published_no_end.unified_setting.pluck(:id)
group_homework_ids = @course.homework_group_settings.where("course_group_id = #{@member.course_group_id&.to_i}").published_no_end.pluck(:homework_common_id)
homework_ids = unified_homework_ids + group_homework_ids
homework_ids = homework_ids.blank? ? "(-1)" : "(" + homework_ids.join(",") + ")"
sql_str = %Q(homework_commons.id in #{homework_ids})
else
sql_str = %Q(homework_detail_manuals.comment_status = #{order} and homework_commons.end_time > '#{Time.now}')
end
when '2'
if @user_course_identity == Course::STUDENT
unified_homework_ids = @homework_commons.homework_ended.unified_setting.pluck(:id)
group_homework_ids = @course.homework_group_settings.where("course_group_id = #{@member.course_group_id&.to_i}").has_end.pluck(:homework_common_id)
homework_ids = unified_homework_ids + group_homework_ids
homework_ids = homework_ids.blank? ? "(-1)" : "(" + homework_ids.join(",") + ")"
sql_str = %Q(homework_commons.id in #{homework_ids} and allow_late = 1 and (late_time is null or late_time > '#{Time.now}'))
else
sql_str = %Q(allow_late = 1 and homework_commons.end_time < '#{Time.now}' and (late_time is null or late_time > '#{Time.now}'))
end
when '3'
sql_str = %Q(homework_detail_manuals.comment_status = #{order} and homework_detail_manuals.evaluation_end > '#{Time.now}')
when '4'

@ -14,6 +14,7 @@ class Users::UpdateAccountForm
validates :technical_title, presence: true, unless: -> { identity.to_s == 'student' }
validates :student_id, presence: true, if: -> { identity.to_s == 'student' }
validates :school_id, presence: true
validates :department_id, presence: true
validate :check_school_exist
def check_school_exist

@ -116,6 +116,12 @@ module HomeworkCommonsHelper
status << "提交中"
time = "提交剩余时间:" + how_much_time(max_end_time)
time_status = 1
else
if max_end_time.present? && max_end_time < Time.now && homework_common.allow_late &&
(homework_common.late_time.nil? || homework_common.late_time > Time.now)
status << "补交中"
time = "补交剩余时间:" + how_much_time(homework_common.late_time)
time_status = 2
else
status << "已截止"
time = course.end_date.present? ? ("评阅剩余时间:" + how_much_time(course.end_date.end_of_day)) : ""
@ -123,6 +129,7 @@ module HomeworkCommonsHelper
end
end
end
end
status << "未开启补交" if !homework_common.allow_late && time_status == 1
end
end

@ -257,10 +257,10 @@ class Course < ApplicationRecord
# 老师负责的分班id
def charge_group_ids user
member = user.is_a?(CourseMember) ? user : course_member(user.id)
member = user.is_a?(CourseMember) ? user : course_member(user&.id)
group_ids = if member.present?
member.teacher_course_groups.size > 0 ? member.teacher_course_groups.pluck(:course_group_id) : course_groups.pluck(:id)
elsif user.admin_or_business?
elsif user&.admin_or_business?
course_groups.pluck(:id)
else
[]
@ -387,7 +387,7 @@ class Course < ApplicationRecord
end
def max_activity_time
course_acts.pluck(:updated_at).max
course_activities.pluck(:updated_at).max
end
# 课堂作业数

@ -47,6 +47,7 @@ class HomeworkCommon < ApplicationRecord
scope :homework_published, -> {where("homework_commons.publish_time IS NOT NULL AND homework_commons.publish_time <= ? ",Time.now)}
scope :published_no_end, -> {where("homework_commons.publish_time IS NOT NULL AND homework_commons.publish_time < ?
and homework_commons.end_time > ?", Time.now, Time.now)}
scope :homework_ended, -> {where("homework_commons.end_time IS NOT NULL AND homework_commons.end_time <= ? ",Time.now)}
scope :search_homework_type, lambda {|num| where(homework_type:num)}
scope :unified_setting, -> {where("unified_setting = ? ", 1)}

@ -7,5 +7,6 @@ class HomeworkGroupSetting < ApplicationRecord
scope :published_no_end, -> {where("homework_group_settings.publish_time IS NOT NULL AND homework_group_settings.publish_time < ?
and homework_group_settings.end_time > ?", Time.now, Time.now)}
scope :none_end, -> {where("homework_group_settings.end_time IS NULL or homework_group_settings.end_time > ?", Time.now)}
scope :has_end, -> {where("homework_group_settings.end_time IS NOT NULL AND homework_group_settings.end_time <= ?", Time.now)}
end

@ -44,7 +44,7 @@ class Admins::SchoolDailyStatisticService < ApplicationService
courses = Course.where(is_delete: 0, school_id: ids).group('school_id')
course_map = courses.count
nearly_course_time_map = courses.joins(:course_acts).maximum('course_activities.updated_at')
nearly_course_time_map = courses.joins(:course_activities).maximum('course_activities.updated_at')
active_course_map = courses.where(is_end: false).count
shixun_map = Shixun.joins(user: :user_extension).where(user_extensions: { identity: :teacher, school_id: ids })

@ -3,7 +3,7 @@ class Videos::DispatchCallbackService < ApplicationService
def initialize(params)
@video = Video.find_by(uuid: params[:VideoId])
@params = params``
@params = params
end
def call

@ -25,8 +25,8 @@ json.homeworks @homework_commons.each do |homework|
json.upper_category_name homework.course_second_category&.name unless params[:category]
charge_ids = @course.charge_group_ids(@member)
json.publish_immediately @user_course_identity < Course::STUDENT && homework.publish_immediately(charge_ids)
json.end_immediately @user_course_identity < Course::STUDENT && homework.end_immediately(charge_ids)
json.publish_immediately @user.logged? && @user_course_identity < Course::STUDENT && homework.publish_immediately(charge_ids)
json.end_immediately @user.logged? && @user_course_identity < Course::STUDENT && homework.end_immediately(charge_ids)
unless curr_status[:status].include?("未发布")
work_count = calculate_work_count homework, @member

@ -0,0 +1,254 @@
# 执行示例 RAILS_ENV=production bundle exec rake migrate_course_resource:import_attachments args=3835,2526
#
desc "同步课堂学生数据"
namespace :migrate_course_resource do
if ENV['args']
source_id = ENV['args'].split(",")[0] # 源课堂id
target_id = ENV['args'].split(",")[1] # 目标课堂id
end
task import_attachments: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
source_course.attachments.each do |atta|
if atta.course_second_category.present?
target_category = CourseSecondCategory.find_by(name: atta.course_second_category.name, course_id: target_course.id, category_type: "attachment")
unless target_category.present?
course_module = target_course.course_modules.find_by(module_type: "attachment")
target_category = CourseSecondCategory.create(name: atta.course_second_category.name, course_id: target_course.id,
category_type: "attachment", course_module_id: course_module&.id,
position: course_module&.course_second_categories&.count.to_i + 1)
end
end
target_course.attachments << target_course.attachments.build(atta.attributes.except("id").merge(
quotes: 0,
downloads: 0,
author_id: target_course.tea_id,
created_on: Time.now,
course_second_category_id: target_category&.id.to_i
))
end
end
task import_videos: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
source_course.course_videos.each do |video|
target_course.course_videos << CourseVideo.new(video_id: video.video_id)
end
end
task import_homeworks: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
source_course.homework_commons.each do |homework|
ActiveRecord::Base.transaction do
if homework.course_second_category.present?
target_category = CourseSecondCategory.find_by(name: homework.course_second_category.name, course_id: target_course.id, category_type: "shixun_homework")
unless target_category.present?
course_module = target_course.course_modules.find_by(module_type: "shixun_homework")
target_category = CourseSecondCategory.create(name: homework.course_second_category.name, course_id: target_course.id,
category_type: "shixun_homework", course_module_id: course_module&.id,
position: course_module&.course_second_categories&.count.to_i + 1)
end
end
# 复制作业的基本信息
new_homework = HomeworkCommon.new(name: homework.name, user_id: target_course.tea_id, description: homework.description,
homework_type: homework.homework_type, course_id: target_course.id,
reference_answer: homework.reference_answer, course_second_category_id: target_category&.id.to_i)
# 作业的基本设置复制
new_homework.homework_detail_manual = HomeworkDetailManual.new
new_homework_detail_manual = new_homework.homework_detail_manual
new_homework_detail_manual.te_proportion = 0.7
new_homework_detail_manual.ta_proportion = 0.3
if new_homework.homework_type == "group"
# 分组作业表的复制
old_homework_group = homework.homework_detail_group
new_homework.homework_detail_group = HomeworkDetailGroup.new
new_homework.homework_detail_group.min_num = old_homework_group&.min_num
new_homework.homework_detail_group.max_num = old_homework_group&.max_num
new_homework.homework_detail_group.base_on_project = old_homework_group&.base_on_project
end
if new_homework.homework_type == "practice"
# 分组作业表的复制
new_homework.homework_commons_shixun = HomeworkCommonsShixun.new
new_homework.homework_commons_shixun.shixun_id = homework.homework_commons_shixun&.shixun_id
homework.position = HomeworkCommon.where(course_id:target_course.id, homework_type: "practice").pluck(:position).max.to_i + 1
homework.homework_challenge_settings.each do |setting|
new_homework.homework_challenge_settings << HomeworkChallengeSetting.new(challenge_id: setting.challenge_id,
shixun_id: setting.shixun_id, score: setting.score)
end
end
# 附件
if new_homework.save
homework.attachments.try(:each) do |attachment|
att = attachment.copy
att.container_id = nil
att.container_type = nil
att.author_id = homework.user_id
att.attachtype = attachment.attachtype || 1
# att.attachtype = 1
att.copy_from = attachment.id
att.save!
new_homework.attachments << att
end
new_homework_detail_manual.save if new_homework_detail_manual
new_homework.homework_detail_group.save if new_homework.homework_detail_group
new_homework.homework_commons_shixun.save if new_homework.homework_commons_shixun
CreateStudentWorkJob.perform_later(new_homework.id)
end
end
end
end
task import_exercises: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
source_course.exercises.each do |exercise|
ActiveRecord::Base.transaction do
new_exercise = Exercise.new(:exercise_name => exercise.exercise_name, :exercise_description => exercise.exercise_description,
:user_id => target_course.tea_id, :course_id => target_course.id)
# 复制试卷基本信息
exercise.exercise_questions.each do |q|
option = {
:question_title => q.question_title,
:question_type => q.question_type || 1,
:question_number => q.question_number,
:question_score => q.question_score,
:shixun_name => q.shixun_name,
:shixun_id => q.shixun_id,
:is_ordered => q.is_ordered
}
exercise_question = new_exercise.exercise_questions.new option
# question_type5实训题其他是非实训题
if q.question_type != 5
# 复制选择题题目选项
q.exercise_choices.try(:each_with_index) do |choice, index|
exercise_question.exercise_choices.new({choice_position: index+1, choice_text: choice.choice_text})
end
# 复制标准答案(填空题和问答题) 多空填空题的话应该是原标准答案的exercise_choice_id即为题空的位置。
q.exercise_standard_answers.try(:each) do |answer|
exercise_question.exercise_standard_answers.new({exercise_choice_id: answer.exercise_choice_id, answer_text: answer.answer_text})
end
else
# 复制实训题
q.exercise_shixun_challenges.try(:each_with_index) do |sc, index|
exercise_question.exercise_shixun_challenges.new({position: index+1, challenge_id: sc.challenge_id,
shixun_id: sc.shixun_id, question_score: sc.question_score})
end
end
end
new_exercise.save!
end
end
end
task import_polls: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
source_course.polls.each do |poll|
new_poll = Poll.new(:polls_name => poll.polls_name, :polls_description => poll.polls_description, :user_id => target_course.tea_id,
:polls_type => 'Course', :course_id => target_course.id)
poll.poll_questions.try(:each) do |q|
option = {
:question_title => q.question_title,
:question_type => q.question_type || 1,
:is_necessary => q.is_necessary,
:question_number => q.question_number,
:max_choices => q.max_choices,
:min_choices => q.min_choices
}
poll_question = new_poll.poll_questions.new option
q.poll_answers.try(:each_with_index) do |choice, index|
poll_question.poll_answers.new({answer_position: index+1, answer_text: choice.answer_text})
end
end
new_poll.save!
end
end
task import_members: :environment do
source_course = Course.find_by(id: source_id)
target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank?
# 先把target——course中的老师创建分班权限
target_course.teachers.each do |member|
if member.teacher_course_groups.blank?
target_course.course_groups.each do |group|
TeacherCourseGroup.create!(course_group_id: group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id)
end
end
end
source_course.course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).each do |teacher|
new_member = target_course.teachers.find_by(user_id: teacher.user_id)
unless new_member.present?
new_member = CourseMember.create!(course_id: target_course.id, user_id: teacher.user_id, role: teacher.role)
end
end
source_course.course_groups.each do |group|
unless target_course.course_groups.where(name: group.name).exists?
new_group = CourseGroup.create!(course_id: target_course.id, name: group.name, position: target_course.course_groups.pluck(:position).max.to_i + 1)
else
new_group = target_course.course_groups.find_by(name: group.name)
end
new_user_ids = []
group.course_members.where(role: 4).each do |member|
new_member = target_course.students.find_by(user_id: member.user_id)
if new_member.present?
new_member.update_attributes(course_group_id: new_group.id)
else
CourseMember.create!(course_id: target_course.id, course_group_id: new_group.id, user_id: member.user_id, role: member.role)
new_user_ids << member.user_id
end
end
CourseAddStudentCreateWorksJob.perform_later(target_course.id, new_user_ids) unless new_user_ids.blank?
group.teacher_course_groups.each do |teacher_group|
member = CourseMember.find_by(course_id: target_course.id, user_id: teacher_group.user_id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR])
if member.present? && !member.teacher_course_groups.where(course_group_id: new_group.id).exists?
TeacherCourseGroup.create!(course_group_id: new_group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id)
end
end
end
user_ids = []
source_course.students.where(course_group_id: 0).each do |member|
new_member = target_course.students.find_by(user_id: member.user_id)
if new_member.present?
new_member.update_attributes(course_group_id: 0)
else
CourseMember.create!(course_id: target_course.id, course_group_id: 0, user_id: member.user_id, role: member.role)
user_ids << member.user_id
end
end
CourseAddStudentCreateWorksJob.perform_later(target_course.id, user_ids) unless user_ids.blank?
end
end

@ -1,32 +0,0 @@
# 执行示例 RAILS_ENV=production bundle exec rake migrate_course_student:student args=3835,2526,21950,1000
# args 第一个课程 course_id第二个参数是学校school_id第三个参数是部门id第四个参数是迁移数量
#
desc "同步学校的学生"
namespace :migrate_course_student do
if ENV['args']
course_id = ENV['args'].split(",")[0] # 对应课堂的id
school_id = ENV['args'].split(",")[1] # 对应学校id
department_id = ENV['args'].split(",")[2] # 对应部门id
limit = ENV['args'].split(",")[3] # 限制导入的数量
end
task :student => :environment do
course = Course.find course_id
users = User.joins(:user_extension).where(user_extensions: {school_id: school_id, department_id: department_id, identity: 1}).limit(limit)
user_ids = []
users.each do |user|
if user.student_id.present? && !course.students.exists?(user_id: user.id)
begin
CourseMember.create!(course_id: course_id, user_id: user.id, role: 4)
user_ids << user.id
rescue Exception => e
Rails.logger(e.message)
end
end
end
CourseAddStudentCreateWorksJob.perform_later(course_id, user_ids)
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 149 KiB

@ -175,6 +175,9 @@ class ListPageIndex extends Component{
isexcellent:excellent
})
}
updatabanners=()=>{
this.refs.CoursesBanner.updatabanner()
}
render() {
let {yslGuideone} =this.state;
// console.log("98");
@ -187,7 +190,7 @@ class ListPageIndex extends Component{
<div>
<div className="newMain clearfix">
{/*头部banner*/}
<CoursesBanner {...this.props} ispostexcellenttype={(excellent)=>this.ispostexcellenttype(excellent)}></CoursesBanner>
<CoursesBanner ref={"CoursesBanner"} {...this.props} ispostexcellenttype={(excellent)=>this.ispostexcellenttype(excellent)}></CoursesBanner>
{/*下面是指引哦*/}
{/*{yslGuideone!==undefined?*/}
{/*(*/}
@ -249,7 +252,7 @@ class ListPageIndex extends Component{
></Route>
<Route path="/courses/:coursesId/teachers"
render={
(props) => (<TeacherList {...this.props} {...props} {...this.state} />)
(props) => (<TeacherList updatabanners={()=>this.updatabanners()} {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 学生列表*/}

@ -42,7 +42,7 @@ class ModalWrapper extends Component{
{
`
body {
overflow: hidden !important;
width: calc(100%) !important;
}
`
}

@ -954,7 +954,7 @@ class Coursesleftnav extends Component{
{
`
body {
overflow: hidden !important;
width: calc(100%) !important;
}
`
}

@ -130,7 +130,9 @@ class CoursesHome extends Component{
<div className="newMain clearfix">
<style>
{
`
` ::-webkit-scrollbar {
width: 0px !important;
}
.courses-head{
width: 100%;
height: 300px;

@ -153,7 +153,7 @@ class HomeworkModal extends Component{
{
`
body {
overflow: hidden !important;
width: calc(100%) !important;
}
`
}

@ -43,6 +43,16 @@ class ModalsRename extends Component{
centered={true}
className={"Navmodal"}
>
{this.props.Navmodalnametype===undefined?false:this.props.Navmodalnametype===true?<style>
{
`
body{
width: calc(100%) !important;
}
`
}
</style>:""}
<div className={"fl mt5"}>{this.props.Navname}名称</div>
<Input placeholder={"请输入名称最大限制60个字符"}
className={"inputNav greyInput fl"}

@ -443,7 +443,7 @@ class NewShixunModel extends Component{
<div>
<style>
{
`body{ overflow: hidden !important; }
`body{ width: calc(100%) !important; }
.ant-drawer-content{ overflow:auto !important; background: #f5f5f5; }
.yslbottomsj{position: absolute;bottom: -8px;}
.ant-drawer-close{

@ -64,6 +64,7 @@ function CourseGroupChooser({ course_groups, isAdminOrCreator = true, item, inde
<Checkbox.Group onChange={(e) => onCheckAllChange(e, item, index)} value={[checkAllValue]}>
<Checkbox
value={true}
disabled={!isAdminOrCreator}
style={{ marginRight: '6px' }} onClick={() => {}}
>全选</Checkbox>
</Checkbox.Group>

@ -382,6 +382,7 @@ class studentsList extends Component{
.then((response) => {
if (response.data.status == 0) {
this.props.showNotification('修改成功')
this.props.updatabanners()
const newArray = ids.map((item) => {return {id: item, name: this.state.course_groups_map[item]}});
this.setState(
(prevState) => ({

@ -1126,7 +1126,7 @@ class ShixunHomework extends Component{
{
`
body {
overflow: hidden !important;
width: calc(100%) !important;
}
`
}

@ -27,7 +27,7 @@ render() {
{
`
body{
overflow: hidden !important;
width: calc(100%) !important;
}
.ant-modal-body {
padding: 20px 40px;

@ -109,9 +109,9 @@ positon:0
{( item.category === 1 ? "单选题" : "多选题" )}
</div> */}
<div className="clearfix">
<span className="fl" style={{"color":"#8B9399"}}>{index+1}.</span>
<div id={`choose_subject_${index+1}`} className="fl choiceMD">
<textarea style={{display:'none'}}>{item.subject}</textarea>
<span className="fl" style={{"color":"#8B9399"}}>{index+1}.</span><textarea style={{display:'none'}}>{item.subject}</textarea>
</div>
</div>

@ -166,6 +166,9 @@ class ShixunPathSearch extends Component{
<style>
{
`
::-webkit-scrollbar {
width: 0px !important;
}
.pathImg{
width: 100%;
height: 300px;

Loading…
Cancel
Save