diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a60b85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.pyc diff --git a/learning_center/models/__pycache__/course_chapter.cpython-312.pyc b/learning_center/models/__pycache__/course_chapter.cpython-312.pyc deleted file mode 100644 index 6c803a3..0000000 Binary files a/learning_center/models/__pycache__/course_chapter.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/course_chapter_resource.cpython-312.pyc b/learning_center/models/__pycache__/course_chapter_resource.cpython-312.pyc deleted file mode 100644 index 1a09887..0000000 Binary files a/learning_center/models/__pycache__/course_chapter_resource.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/course_score_item.cpython-312.pyc b/learning_center/models/__pycache__/course_score_item.cpython-312.pyc deleted file mode 100644 index 26bd81a..0000000 Binary files a/learning_center/models/__pycache__/course_score_item.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/course_student_score.cpython-312.pyc b/learning_center/models/__pycache__/course_student_score.cpython-312.pyc deleted file mode 100644 index dba182a..0000000 Binary files a/learning_center/models/__pycache__/course_student_score.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/course_syllabus.cpython-312.pyc b/learning_center/models/__pycache__/course_syllabus.cpython-312.pyc deleted file mode 100644 index 25acc02..0000000 Binary files a/learning_center/models/__pycache__/course_syllabus.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/learning_course.cpython-312.pyc b/learning_center/models/__pycache__/learning_course.cpython-312.pyc deleted file mode 100644 index ddb1005..0000000 Binary files a/learning_center/models/__pycache__/learning_course.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/__pycache__/teach_class.cpython-312.pyc b/learning_center/models/__pycache__/teach_class.cpython-312.pyc deleted file mode 100644 index 9652096..0000000 Binary files a/learning_center/models/__pycache__/teach_class.cpython-312.pyc and /dev/null differ diff --git a/learning_center/models/course_homework.py b/learning_center/models/course_homework.py index d071fd8..3b0cd3b 100644 --- a/learning_center/models/course_homework.py +++ b/learning_center/models/course_homework.py @@ -14,6 +14,7 @@ class CourseHomework(models.Model): requirement = fields.Html(string='作业要求') course_id = fields.Many2one('learning.course', string='所属课程', required=True, ondelete='cascade') chapter_id = fields.Many2one('course.chapter', string='关联章节') + total_score = fields.Float(string='作业总分', default=100.0, required=True) publish_time = fields.Datetime(string='发布时间') deadline = fields.Datetime(string='提交截止时间', required=True) @@ -28,12 +29,21 @@ class CourseHomework(models.Model): total_students = fields.Integer(string='应提交人数', compute='_compute_submit_stats') submitted_count = fields.Integer(string='已提交人数', compute='_compute_submit_stats') late_count = fields.Integer(string='逾期提交人数', compute='_compute_submit_stats') + course_score_item_id=fields.Many2one('course.score.item',string='作业类型') unsubmitted_count = fields.Integer(string='未提交人数', compute='_compute_submit_stats') # 添加教学班关联 teaching_class_id = fields.Many2one('course.teaching_class', string='教学班', ondelete='cascade', domain="[('course_id', '=', course_id)]") submit_ids = fields.One2many('course.homework.submit', 'homework_id', string='提交记录') +<<<<<<< HEAD +<<<<<<< HEAD + score_item_ids = fields.One2many('course.score.item', 'homework_id', string='成绩项目') +======= score_item_ids = fields.One2many('course.score.item', 'homework_id', string='成绩项') +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= + score_item_ids = fields.One2many('course.score.item', 'homework_id', string='成绩项') +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb # ====================== 新增:自动计算提交通道是否开启 ====================== @api.depends('state', 'deadline') @@ -80,9 +90,72 @@ class CourseHomework(models.Model): self.publish_time = fields.Datetime.now() # 1. 批量为本班学生生成空白未提交记录 self._auto_create_empty_submit() +<<<<<<< HEAD +<<<<<<< HEAD + # 新增:自动生成对应作业的学生成绩明细 + self._auto_create_homework_score_detail() # 2. 推送作业通知给学生 self._send_homework_notice_to_students() + def _auto_create_homework_score_detail(self): + self.ensure_one() + # 修正字段名 course_score_item_id + if not self.teaching_class_id or not self.course_score_item_id: + return + score_item = self.course_score_item_id + + # 获取教学班在册学生 + enroll_records = self.env['course.teaching_class.enrollment'].search([ + ('teaching_class_id', '=', self.teaching_class_id.id), + ('state', '=', 'enrolled') + ]) + student_ids = enroll_records.mapped('student_id').ids + if not student_ids: + return + + # 查询当前作业+当前分项已存在明细 + exist_details = self.env['course.student.score.detail'].search([ + ('course_id', '=', self.course_id.id), + ('score_item_id', '=', score_item.id), + ('homework_id', '=', self.id), + ('student_id', 'in', student_ids) + ]) + exist_student_ids = exist_details.mapped('student_id').ids + target_student_ids = [sid for sid in student_ids if sid not in exist_student_ids] + if not target_student_ids: + return + + # 批量查询学生总成绩,避免循环查库 + all_student_scores = self.env['course.student.score'].search([ + ('course_id', '=', self.course_id.id), + ('student_id', 'in', target_student_ids) + ]) + score_map = {rec.student_id.id: rec for rec in all_student_scores} + + detail_vals_list = [] + for stu_id in target_student_ids: + student_score = score_map.get(stu_id) + if not student_score: + continue + detail_vals_list.append({ + 'student_score_id': student_score.id, + 'homework_id': self.id, + 'score_item_id': score_item.id, + 'score': 0.0, + 'remark': f'{self.course_score_item_id.name}:{self.name}' + }) + + if detail_vals_list: + self.env['course.student.score.detail'].create(detail_vals_list) +======= + # 2. 推送作业通知给学生 + self._send_homework_notice_to_students() + +======= + # 2. 推送作业通知给学生 + self._send_homework_notice_to_students() + +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb def _send_homework_notice_to_students(self): """发布作业后推送消息给教学班学生""" self.ensure_one() @@ -111,6 +184,10 @@ class CourseHomework(models.Model): partner_ids=student_users.mapped('partner_id').ids, subtype_xmlid='mail.mt_comment' ) +<<<<<<< HEAD +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb def _auto_create_empty_submit(self): """仅发布时执行:自动给教学班所有已选课学生生成空白未提交记录""" @@ -138,11 +215,53 @@ class CourseHomework(models.Model): batch_vals.append({ 'homework_id': self.id, 'student_id': stu_id, +<<<<<<< HEAD +<<<<<<< HEAD + 'course_score_item_id':self.course_score_item_id.id, +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb 'state': 'unsubmit' # 默认未提交 }) # 批量创建空白提交记录 submit_model.create(batch_vals) +<<<<<<< HEAD +<<<<<<< HEAD + 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_note' + ) + +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb # ====================== 草稿/关闭作业 ====================== def action_draft(self): self.state = 'draft' @@ -269,4 +388,21 @@ class CourseHomework(models.Model): def create(self, vals): homework_record = super().create(vals) # 草稿状态不执行自动生成提交记录,移到action_publish +<<<<<<< HEAD +<<<<<<< HEAD + + target_a = self.env["course.score.item"].search([ + ("name", "=", "作业"), + ("create_uid", "=", self.env.uid) + ], limit=1) + + if target_a: + # 将刚新建的B追加到A的多对多字段 + target_a.write({ + "homework_ids": [(4, homework_record.id)] + }) +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= +>>>>>>> 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 37a89a3..9cdc495 100644 --- a/learning_center/models/course_homework_submit.py +++ b/learning_center/models/course_homework_submit.py @@ -28,6 +28,7 @@ class CourseHomeworkSubmit(models.Model): student_no = fields.Char(related="student_id.stu_num", string="学号", readonly=True) student_class_id = fields.Many2one(related="student_id.class_id", string="班级", readonly=True) student_major_id = fields.Many2one(related="student_id.major_id", string="专业", readonly=True) + course_score_item_id = fields.Many2one('course.score.item', string='作业类型') student_phone = fields.Char(related="student_id.stu_phone", string="手机号", readonly=True) submit_file = fields.Binary(string='提交文件', attachment=True) submit_filename = fields.Char(string='文件名') @@ -92,6 +93,13 @@ class CourseHomeworkSubmit(models.Model): def create(self, vals): submit_rec = super().create(vals) self._check_submit_change_state(submit_rec) +<<<<<<< HEAD +<<<<<<< HEAD + +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb +======= +>>>>>>> 0b2a587b69524dafde97f76bad27721afebdcddb return submit_rec def write(self, vals): diff --git a/learning_center/models/course_score_item.py b/learning_center/models/course_score_item.py index d04617c..c5982ec 100644 --- a/learning_center/models/course_score_item.py +++ b/learning_center/models/course_score_item.py @@ -15,7 +15,7 @@ class CourseScoreItem(models.Model): course_code = fields.Char(related="course_id.code", string="课程代码", readonly=True) course_credit = fields.Float(related="course_id.credit", string="学分", readonly=True) course_exam_type = fields.Selection(related="course_id.exam_type", string="考核方式", readonly=True) - homework_id = fields.Many2one('course.homework', string='作业', required=True, ondelete='cascade') + homework_id = fields.Many2one('course.homework', string='作业', ondelete='cascade') sequence = fields.Integer(string="排序", default=10) score_type = fields.Selection([ ('homework', '作业'), @@ -30,7 +30,7 @@ class CourseScoreItem(models.Model): full_score = fields.Float(string='满分', default=100.0) is_active = fields.Boolean(string='是否启用', default=True) homework_ids = fields.Many2many('course.homework', string='关联作业') - + course_student_score=fields.Many2one('course.student.score',string='学生成绩') # 统计字段 student_count = fields.Integer(string='学生人数', compute='_compute_stats') avg_score = fields.Float(string='平均分', compute='_compute_stats') diff --git a/learning_center/models/course_student_score.py b/learning_center/models/course_student_score.py index e01ba2e..3e8157d 100644 --- a/learning_center/models/course_student_score.py +++ b/learning_center/models/course_student_score.py @@ -24,15 +24,16 @@ class CourseStudentScore(models.Model): student_class_id = fields.Many2one( string="班级", related="student_id.class_id", readonly=True) student_major_id = fields.Many2one( string="专业", related="student_id.major_id", readonly=True) stu_name=fields.Char(related='student_id.stu_name',required=True, ondelete='cascade',string='学生姓名') + score_item_ids=fields.One2many('course.score.item','course_student_score',string='成绩类型') score_ids = fields.One2many('course.student.score.detail', 'student_score_id', string='成绩明细') teaching_class_id=fields.Many2one('course.teaching_class',string='教学班') # 教学班相关只读关联字段 teaching_class_name = fields.Char(string="教学班名称", related="teaching_class_id.display_name", readonly=True) teaching_class_semester = fields.Selection(string="学期", related="teaching_class_id.semester", readonly=True) teaching_class_main_teacher = fields.Many2one('hr.employee', string="主讲教师", - related="teaching_class_id.main_teacher_id", readonly=True) + related="teaching_class_id.main_teacher_id", readonly=True) total_score = fields.Float(string='综合成绩', compute='_compute_total_score', store=True) - + course_score_item_id = fields.Many2one('course.score.item', string='成绩分项') grade_level = fields.Selection([ ('A', '优秀(A)'), ('B', '良好(B)'), @@ -77,8 +78,8 @@ class CourseStudentScoreDetail(models.Model): student_score_id = fields.Many2one('course.student.score', string='学生成绩', required=True, ondelete='cascade') student_score_displayname=fields.Char(related='student_score_id.display_name',required=True, ondelete='cascade',string='显示名称') # 关联成绩项目 - score_item_id = fields.Many2one('course.score.item', string='成绩项目', required=True, ondelete='restrict') - + score_item_id = fields.Many2one('course.score.item', string='成绩项目', ondelete='restrict') + homework_id=fields.Many2one('course.homework',string='作业') # 得分 score = fields.Float(string='得分', help='该项目实际得分') diff --git a/learning_center/models/course_teaching_class.py b/learning_center/models/course_teaching_class.py index 7c249cc..c522eda 100644 --- a/learning_center/models/course_teaching_class.py +++ b/learning_center/models/course_teaching_class.py @@ -215,12 +215,32 @@ class CourseTeachingClassEnrollment(models.Model): @api.model def create(self, vals): - """新增选课记录校验人数上限""" + """新增选课记录校验人数上限 + 自动生成学生总成绩记录""" res = super().create(vals) cls = res.teaching_class_id + student = res.student_id + course = cls.course_id + + # 1. 人数上限校验原有逻辑保留 valid_num = len(cls.enrollment_ids.filtered(lambda e: e.state == 'enrolled')) if cls.max_students and valid_num > cls.max_students: raise ValidationError("该教学班人数已达上限,无法继续添加学生!") + + # 2. 查找是否已经存在该学生+该课程+该教学班的成绩主记录,避免重复创建 + exist_score = self.env['course.student.score'].search([ + ('student_id', '=', student.id), + ('course_id', '=', course.id), + ('teaching_class_id', '=', cls.id) + ], limit=1) + + # 不存在则自动创建一条空成绩主记录 + if not exist_score: + self.env['course.student.score'].create({ + 'course_id': course.id, + 'student_id': student.id, + 'teaching_class_id': cls.id + }) + return res diff --git a/learning_center/views/view_course_homework.xml b/learning_center/views/view_course_homework.xml index 28cf3db..536c112 100644 --- a/learning_center/views/view_course_homework.xml +++ b/learning_center/views/view_course_homework.xml @@ -6,7 +6,7 @@