EnCoach Odoo 19 custom modules
Full backend implementation with custom Odoo modules: - encoach_api: Core API, user management, JWT auth - encoach_exam: Exam generation (reading, writing, listening, speaking) - encoach_evaluate: AI-powered evaluation (writing, speaking) - encoach_training: Training tips and walkthrough - encoach_storage: File storage management - encoach_payment: Stripe, PayPal, Paymob integration - encoach_mail: Email notifications Made-with: Cursor
This commit is contained in:
175
encoach_api/controllers/entities.py
Normal file
175
encoach_api/controllers/entities.py
Normal file
@@ -0,0 +1,175 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
from .base import EncoachMixin
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class EntitiesController(EncoachMixin, http.Controller):
|
||||
|
||||
@http.route('/api/entities', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*')
|
||||
def list_entities(self, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
offset, limit, page = self._paginate_params(kwargs)
|
||||
entities = request.env['encoach.entity'].sudo().search([], limit=limit, offset=offset, order='name asc')
|
||||
total = request.env['encoach.entity'].sudo().search_count([])
|
||||
return self._json_response({
|
||||
'items': [e.to_encoach_dict() for e in entities],
|
||||
'total': total, 'page': page, 'limit': limit,
|
||||
})
|
||||
except Exception:
|
||||
_logger.exception("List entities error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/entities', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
|
||||
def create_entity(self, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
body = self._get_json_body()
|
||||
name = body.get('name', '').strip()
|
||||
if not name:
|
||||
return self._error_response('name is required', 400)
|
||||
entity = request.env['encoach.entity'].sudo().create({
|
||||
'name': name,
|
||||
'label': body.get('label', name),
|
||||
'licenses': body.get('licenses', 0),
|
||||
'expiry_date': body.get('expiryDate'),
|
||||
'payment_currency': body.get('paymentCurrency'),
|
||||
'payment_price': body.get('paymentPrice', 0),
|
||||
})
|
||||
return self._json_response(entity.to_encoach_dict())
|
||||
except Exception:
|
||||
_logger.exception("Create entity error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/entities/<int:entity_id>', type='http', auth='public', methods=['PATCH', 'OPTIONS'], csrf=False, cors='*')
|
||||
def update_entity(self, entity_id, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
entity = request.env['encoach.entity'].sudo().browse(entity_id)
|
||||
if not entity.exists():
|
||||
return self._error_response('Entity not found', 404)
|
||||
body = self._get_json_body()
|
||||
vals = {}
|
||||
if 'name' in body: vals['name'] = body['name']
|
||||
if 'label' in body: vals['label'] = body['label']
|
||||
if 'licenses' in body: vals['licenses'] = body['licenses']
|
||||
if 'expiryDate' in body: vals['expiry_date'] = body['expiryDate']
|
||||
if 'paymentCurrency' in body: vals['payment_currency'] = body['paymentCurrency']
|
||||
if 'paymentPrice' in body: vals['payment_price'] = body['paymentPrice']
|
||||
if vals:
|
||||
entity.write(vals)
|
||||
return self._json_response(entity.to_encoach_dict())
|
||||
except Exception:
|
||||
_logger.exception("Update entity error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/entities/<int:entity_id>', type='http', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False, cors='*')
|
||||
def delete_entity(self, entity_id, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
entity = request.env['encoach.entity'].sudo().browse(entity_id)
|
||||
if not entity.exists():
|
||||
return self._error_response('Entity not found', 404)
|
||||
entity.unlink()
|
||||
return self._json_response({'ok': True})
|
||||
except Exception:
|
||||
_logger.exception("Delete entity error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/roles', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*')
|
||||
def list_roles(self, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
domain = []
|
||||
entity_id = kwargs.get('entityID')
|
||||
if entity_id:
|
||||
domain.append(('entity_id', '=', int(entity_id)))
|
||||
roles = request.env['encoach.role'].sudo().search(domain)
|
||||
return self._json_response([{
|
||||
'id': r.id, 'name': r.name,
|
||||
'entityId': r.entity_id.id if r.entity_id else None,
|
||||
} for r in roles])
|
||||
except Exception:
|
||||
_logger.exception("List roles error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/roles', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
|
||||
def create_role(self, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
body = self._get_json_body()
|
||||
name = body.get('name', '').strip()
|
||||
if not name:
|
||||
return self._error_response('name is required', 400)
|
||||
vals = {'name': name}
|
||||
if body.get('entityId'):
|
||||
vals['entity_id'] = int(body['entityId'])
|
||||
role = request.env['encoach.role'].sudo().create(vals)
|
||||
return self._json_response({'id': role.id, 'name': role.name, 'entityId': role.entity_id.id if role.entity_id else None})
|
||||
except Exception:
|
||||
_logger.exception("Create role error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/roles/<int:role_id>', type='http', auth='public', methods=['PATCH', 'OPTIONS'], csrf=False, cors='*')
|
||||
def update_role(self, role_id, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
role = request.env['encoach.role'].sudo().browse(role_id)
|
||||
if not role.exists():
|
||||
return self._error_response('Role not found', 404)
|
||||
body = self._get_json_body()
|
||||
vals = {}
|
||||
if 'name' in body: vals['name'] = body['name']
|
||||
if vals:
|
||||
role.write(vals)
|
||||
return self._json_response({'id': role.id, 'name': role.name, 'entityId': role.entity_id.id if role.entity_id else None})
|
||||
except Exception:
|
||||
_logger.exception("Update role error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/roles/<int:role_id>', type='http', auth='public', methods=['DELETE', 'OPTIONS'], csrf=False, cors='*')
|
||||
def delete_role(self, role_id, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
role = request.env['encoach.role'].sudo().browse(role_id)
|
||||
if not role.exists():
|
||||
return self._error_response('Role not found', 404)
|
||||
role.unlink()
|
||||
return self._json_response({'ok': True})
|
||||
except Exception:
|
||||
_logger.exception("Delete role error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
|
||||
@http.route('/api/permissions', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*')
|
||||
def list_permissions(self, **kwargs):
|
||||
try:
|
||||
user = self._authenticate()
|
||||
if not user:
|
||||
return self._error_response('Unauthorized', 401)
|
||||
perms = request.env['encoach.permission'].sudo().search([])
|
||||
return self._json_response([{'id': p.id, 'topic': p.topic, 'type': p.perm_type} for p in perms])
|
||||
except Exception:
|
||||
_logger.exception("List permissions error")
|
||||
return self._error_response('Internal server error', 500)
|
||||
Reference in New Issue
Block a user