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.
educoder/app/models/homework_common.rb

252 lines
9.5 KiB

6 years ago
class HomeworkCommon < ApplicationRecord
# homework_type 1普通作业 2编程作业弃用 3分组作业 4实训作业
enum homework_type: { normal: 1, program: 2, group: 3, practice: 4 }, _suffix: true
has_many :homework_group_settings, dependent: :destroy
has_many :student_works, -> { where("is_delete != 1") }
has_one :homework_detail_manual, dependent: :destroy
# 分组作业的设置
has_one :homework_detail_group, dependent: :destroy
belongs_to :course, counter_cache: true
belongs_to :homework_bank, optional: true
has_many :homework_challenge_settings, dependent: :destroy
has_one :homework_commons_shixun, dependent: :destroy
has_and_belongs_to_many :shixuns, through: :homework_commons_shixun
# attachtype: 1描述的附件 2参考答案的附件
has_many :attachments, as: :container, dependent: :destroy
# 作业的评论
has_many :journals_for_messages, as: :jour, dependent: :destroy
# 二级目录
belongs_to :course_second_category, optional: true
# 课堂动态
has_many :course_acts, class_name: 'CourseActivity', as: :course_act, dependent: :destroy
has_many :tidings, as: :container, dependent: :destroy
# 实训作业的分班查重记录
has_many :homework_group_reviews, :dependent => :destroy
# 学生的查重情况
has_many :homework_review_results, :dependent => :destroy
validates :name, length: { maximum: 60 }
validates :description, length: { maximum: 5000 }
validates :reference_answer, length: { maximum: 5000 }
# after_update :update_activity
before_destroy :update_homework_bank_quotes
#1已发布的课堂作业
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 :search_homework_type, lambda {|num| where(homework_type:num)}
scope :unified_setting, -> {where("unified_setting = ? ", 1)}
# 是否显示参考答案
def view_answer identity, user_id
identity < Course::STUDENT || (identity == Course::STUDENT && answer_public &&
self.end_or_late && self.user_work(user_id).try(:work_status).to_i > 0)
end
# 申诉阶段
def appeal_duration
self.anonymous_appeal && [3, 4].include?(homework_detail_manual.comment_status)
end
# 作业对应的子目录/父目录名称
def category_info
case self.homework_type
when 'normal'
{category_id: course.common_course_modules.first.try(:id), category_name: course.common_course_modules.first.try(:module_name)}
when 'group'
{category_id: course.group_course_modules.first.try(:id), category_name: course.group_course_modules.first.try(:module_name)}
when 'practice'
if self.course_second_category.present?
{category_id: self.course_second_category.try(:id), category_name: self.course_second_category.try(:name)}
else
{category_id: course.shixun_course_modules.first.try(:id), category_name: course.shixun_course_modules.first.try(:module_name)}
end
end
end
# 根据是否统一发布获取作业的作品列表
def all_works
student_works = self.unified_setting ? self.student_works :
self.student_works.where(user_id: self.course.students.where(
course_group_id: self.homework_group_settings.group_published.pluck(:course_group_id)).
pluck(:user_id))
end
# 分班权限的老师可见的作品列表
def teacher_works user_id
member = course.course_member(user_id)
teacher_course_groups = member.try(:teacher_course_groups)
all_student_works = self.all_works
# 有分班权限的统计管理的分班且已发布的学生情况
if member.present? && teacher_course_groups.size > 0
group_ids = teacher_course_groups.pluck(:course_group_id)
all_student_works = all_student_works.where(user_id: course.students.where(course_group_id: group_ids).pluck(:user_id))
end
all_student_works
end
def user_work user_id
work = self.student_works.find_by_user_id(user_id)
end
# 是否在补交阶段内
def late_duration
homework_setting = self.homework_group_setting(User.current.id)
!course.is_end && self.publish_time && self.publish_time < Time.now && homework_setting.end_time &&
homework_setting.end_time < Time.now && self.allow_late && (self.late_time.nil? || self.late_time > Time.now)
end
# 作业是否补交截止或者不允许补交且提交截止
def end_or_late
status = false
if self.course.is_end || (self.allow_late && self.late_time && self.late_time < Time.now)
status = true
elsif !self.allow_late
homework_setting = self.homework_group_setting(User.current.id)
status = homework_setting.end_time && homework_setting.end_time < Time.now
end
status
end
# 作业是否可以查重
def code_review
self.homework_type == 'practice' && self.publish_time.present? && self.publish_time < Time.now && self.homework_group_reviews.count == 0
end
# 作业能否立即发布
def publish_immediately user
homework_detail_manual.try(:comment_status) == 0 || homework_group_settings.where(course_group_id: course.charge_group_ids(user)).
none_published.count > 0
end
# 作业能否立即截止
def end_immediately user
(unified_setting && homework_detail_manual.try(:comment_status) == 1 && end_time > Time.now) || homework_group_settings.
where(course_group_id: course.charge_group_ids(user)).published_no_end.count > 0
end
# 学生是否提交了作品
def user_has_commit_work user_id
work = self.student_works.find_by_user_id(user_id)
work.present? && work.work_status != 0
end
# 是否有学生提交过作品
def has_commit_work
student_works.has_committed.count > 0
end
# 是否有学生关联了项目
def has_relate_project
homework_type == "group" && student_works.where("project_id != 0").count > 0
end
# 作业描述的附件
def des_attachments
attachments.where(attachtype: 1)
end
# 参考答案的附件
def ref_attachments
attachments.where(attachtype: 2)
end
def update_activity
course_activity = CourseActivity.find_by_course_act_type_and_course_act_id(self.class.to_s, self.id)
course_activity.update_attributes(updated_at: Time.now) if course_activity
end
#删除时更新题库中的引用数
def update_homework_bank_quotes
old_banks = HomeworkBank.where(homework_common_id: self.id)
unless old_banks.blank?
old_banks.each do |bank|
bank.update_attributes(quotes: (bank.quotes - 1) > 0 ? (bank.quotes - 1) : 0, homework_common_id: nil)
end
end
end
# 查重是否有新结果
def code_reviews_new_results?
self.homework_group_reviews.where(status: 0).count > 0
end
# 任务已评数 user_id: 对应老师的id
def comment_count(user_id)
course = self.course
# 如果有分班,则取此老师对应分班的已评数,没有分班,则取所有的
course_group_ids = course.group_course_power(user_id)
sql =
if course_group_ids.count > 0
%Q{
SELECT count(distinct sw.id) cnt FROM student_works sw
JOIN student_works_scores sws on sws.student_work_id = sw.id WHERE
reviewer_role IN(1,2) AND sw.id IN (SELECT id FROM student_works WHERE homework_common_id = #{self.id}
AND user_id IN (SELECT user_id FROM course_members WHERE role = 4 AND course_group_id
IN (SELECT course_group_id FROM teacher_course_groups WHERE id IN(#{course_group_ids.join(",")}))
)
)
}
else
%Q{
SELECT COUNT(distinct sw.id) cnt FROM student_works sw
JOIN student_works_scores sws ON sw.id = sws.student_work_id
WHERE reviewer_role IN(1,2) AND sw.homework_common_id = #{self.id}
}
end
StudentWorksScore.find_by_sql(sql).first.try(:cnt).to_i
end
# 任务未评数
def uncomment_count(user_id)
user_ids = course.teacher_group_user_ids user_id
self.student_works.where(user_id: user_ids).count - self.comment_count(user_id)
end
# 作品未提交数
def unfinished_count user_id
self.teacher_works(user_id).unfinished.count
end
# 任务按时提交数
def finished_count user_id
self.teacher_works(user_id).finished.count
end
def delay_finished_count user_id
self.teacher_works(user_id).delay_finished.count
end
# 分组作业的最大分组id
def max_group_id
self.student_works.has_committed.maximum(:group_id).to_i + 1
end
# 作业的分班设置时间
def homework_group_setting user_id
member = course.course_member(user_id)
group_setting = self.homework_group_settings.find_by_course_group_id(member.try(:course_group_id))
homework_setting = group_setting.present? ? group_setting : self
homework_setting
end
def min_group_publish_time
HomeworkGroupSetting.where("homework_common_id = #{self.id} and publish_time is not null").pluck(:publish_time).min
end
def max_group_end_time
HomeworkGroupSetting.where("homework_common_id = #{self.id} and end_time is not null").pluck(:end_time).max
end
end