import logging from odoo import http from odoo.http import request from odoo.addons.encoach_api.controllers.base import ( jwt_required, _json_response, _error_response, _get_json_body, _paginate, ) _logger = logging.getLogger(__name__) class ActivitiesController(http.Controller): @http.route('/api/activities', type='http', auth='public', methods=['GET'], csrf=False) @jwt_required def list_activities(self, **kw): try: M = request.env['op.activity'].sudo() offset, limit, page = _paginate(kw) total = M.search_count([]) recs = M.search([], offset=offset, limit=limit, order='id desc') items = [{ 'id': r.id, 'student_id': r.student_id.id if r.student_id else 0, 'student_name': r.student_id.partner_id.name if r.student_id and r.student_id.partner_id else '', 'type_id': r.type_id.id if r.type_id else 0, 'type_name': r.type_id.name if r.type_id else '', 'date': str(r.date) if hasattr(r, 'date') and r.date else '', 'description': getattr(r, 'description', '') or '', } for r in recs] return _json_response({'items': items, 'data': items, 'total': total, 'page': page, 'size': limit}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/activities', type='http', auth='public', methods=['POST'], csrf=False) @jwt_required def create_activity(self, **kw): try: body = _get_json_body() vals = {} if body.get('student_id'): vals['student_id'] = int(body['student_id']) if body.get('type_id'): vals['type_id'] = int(body['type_id']) if body.get('date'): vals['date'] = body['date'] if body.get('description'): vals['description'] = body['description'] rec = request.env['op.activity'].sudo().create(vals) return _json_response({'id': rec.id}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/activities/', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False) @jwt_required def update_activity(self, aid, **kw): try: rec = request.env['op.activity'].sudo().browse(aid) if not rec.exists(): return _error_response('Not found', 404) body = _get_json_body() vals = {} if 'description' in body: vals['description'] = body['description'] if 'date' in body: vals['date'] = body['date'] if vals: rec.write(vals) return _json_response({'id': rec.id}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/activities/', type='http', auth='public', methods=['DELETE'], csrf=False) @jwt_required def delete_activity(self, aid, **kw): try: rec = request.env['op.activity'].sudo().browse(aid) if rec.exists(): rec.unlink() return _json_response({'success': True}) except Exception as e: return _error_response(str(e), 500) # ── Activity Types ─────────────────────────────────────────────── @http.route('/api/activity-types', type='http', auth='public', methods=['GET'], csrf=False) @jwt_required def list_types(self, **kw): try: M = request.env['op.activity.type'].sudo() offset, limit, page = _paginate(kw) total = M.search_count([]) recs = M.search([], offset=offset, limit=limit, order='id desc') items = [{'id': r.id, 'name': r.name or ''} for r in recs] return _json_response({'items': items, 'data': items, 'total': total, 'page': page, 'size': limit}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/activity-types', type='http', auth='public', methods=['POST'], csrf=False) @jwt_required def create_type(self, **kw): try: body = _get_json_body() rec = request.env['op.activity.type'].sudo().create({'name': body.get('name', '')}) return _json_response({'id': rec.id, 'name': rec.name}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/activity-types/', type='http', auth='public', methods=['DELETE'], csrf=False) @jwt_required def delete_type(self, tid, **kw): try: rec = request.env['op.activity.type'].sudo().browse(tid) if rec.exists(): rec.unlink() return _json_response({'success': True}) except Exception as e: return _error_response(str(e), 500)