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
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
"""Patcher for any change not strictly related to an stdlib module
|
|
|
|
"""
|
|
|
|
import codecs
|
|
import encodings.aliases
|
|
import re
|
|
import sys
|
|
|
|
import babel.core
|
|
|
|
import odoo
|
|
|
|
|
|
def patch_module():
|
|
patch_evented()
|
|
patch_codecs()
|
|
|
|
|
|
odoo.evented = False
|
|
|
|
|
|
def patch_evented():
|
|
"""Running mode flags (gevent, prefork)
|
|
|
|
This should be executed early. It will initialize the `odoo.evented` variable.
|
|
"""
|
|
if odoo.evented or not (len(sys.argv) > 1 and sys.argv[1] == 'gevent'):
|
|
return
|
|
sys.argv.remove('gevent')
|
|
import gevent.monkey # noqa: PLC0415
|
|
import psycopg2 # noqa: PLC0415
|
|
from gevent.socket import wait_read, wait_write # noqa: PLC0415
|
|
gevent.monkey.patch_all()
|
|
|
|
def gevent_wait_callback(conn, timeout=None):
|
|
"""A wait callback useful to allow gevent to work with Psycopg."""
|
|
# Copyright (C) 2010-2012 Daniele Varrazzo <daniele.varrazzo@gmail.com>
|
|
# This function is borrowed from psycogreen module which is licensed
|
|
# under the BSD license (see in odoo/debian/copyright)
|
|
while 1:
|
|
state = conn.poll()
|
|
if state == psycopg2.extensions.POLL_OK:
|
|
break
|
|
elif state == psycopg2.extensions.POLL_READ:
|
|
wait_read(conn.fileno(), timeout=timeout)
|
|
elif state == psycopg2.extensions.POLL_WRITE:
|
|
wait_write(conn.fileno(), timeout=timeout)
|
|
else:
|
|
raise psycopg2.OperationalError(
|
|
"Bad result from poll: %r" % state)
|
|
|
|
psycopg2.extensions.set_wait_callback(gevent_wait_callback)
|
|
odoo.evented = True
|
|
|
|
|
|
def patch_codecs():
|
|
# ---------------------------------------------------------
|
|
# some charset are known by Python under a different name
|
|
# ---------------------------------------------------------
|
|
|
|
encodings.aliases.aliases['874'] = 'cp874'
|
|
encodings.aliases.aliases['windows_874'] = 'cp874'
|
|
|
|
# ---------------------------------------------------------
|
|
# alias hebrew iso-8859-8-i and iso-8859-8-e on iso-8859-8
|
|
# https://bugs.python.org/issue18624
|
|
# ---------------------------------------------------------
|
|
|
|
iso8859_8 = codecs.lookup('iso8859_8')
|
|
iso8859_8ie_re = re.compile(r'iso[-_]?8859[-_]8[-_]?[ei]', re.IGNORECASE)
|
|
codecs.register(lambda charset: iso8859_8 if iso8859_8ie_re.match(charset) else None)
|
|
|
|
# To remove when corrected in Babel
|
|
babel.core.LOCALE_ALIASES['nb'] = 'nb_NO'
|