Files
Yamen Ahmad 3e83d8d7d5 feat: add complete EnCoach backend — Odoo 19 + all addons
Includes:
- Odoo 19 framework (odoo/)
- 27 custom EnCoach addons (new_project/custom_addons/)
  - encoach_core, encoach_api, encoach_lms_api, encoach_adaptive_api
  - encoach_exam, encoach_taxonomy, encoach_adaptive, encoach_assignment
  - encoach_ai, encoach_ai_grading, encoach_ai_generation, encoach_ai_media
  - encoach_courseware, encoach_communication, encoach_subscription
  - encoach_notification, encoach_approval, encoach_branding
  - encoach_classroom, encoach_registration, encoach_stats
  - encoach_faq, encoach_ticket, encoach_training, encoach_resources
  - encoach_adaptive_ai, encoach_sis
- 21 OpenEduCat Enterprise modules (new_project/enterprise-19/)
- 14 OpenEduCat Community modules (new_project/openeducat_erp-19.0/)
- Configuration: odoo.conf, requirements.txt, scripts
- 200+ REST API endpoints with JWT authentication
- SRS and test documentation

Made-with: Cursor
2026-04-01 17:10:04 +04:00

28 lines
1.2 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from werkzeug.exceptions import NotFound
from odoo import http
from odoo.http import request
from odoo.addons.mail.controllers.thread import ThreadController
from odoo.addons.mail.tools.discuss import add_guest_to_context, Store
class MessageReactionController(ThreadController):
@http.route("/mail/message/reaction", methods=["POST"], type="jsonrpc", auth="public")
@add_guest_to_context
def mail_message_reaction(self, message_id, content, action, **kwargs):
message = self._get_message_with_access(int(message_id), mode="create", **kwargs)
if not message:
raise NotFound()
partner, guest = self._get_reaction_author(message, **kwargs)
if not partner and not guest:
raise NotFound()
store = Store()
# sudo: mail.message - access mail.message.reaction through an accessible message is allowed
message.sudo()._message_reaction(content, action, partner, guest, store)
return store.get_result()
def _get_reaction_author(self, message, **kwargs):
return request.env["res.partner"]._get_current_persona()