diff --git a/addons/game_base/models/__init__.py b/addons/game_base/models/__init__.py index 42dfeb2..634af88 100644 --- a/addons/game_base/models/__init__.py +++ b/addons/game_base/models/__init__.py @@ -5,3 +5,4 @@ from . import rule_category from . import rule from . import page from . import story +from . import ir_http diff --git a/addons/game_base/models/ir_http.py b/addons/game_base/models/ir_http.py new file mode 100644 index 0000000..b2aec05 --- /dev/null +++ b/addons/game_base/models/ir_http.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +""" +YUSEN db-aware routing patch for Odoo 18. + +Odoo 18 resolves the database from the Host header via dbfilter. The +yt.pengyuthon.cn front-end proxies /game/ and /yt_world/ requests to Odoo +with Host "game.pengyuthon.cn" (a virtual host), which does NOT match the +fixed dbfilter list. As a result those requests fall through to the +database-free routing map and return 404. + +This patch forces the correct database for path-prefixed game routes so the +real controllers (game_base) are reachable. +""" +import logging + +_logger = logging.getLogger(__name__) + +import odoo.http +from odoo.http import Request, db_filter + +# path prefix -> target database +PATH_DB_MAP = { + '/game/': 'game', + '/yt_world/': 'yt_game', +} + +_ORIG_get_session_and_dbname = Request._get_session_and_dbname + + +def _patched_get_session_and_dbname(self): + path = self.httprequest.path + host = self.httprequest.environ.get('HTTP_HOST', '') + for prefix, db in PATH_DB_MAP.items(): + if path.startswith(prefix): + # only force the db if it actually passes the configured dbfilter, + # otherwise degrade gracefully to Odoo's default resolution + if db_filter([db], host=host): + session, _ = _ORIG_get_session_and_dbname(self) + session.db = db + return session, db + break + return _ORIG_get_session_and_dbname(self) + + +if not getattr(Request._get_session_and_dbname, '_yusen_db_patch', False): + _patched_get_session_and_dbname._yusen_db_patch = True + Request._get_session_and_dbname = _patched_get_session_and_dbname + _logger.info("YUSEN patched Request._get_session_and_dbname (db-aware routing for /game/ and /yt_world/)")