hasattr only checks attribute existence, but event_dispatcher can exist as None when running standalone (backend_accounting.py). Use getattr with None check instead.
47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
from appPublic.log import debug
|
||
from sqlor.dbpools import DBPools
|
||
from pricing.pricing import (
|
||
PricingProgram,
|
||
test_pricing
|
||
)
|
||
from ahserver.serverenv import ServerEnv
|
||
|
||
def _bind_pricing_events(dbpools, dbname):
|
||
"""Bind database events to Pricing cache invalidation handlers."""
|
||
bindings = [
|
||
# pricing_program_timing: SQLor 事件 payload 不保证含 ppid,
|
||
# U/C 通过 id 反查 ppid,D 需 before 预缓存供 after 刷新缓存。
|
||
(f'{dbname}:pricing_program_timing:c:after', PricingProgram.on_timing_create),
|
||
(f'{dbname}:pricing_program_timing:u:after', PricingProgram.reload_pp_data),
|
||
(f'{dbname}:pricing_program_timing:d:before', PricingProgram.precache_timing_delete),
|
||
(f'{dbname}:pricing_program_timing:d:after', PricingProgram.on_timing_delete),
|
||
# pricing_program: 增删改均刷新该程序的全部缓存
|
||
(f'{dbname}:pricing_program:c:after', PricingProgram.reload_pricing_program),
|
||
(f'{dbname}:pricing_program:u:after', PricingProgram.reload_pricing_program),
|
||
(f'{dbname}:pricing_program:d:after', PricingProgram.reload_pricing_program),
|
||
]
|
||
for event_name, handler in bindings:
|
||
dbpools.bind(event_name, handler)
|
||
debug(f'Pricing event bound: {event_name}')
|
||
|
||
def load_pricing():
|
||
env = ServerEnv()
|
||
env.write_pricing_patten = PricingProgram.write_pricing_patten
|
||
env.write_pricing_data = PricingProgram.write_pricing_data
|
||
env.pricing_program_charging = PricingProgram.charging
|
||
env.buffered_charging = PricingProgram.buffered_charging
|
||
env.load_pricing_data = PricingProgram.load_pricing_data
|
||
env.get_pricing_program = PricingProgram.get_pricing_program
|
||
env.test_pricing = test_pricing
|
||
# Bind hot_reload event — only when running in ahserver (event_dispatcher available)
|
||
if getattr(env, 'event_dispatcher', None) is not None:
|
||
env.event_dispatcher.bind('hot_reload', PricingProgram.on_hot_reload)
|
||
dbpools = DBPools()
|
||
dbname = env.get_module_dbname('pricing')
|
||
if dbname:
|
||
_bind_pricing_events(dbpools, dbname)
|
||
debug(f'Pricing event listeners bound for database: {dbname}')
|
||
else:
|
||
debug('Pricing event listeners skipped: no database configured for pricing module')
|
||
|