From 2d8949202b266855c1a505ddd026139704e88ded Mon Sep 17 00:00:00 2001 From: liuhaoran Date: Sat, 20 Jun 2026 19:55:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=BD=93=E5=89=8Ddev=5Fhaora?= =?UTF-8?q?n=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 543 bytes .../course_homework.cpython-312.pyc | Bin 0 -> 14111 bytes .../course_homework_submit.cpython-312.pyc | Bin 0 -> 7134 bytes .../course_teaching_class.cpython-312.pyc | Bin 0 -> 16823 bytes learning_center/models/course_homework.py | 47 ++++++++++++++++++ .../models/course_homework_submit.py | 3 ++ 6 files changed, 50 insertions(+) create mode 100644 learning_center/models/__pycache__/__init__.cpython-312.pyc create mode 100644 learning_center/models/__pycache__/course_homework.cpython-312.pyc create mode 100644 learning_center/models/__pycache__/course_homework_submit.cpython-312.pyc create mode 100644 learning_center/models/__pycache__/course_teaching_class.cpython-312.pyc diff --git a/learning_center/models/__pycache__/__init__.cpython-312.pyc b/learning_center/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1f1900da224c398a2495a2064770d544b139bce GIT binary patch literal 543 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 Z`DZHsZ@R5Ix)4~}GT8EW3d@AZ{{Wly%K`uZ literal 0 HcmV?d00001 diff --git a/learning_center/models/__pycache__/course_homework_submit.cpython-312.pyc b/learning_center/models/__pycache__/course_homework_submit.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bef74ceb1be007c9e93a9f048f1f40766492ac51 GIT binary patch literal 7134 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 literal 0 HcmV?d00001 diff --git a/learning_center/models/__pycache__/course_teaching_class.cpython-312.pyc b/learning_center/models/__pycache__/course_teaching_class.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ff25bb9644f9b954896a4155a29a001aded9544 GIT binary patch literal 16823 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 0b2a587b69524dafde97f76bad27721afebdcddb # ====================== 新增:自动计算提交通道是否开启 ====================== @api.depends('state', 'deadline') @@ -82,6 +86,7 @@ class CourseHomework(models.Model): self.publish_time = fields.Datetime.now() # 1. 批量为本班学生生成空白未提交记录 self._auto_create_empty_submit() +<<<<<<< HEAD # 新增:自动生成对应作业的学生成绩明细 self._auto_create_homework_score_detail() # 2. 推送作业通知给学生 @@ -137,6 +142,39 @@ class CourseHomework(models.Model): if detail_vals_list: self.env['course.student.score.detail'].create(detail_vals_list) +======= + # 2. 推送作业通知给学生 + self._send_homework_notice_to_students() + + def _send_homework_notice_to_students(self): + """发布作业后推送消息给教学班学生""" + self.ensure_one() + if not self.teaching_class_id: + return + # 获取当前教学班所有已选课学生 + enrolls = self.env['course.teaching_class.enrollment'].search([ + ('teaching_class_id', '=', self.teaching_class_id.id), + ('state', '=', 'enrolled') + ]) + student_users = enrolls.mapped('student_id.user_id').filtered(lambda u: u) + if not student_users: + return + # 消息内容 + subject = f"新作业发布:{self.name}" + body = f""" +

课程:{self.course_id.name}

+

作业名称:{self.name}

+

截止时间:{self.deadline or '无'}

+

作业要求:{self.requirement or '无'}

+ """ + # 发送消息(关联当前作业记录,学生在消息中心可直接跳转) + self.message_post( + subject=subject, + body=body, + partner_ids=student_users.mapped('partner_id').ids, + subtype_xmlid='mail.mt_comment' + ) +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb def _auto_create_empty_submit(self): """仅发布时执行:自动给教学班所有已选课学生生成空白未提交记录""" @@ -164,12 +202,16 @@ class CourseHomework(models.Model): batch_vals.append({ 'homework_id': self.id, 'student_id': stu_id, +<<<<<<< HEAD 'course_score_item_id':self.course_score_item_id.id, +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb 'state': 'unsubmit' # 默认未提交 }) # 批量创建空白提交记录 submit_model.create(batch_vals) +<<<<<<< HEAD def _send_homework_notice_to_students(self): """发布作业后推送消息给教学班学生""" self.ensure_one() @@ -199,6 +241,8 @@ class CourseHomework(models.Model): subtype_xmlid='mail.mt_note' ) +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb # ====================== 草稿/关闭作业 ====================== def action_draft(self): self.state = 'draft' @@ -325,6 +369,7 @@ class CourseHomework(models.Model): def create(self, vals): homework_record = super().create(vals) # 草稿状态不执行自动生成提交记录,移到action_publish +<<<<<<< HEAD target_a = self.env["course.score.item"].search([ ("name", "=", "作业"), @@ -336,4 +381,6 @@ class CourseHomework(models.Model): target_a.write({ "homework_ids": [(4, homework_record.id)] }) +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb return homework_record \ No newline at end of file diff --git a/learning_center/models/course_homework_submit.py b/learning_center/models/course_homework_submit.py index a6d2ccb..589f2d6 100644 --- a/learning_center/models/course_homework_submit.py +++ b/learning_center/models/course_homework_submit.py @@ -93,7 +93,10 @@ class CourseHomeworkSubmit(models.Model): def create(self, vals): submit_rec = super().create(vals) self._check_submit_change_state(submit_rec) +<<<<<<< HEAD +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb return submit_rec def write(self, vals):