From fa538a1f12535a31002a650532d120fa3e6d9a54 Mon Sep 17 00:00:00 2001 From: Talal Sharabi Date: Sun, 15 Mar 2026 01:12:17 +0400 Subject: [PATCH] Fix remaining controller serialization and model mismatches - Replace all _serialize_group/exam/assignment/stat/session calls with _serialize - Fix sessions controller to use exam_data JSON field instead of nonexistent columns - Fix stats controller to use correct model fields (score_correct/total/missing, solutions) Made-with: Cursor --- encoach_api/controllers/assignments.py | 14 ++++++------- encoach_api/controllers/classrooms.py | 6 +++--- encoach_api/controllers/exams.py | 8 ++++---- encoach_api/controllers/sessions.py | 26 ++++++++---------------- encoach_api/controllers/stats.py | 28 ++++++++++++++++++-------- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/encoach_api/controllers/assignments.py b/encoach_api/controllers/assignments.py index 38659af..f4e9fc2 100644 --- a/encoach_api/controllers/assignments.py +++ b/encoach_api/controllers/assignments.py @@ -47,7 +47,7 @@ class AssignmentsController(EncoachMixin, http.Controller): records = Assignment.search(domain, offset=offset, limit=limit, order='create_date desc') return self._json_response({ - 'assignments': [self._serialize_assignment(a) for a in records], + 'assignments': [self._serialize(a) for a in records], 'total': total, 'page': page, 'limit': limit, @@ -84,7 +84,7 @@ class AssignmentsController(EncoachMixin, http.Controller): vals['duration'] = int(body['duration']) assignment = request.env['encoach.assignment'].sudo().with_user(user).create(vals) - return self._json_response(self._serialize_assignment(assignment), status=201) + return self._json_response(self._serialize(assignment), status=201) except Exception: _logger.exception("Create assignment error") return self._error_response('Internal server error', 500) @@ -124,7 +124,7 @@ class AssignmentsController(EncoachMixin, http.Controller): if vals: assignment.write(vals) - return self._json_response(self._serialize_assignment(assignment)) + return self._json_response(self._serialize(assignment)) except Exception: _logger.exception("Update assignment error") return self._error_response('Internal server error', 500) @@ -166,7 +166,7 @@ class AssignmentsController(EncoachMixin, http.Controller): return self._error_response('Assignment not found', 404) assignment.action_start() - return self._json_response(self._serialize_assignment(assignment)) + return self._json_response(self._serialize(assignment)) except Exception as exc: _logger.exception("Start assignment error") return self._error_response(str(exc) if str(exc) != '' else 'Internal server error', 500) @@ -187,7 +187,7 @@ class AssignmentsController(EncoachMixin, http.Controller): return self._error_response('Assignment not found', 404) assignment.action_release() - return self._json_response(self._serialize_assignment(assignment)) + return self._json_response(self._serialize(assignment)) except Exception as exc: _logger.exception("Release assignment error") return self._error_response(str(exc) if str(exc) != '' else 'Internal server error', 500) @@ -208,7 +208,7 @@ class AssignmentsController(EncoachMixin, http.Controller): return self._error_response('Assignment not found', 404) assignment.write({'is_archived': True}) - return self._json_response(self._serialize_assignment(assignment)) + return self._json_response(self._serialize(assignment)) except Exception: _logger.exception("Archive assignment error") return self._error_response('Internal server error', 500) @@ -229,7 +229,7 @@ class AssignmentsController(EncoachMixin, http.Controller): return self._error_response('Assignment not found', 404) assignment.write({'is_archived': False}) - return self._json_response(self._serialize_assignment(assignment)) + return self._json_response(self._serialize(assignment)) except Exception: _logger.exception("Unarchive assignment error") return self._error_response('Internal server error', 500) diff --git a/encoach_api/controllers/classrooms.py b/encoach_api/controllers/classrooms.py index 903472f..7d63c6b 100644 --- a/encoach_api/controllers/classrooms.py +++ b/encoach_api/controllers/classrooms.py @@ -32,7 +32,7 @@ class ClassroomsController(EncoachMixin, http.Controller): domain.append(('entity_id', '=', int(entity_id))) groups = request.env['encoach.group'].sudo().search(domain, order='name asc') - return self._json_response([self._serialize_group(g) for g in groups]) + return self._json_response([self._serialize(g) for g in groups]) except Exception: _logger.exception("List groups error") return self._error_response('Internal server error', 500) @@ -61,7 +61,7 @@ class ClassroomsController(EncoachMixin, http.Controller): vals['participant_ids'] = [(4, int(pid)) for pid in participant_ids] group = request.env['encoach.group'].sudo().create(vals) - return self._json_response(self._serialize_group(group), status=201) + return self._json_response(self._serialize(group), status=201) except Exception: _logger.exception("Create group error") return self._error_response('Internal server error', 500) @@ -95,7 +95,7 @@ class ClassroomsController(EncoachMixin, http.Controller): if vals: group.write(vals) - return self._json_response(self._serialize_group(group)) + return self._json_response(self._serialize(group)) except Exception: _logger.exception("Update group error") return self._error_response('Internal server error', 500) diff --git a/encoach_api/controllers/exams.py b/encoach_api/controllers/exams.py index f61e793..4dcc75b 100644 --- a/encoach_api/controllers/exams.py +++ b/encoach_api/controllers/exams.py @@ -44,7 +44,7 @@ class ExamsController(EncoachMixin, http.Controller): exams = Exam.search(domain, offset=offset, limit=limit, order='create_date desc') return self._json_response({ - 'exams': [self._serialize_exam(e) for e in exams], + 'exams': [self._serialize(e) for e in exams], 'total': total, 'page': page, 'limit': limit, @@ -84,7 +84,7 @@ class ExamsController(EncoachMixin, http.Controller): vals['entity_id'] = int(body['entityID']) exam = request.env['encoach.exam'].sudo().with_user(user).create(vals) - return self._json_response(self._serialize_exam(exam), status=201) + return self._json_response(self._serialize(exam), status=201) except Exception: _logger.exception("Create exam error") return self._error_response('Internal server error', 500) @@ -104,7 +104,7 @@ class ExamsController(EncoachMixin, http.Controller): if not exam.exists(): return self._error_response('Exam not found', 404) - return self._json_response(self._serialize_exam(exam)) + return self._json_response(self._serialize(exam)) except Exception: _logger.exception("Get exam error") return self._error_response('Internal server error', 500) @@ -140,7 +140,7 @@ class ExamsController(EncoachMixin, http.Controller): if vals: exam.write(vals) - return self._json_response(self._serialize_exam(exam)) + return self._json_response(self._serialize(exam)) except Exception: _logger.exception("Update exam error") return self._error_response('Internal server error', 500) diff --git a/encoach_api/controllers/sessions.py b/encoach_api/controllers/sessions.py index c12cd8f..1551b6c 100644 --- a/encoach_api/controllers/sessions.py +++ b/encoach_api/controllers/sessions.py @@ -24,29 +24,19 @@ class SessionsController(EncoachMixin, http.Controller): session_id = body.get('_id') or body.get('id') Session = request.env['encoach.session'].sudo() - vals = {} - if body.get('examId'): - vals['exam_id'] = int(body['examId']) - if body.get('module'): - vals['module'] = body['module'] - if body.get('answers') is not None: - vals['answers'] = json.dumps(body['answers']) if isinstance(body['answers'], dict) else body['answers'] - if body.get('startedAt'): - vals['started_at'] = body['startedAt'] - if body.get('completedAt'): - vals['completed_at'] = body['completedAt'] - if body.get('assignmentId'): - vals['assignment_id'] = int(body['assignmentId']) + exam_data = {k: v for k, v in body.items() if k not in ('_id', 'id')} if session_id: record = Session.browse(int(session_id)) if record.exists(): - record.write(vals) - return self._json_response(self._serialize_session(record)) + record.write({'exam_data': exam_data}) + return self._json_response(self._serialize(record)) - vals['user_id'] = user.id - record = Session.create(vals) - return self._json_response(self._serialize_session(record), status=201) + record = Session.create({ + 'user_id': user.id, + 'exam_data': exam_data, + }) + return self._json_response(self._serialize(record), status=201) except Exception: _logger.exception("Save session error") return self._error_response('Internal server error', 500) diff --git a/encoach_api/controllers/stats.py b/encoach_api/controllers/stats.py index 0bd58a2..23c847c 100644 --- a/encoach_api/controllers/stats.py +++ b/encoach_api/controllers/stats.py @@ -28,24 +28,36 @@ class StatsController(EncoachMixin, http.Controller): vals['session_id'] = int(body['sessionId']) if body.get('module'): vals['module'] = body['module'] - if 'score' in body: - vals['score'] = body['score'] - if body.get('result') is not None: - vals['result'] = json.dumps(body['result']) if isinstance(body['result'], dict) else body['result'] + if body.get('solutions') is not None: + vals['solutions'] = body['solutions'] if isinstance(body['solutions'], (dict, list)) else json.loads(body['solutions']) + if body.get('exercise'): + vals['exercise'] = body['exercise'] + if 'scoreCorrect' in body: + vals['score_correct'] = int(body['scoreCorrect']) + if 'scoreTotal' in body: + vals['score_total'] = int(body['scoreTotal']) + if 'scoreMissing' in body: + vals['score_missing'] = int(body['scoreMissing']) if body.get('examId'): vals['exam_id'] = int(body['examId']) if body.get('assignmentId'): vals['assignment_id'] = int(body['assignmentId']) + if body.get('type'): + vals['stat_type'] = body['type'] + if 'timeSpent' in body: + vals['time_spent'] = int(body['timeSpent']) + if 'isPractice' in body: + vals['is_practice'] = bool(body['isPractice']) if stat_id: record = Stat.browse(int(stat_id)) if record.exists(): record.write(vals) - return self._json_response(self._serialize_stat(record)) + return self._json_response(self._serialize(record)) vals['user_id'] = user.id record = Stat.create(vals) - return self._json_response(self._serialize_stat(record), status=201) + return self._json_response(self._serialize(record), status=201) except Exception: _logger.exception("Save stats error") return self._error_response('Internal server error', 500) @@ -65,7 +77,7 @@ class StatsController(EncoachMixin, http.Controller): if not stat.exists(): return self._error_response('Stat not found', 404) - return self._json_response(self._serialize_stat(stat)) + return self._json_response(self._serialize(stat)) except Exception: _logger.exception("Get stat error") return self._error_response('Internal server error', 500) @@ -130,7 +142,7 @@ class StatsController(EncoachMixin, http.Controller): 'total': total, 'averageScore': round(avg_score, 2), 'moduleBreakdown': module_breakdown, - 'stats': [self._serialize_stat(s) for s in stats[:100]], + 'stats': [self._serialize(s) for s in stats[:100]], }) except Exception: _logger.exception("Statistical query error")