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 FacilitiesController(http.Controller): @http.route('/api/facilities', type='http', auth='public', methods=['GET'], csrf=False) @jwt_required def list_facilities(self, **kw): try: M = request.env['op.facility'].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 '', 'code': getattr(r, 'code', '') 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/facilities', type='http', auth='public', methods=['POST'], csrf=False) @jwt_required def create_facility(self, **kw): try: body = _get_json_body() vals = {'name': body.get('name', '')} if body.get('code'): vals['code'] = body['code'] rec = request.env['op.facility'].sudo().create(vals) return _json_response({'id': rec.id, 'name': rec.name, 'code': getattr(rec, 'code', '')}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/facilities/', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False) @jwt_required def update_facility(self, fid, **kw): try: rec = request.env['op.facility'].sudo().browse(fid) if not rec.exists(): return _error_response('Not found', 404) body = _get_json_body() vals = {} if 'name' in body: vals['name'] = body['name'] if 'code' in body: vals['code'] = body['code'] if vals: rec.write(vals) return _json_response({'id': rec.id, 'name': rec.name}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/facilities/', type='http', auth='public', methods=['DELETE'], csrf=False) @jwt_required def delete_facility(self, fid, **kw): try: rec = request.env['op.facility'].sudo().browse(fid) if rec.exists(): rec.unlink() return _json_response({'success': True}) except Exception as e: return _error_response(str(e), 500) # ── Assets ─────────────────────────────────────────────────────── # Assets are tracked via encoach.asset (lightweight custom model since # OpenEduCat has no dedicated asset model in this build). def _asset_model(self): return request.env['encoach.asset'].sudo() @http.route('/api/assets', type='http', auth='public', methods=['GET'], csrf=False) @jwt_required def list_assets(self, **kw): try: M = self._asset_model() offset, limit, page = _paginate(kw) domain = [] if kw.get('facility_id'): try: domain.append(('facility_id', '=', int(kw['facility_id']))) except Exception: pass total = M.search_count(domain) recs = M.search(domain, offset=offset, limit=limit, order='id desc') items = [{ 'id': r.id, 'name': r.name or '', 'code': r.code or '', 'facility_id': r.facility_id.id if r.facility_id else 0, 'facility_name': r.facility_id.name if r.facility_id else '', 'description': r.description or '', } for r in recs] return _json_response({'items': items, 'data': items, 'total': total, 'page': page, 'size': limit}) except Exception as e: _logger.exception('list_assets') return _error_response(str(e), 500) @http.route('/api/assets', type='http', auth='public', methods=['POST'], csrf=False) @jwt_required def create_asset(self, **kw): try: body = _get_json_body() name = (body.get('name') or '').strip() if not name: return _error_response('Name is required', 400) vals = {'name': name} if body.get('code'): vals['code'] = body['code'] if body.get('facility_id'): vals['facility_id'] = int(body['facility_id']) if body.get('description'): vals['description'] = body['description'] rec = self._asset_model().create(vals) return _json_response({ 'id': rec.id, 'name': rec.name, 'code': rec.code or '', 'facility_id': rec.facility_id.id if rec.facility_id else 0, }) except Exception as e: _logger.exception('create_asset') return _error_response(str(e), 500) @http.route('/api/assets/', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False) @jwt_required def update_asset(self, aid, **kw): try: rec = self._asset_model().browse(aid) if not rec.exists(): return _error_response('Not found', 404) body = _get_json_body() vals = {} for k in ('name', 'code', 'description'): if k in body: vals[k] = body[k] if 'facility_id' in body: vals['facility_id'] = int(body['facility_id']) if body['facility_id'] else False if vals: rec.write(vals) return _json_response({'id': rec.id, 'name': rec.name}) except Exception as e: return _error_response(str(e), 500) @http.route('/api/assets/', type='http', auth='public', methods=['DELETE'], csrf=False) @jwt_required def delete_asset(self, aid, **kw): try: rec = self._asset_model().browse(aid) if rec.exists(): rec.unlink() return _json_response({'success': True}) except Exception as e: return _error_response(str(e), 500)