Files
Talal Sharabi bf3981028b Fix model-controller mismatches and routing issues
- ticket: add user_id, priority, category fields; fix _serialize_ticket -> _serialize
- package: fix is_active -> active (Odoo auto-filter), remove invalid entity_id filter
- walkthrough: add sequence field; fix controller to use name/content instead of title/steps
- users: fix encoach_user_type -> encoach_type, encoach_entity_id -> entity_rel_ids.entity_id
- generation: use EncoachGenerationService class instead of nonexistent ORM model,
  fix /api/exam/level/ route conflict (separate GET and POST URLs)

Made-with: Cursor
2026-03-15 01:08:36 +04:00

129 lines
4.7 KiB
Python

import logging
from odoo import http
from odoo.http import request
from .base import EncoachMixin
_logger = logging.getLogger(__name__)
class TicketsController(EncoachMixin, http.Controller):
# --------------------------------------------------------------- list
@http.route('/api/tickets', type='http', auth='public', methods=['GET', 'OPTIONS'], csrf=False, cors='*')
def list_tickets(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
domain = []
user_type = getattr(user, 'encoach_type', 'student')
if user_type not in ('admin', 'developer'):
domain.append(('user_id', '=', user.id))
status = kwargs.get('status')
if status:
domain.append(('status', '=', status))
offset, limit, page = self._paginate_params(kwargs)
Ticket = request.env['encoach.ticket'].sudo()
total = Ticket.search_count(domain)
records = Ticket.search(domain, offset=offset, limit=limit, order='create_date desc')
return self._json_response({
'tickets': [self._serialize(t) for t in records],
'total': total,
'page': page,
'limit': limit,
})
except Exception:
_logger.exception("List tickets error")
return self._error_response('Internal server error', 500)
# -------------------------------------------------------------- create
@http.route('/api/tickets', type='http', auth='public', methods=['POST', 'OPTIONS'], csrf=False, cors='*')
def create_ticket(self, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
body = self._get_json_body()
subject = body.get('subject', '').strip()
if not subject:
return self._error_response('Subject is required', 400)
vals = {
'subject': subject,
'description': body.get('description', ''),
'user_id': user.id,
'status': 'open',
}
if body.get('priority'):
vals['priority'] = body['priority']
if body.get('category'):
vals['category'] = body['category']
ticket = request.env['encoach.ticket'].sudo().create(vals)
return self._json_response(self._serialize(ticket), status=201)
except Exception:
_logger.exception("Create ticket error")
return self._error_response('Internal server error', 500)
# -------------------------------------------------------------- update
@http.route(
'/api/tickets/<int:tid>', type='http', auth='public',
methods=['PATCH', 'OPTIONS'], csrf=False, cors='*',
)
def update_ticket(self, tid, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
ticket = request.env['encoach.ticket'].sudo().browse(tid)
if not ticket.exists():
return self._error_response('Ticket not found', 404)
body = self._get_json_body()
vals = {}
if 'subject' in body:
vals['subject'] = body['subject']
if 'description' in body:
vals['description'] = body['description']
if 'status' in body:
vals['status'] = body['status']
if 'priority' in body:
vals['priority'] = body['priority']
if vals:
ticket.write(vals)
return self._json_response(self._serialize(ticket))
except Exception:
_logger.exception("Update ticket error")
return self._error_response('Internal server error', 500)
# -------------------------------------------------------------- delete
@http.route(
'/api/tickets/<int:tid>', type='http', auth='public',
methods=['DELETE', 'OPTIONS'], csrf=False, cors='*',
)
def delete_ticket(self, tid, **kwargs):
try:
user = self._authenticate()
if not user:
return self._error_response('Unauthorized', 401)
ticket = request.env['encoach.ticket'].sudo().browse(tid)
if not ticket.exists():
return self._error_response('Ticket not found', 404)
ticket.unlink()
return self._json_response({'ok': True})
except Exception:
_logger.exception("Delete ticket error")
return self._error_response('Internal server error', 500)