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
This commit is contained in:
@@ -47,7 +47,7 @@ class AssignmentsController(EncoachMixin, http.Controller):
|
|||||||
records = Assignment.search(domain, offset=offset, limit=limit, order='create_date desc')
|
records = Assignment.search(domain, offset=offset, limit=limit, order='create_date desc')
|
||||||
|
|
||||||
return self._json_response({
|
return self._json_response({
|
||||||
'assignments': [self._serialize_assignment(a) for a in records],
|
'assignments': [self._serialize(a) for a in records],
|
||||||
'total': total,
|
'total': total,
|
||||||
'page': page,
|
'page': page,
|
||||||
'limit': limit,
|
'limit': limit,
|
||||||
@@ -84,7 +84,7 @@ class AssignmentsController(EncoachMixin, http.Controller):
|
|||||||
vals['duration'] = int(body['duration'])
|
vals['duration'] = int(body['duration'])
|
||||||
|
|
||||||
assignment = request.env['encoach.assignment'].sudo().with_user(user).create(vals)
|
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:
|
except Exception:
|
||||||
_logger.exception("Create assignment error")
|
_logger.exception("Create assignment error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -124,7 +124,7 @@ class AssignmentsController(EncoachMixin, http.Controller):
|
|||||||
if vals:
|
if vals:
|
||||||
assignment.write(vals)
|
assignment.write(vals)
|
||||||
|
|
||||||
return self._json_response(self._serialize_assignment(assignment))
|
return self._json_response(self._serialize(assignment))
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Update assignment error")
|
_logger.exception("Update assignment error")
|
||||||
return self._error_response('Internal server error', 500)
|
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)
|
return self._error_response('Assignment not found', 404)
|
||||||
|
|
||||||
assignment.action_start()
|
assignment.action_start()
|
||||||
return self._json_response(self._serialize_assignment(assignment))
|
return self._json_response(self._serialize(assignment))
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
_logger.exception("Start assignment error")
|
_logger.exception("Start assignment error")
|
||||||
return self._error_response(str(exc) if str(exc) != '' else 'Internal server error', 500)
|
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)
|
return self._error_response('Assignment not found', 404)
|
||||||
|
|
||||||
assignment.action_release()
|
assignment.action_release()
|
||||||
return self._json_response(self._serialize_assignment(assignment))
|
return self._json_response(self._serialize(assignment))
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
_logger.exception("Release assignment error")
|
_logger.exception("Release assignment error")
|
||||||
return self._error_response(str(exc) if str(exc) != '' else 'Internal server error', 500)
|
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)
|
return self._error_response('Assignment not found', 404)
|
||||||
|
|
||||||
assignment.write({'is_archived': True})
|
assignment.write({'is_archived': True})
|
||||||
return self._json_response(self._serialize_assignment(assignment))
|
return self._json_response(self._serialize(assignment))
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Archive assignment error")
|
_logger.exception("Archive assignment error")
|
||||||
return self._error_response('Internal server error', 500)
|
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)
|
return self._error_response('Assignment not found', 404)
|
||||||
|
|
||||||
assignment.write({'is_archived': False})
|
assignment.write({'is_archived': False})
|
||||||
return self._json_response(self._serialize_assignment(assignment))
|
return self._json_response(self._serialize(assignment))
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Unarchive assignment error")
|
_logger.exception("Unarchive assignment error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class ClassroomsController(EncoachMixin, http.Controller):
|
|||||||
domain.append(('entity_id', '=', int(entity_id)))
|
domain.append(('entity_id', '=', int(entity_id)))
|
||||||
|
|
||||||
groups = request.env['encoach.group'].sudo().search(domain, order='name asc')
|
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:
|
except Exception:
|
||||||
_logger.exception("List groups error")
|
_logger.exception("List groups error")
|
||||||
return self._error_response('Internal server error', 500)
|
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]
|
vals['participant_ids'] = [(4, int(pid)) for pid in participant_ids]
|
||||||
|
|
||||||
group = request.env['encoach.group'].sudo().create(vals)
|
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:
|
except Exception:
|
||||||
_logger.exception("Create group error")
|
_logger.exception("Create group error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -95,7 +95,7 @@ class ClassroomsController(EncoachMixin, http.Controller):
|
|||||||
if vals:
|
if vals:
|
||||||
group.write(vals)
|
group.write(vals)
|
||||||
|
|
||||||
return self._json_response(self._serialize_group(group))
|
return self._json_response(self._serialize(group))
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Update group error")
|
_logger.exception("Update group error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class ExamsController(EncoachMixin, http.Controller):
|
|||||||
exams = Exam.search(domain, offset=offset, limit=limit, order='create_date desc')
|
exams = Exam.search(domain, offset=offset, limit=limit, order='create_date desc')
|
||||||
|
|
||||||
return self._json_response({
|
return self._json_response({
|
||||||
'exams': [self._serialize_exam(e) for e in exams],
|
'exams': [self._serialize(e) for e in exams],
|
||||||
'total': total,
|
'total': total,
|
||||||
'page': page,
|
'page': page,
|
||||||
'limit': limit,
|
'limit': limit,
|
||||||
@@ -84,7 +84,7 @@ class ExamsController(EncoachMixin, http.Controller):
|
|||||||
vals['entity_id'] = int(body['entityID'])
|
vals['entity_id'] = int(body['entityID'])
|
||||||
|
|
||||||
exam = request.env['encoach.exam'].sudo().with_user(user).create(vals)
|
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:
|
except Exception:
|
||||||
_logger.exception("Create exam error")
|
_logger.exception("Create exam error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -104,7 +104,7 @@ class ExamsController(EncoachMixin, http.Controller):
|
|||||||
if not exam.exists():
|
if not exam.exists():
|
||||||
return self._error_response('Exam not found', 404)
|
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:
|
except Exception:
|
||||||
_logger.exception("Get exam error")
|
_logger.exception("Get exam error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -140,7 +140,7 @@ class ExamsController(EncoachMixin, http.Controller):
|
|||||||
if vals:
|
if vals:
|
||||||
exam.write(vals)
|
exam.write(vals)
|
||||||
|
|
||||||
return self._json_response(self._serialize_exam(exam))
|
return self._json_response(self._serialize(exam))
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Update exam error")
|
_logger.exception("Update exam error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
|
|||||||
@@ -24,29 +24,19 @@ class SessionsController(EncoachMixin, http.Controller):
|
|||||||
session_id = body.get('_id') or body.get('id')
|
session_id = body.get('_id') or body.get('id')
|
||||||
Session = request.env['encoach.session'].sudo()
|
Session = request.env['encoach.session'].sudo()
|
||||||
|
|
||||||
vals = {}
|
exam_data = {k: v for k, v in body.items() if k not in ('_id', 'id')}
|
||||||
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'])
|
|
||||||
|
|
||||||
if session_id:
|
if session_id:
|
||||||
record = Session.browse(int(session_id))
|
record = Session.browse(int(session_id))
|
||||||
if record.exists():
|
if record.exists():
|
||||||
record.write(vals)
|
record.write({'exam_data': exam_data})
|
||||||
return self._json_response(self._serialize_session(record))
|
return self._json_response(self._serialize(record))
|
||||||
|
|
||||||
vals['user_id'] = user.id
|
record = Session.create({
|
||||||
record = Session.create(vals)
|
'user_id': user.id,
|
||||||
return self._json_response(self._serialize_session(record), status=201)
|
'exam_data': exam_data,
|
||||||
|
})
|
||||||
|
return self._json_response(self._serialize(record), status=201)
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Save session error")
|
_logger.exception("Save session error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
|
|||||||
@@ -28,24 +28,36 @@ class StatsController(EncoachMixin, http.Controller):
|
|||||||
vals['session_id'] = int(body['sessionId'])
|
vals['session_id'] = int(body['sessionId'])
|
||||||
if body.get('module'):
|
if body.get('module'):
|
||||||
vals['module'] = body['module']
|
vals['module'] = body['module']
|
||||||
if 'score' in body:
|
if body.get('solutions') is not None:
|
||||||
vals['score'] = body['score']
|
vals['solutions'] = body['solutions'] if isinstance(body['solutions'], (dict, list)) else json.loads(body['solutions'])
|
||||||
if body.get('result') is not None:
|
if body.get('exercise'):
|
||||||
vals['result'] = json.dumps(body['result']) if isinstance(body['result'], dict) else body['result']
|
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'):
|
if body.get('examId'):
|
||||||
vals['exam_id'] = int(body['examId'])
|
vals['exam_id'] = int(body['examId'])
|
||||||
if body.get('assignmentId'):
|
if body.get('assignmentId'):
|
||||||
vals['assignment_id'] = int(body['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:
|
if stat_id:
|
||||||
record = Stat.browse(int(stat_id))
|
record = Stat.browse(int(stat_id))
|
||||||
if record.exists():
|
if record.exists():
|
||||||
record.write(vals)
|
record.write(vals)
|
||||||
return self._json_response(self._serialize_stat(record))
|
return self._json_response(self._serialize(record))
|
||||||
|
|
||||||
vals['user_id'] = user.id
|
vals['user_id'] = user.id
|
||||||
record = Stat.create(vals)
|
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:
|
except Exception:
|
||||||
_logger.exception("Save stats error")
|
_logger.exception("Save stats error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -65,7 +77,7 @@ class StatsController(EncoachMixin, http.Controller):
|
|||||||
if not stat.exists():
|
if not stat.exists():
|
||||||
return self._error_response('Stat not found', 404)
|
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:
|
except Exception:
|
||||||
_logger.exception("Get stat error")
|
_logger.exception("Get stat error")
|
||||||
return self._error_response('Internal server error', 500)
|
return self._error_response('Internal server error', 500)
|
||||||
@@ -130,7 +142,7 @@ class StatsController(EncoachMixin, http.Controller):
|
|||||||
'total': total,
|
'total': total,
|
||||||
'averageScore': round(avg_score, 2),
|
'averageScore': round(avg_score, 2),
|
||||||
'moduleBreakdown': module_breakdown,
|
'moduleBreakdown': module_breakdown,
|
||||||
'stats': [self._serialize_stat(s) for s in stats[:100]],
|
'stats': [self._serialize(s) for s in stats[:100]],
|
||||||
})
|
})
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.exception("Statistical query error")
|
_logger.exception("Statistical query error")
|
||||||
|
|||||||
Reference in New Issue
Block a user