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

253 lines
9.6 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.

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 :published_settings, -> { group_published }, class_name: "HomeworkGroupSetting"
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.published_settings.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