Add caching for extra fields retrieval
This commit is contained in:
@@ -142,8 +142,14 @@ def validate_extra_field_dict(all_fields: list[ExtraField], fields_input: dict[s
|
|||||||
raise ValueError(f"Invalid extra field for key {key}: {e!s}") from None
|
raise ValueError(f"Invalid extra field for key {key}: {e!s}") from None
|
||||||
|
|
||||||
|
|
||||||
|
extra_field_cache = {}
|
||||||
|
|
||||||
|
|
||||||
async def get_extra_fields(db: AsyncSession, entity_type: EntityType) -> list[ExtraField]:
|
async def get_extra_fields(db: AsyncSession, entity_type: EntityType) -> list[ExtraField]:
|
||||||
"""Get all extra fields for a specific entity type."""
|
"""Get all extra fields for a specific entity type."""
|
||||||
|
if entity_type in extra_field_cache:
|
||||||
|
return extra_field_cache[entity_type]
|
||||||
|
|
||||||
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
||||||
try:
|
try:
|
||||||
setting = await db_setting.get(db, setting_def)
|
setting = await db_setting.get(db, setting_def)
|
||||||
@@ -156,7 +162,9 @@ async def get_extra_fields(db: AsyncSession, entity_type: EntityType) -> list[Ex
|
|||||||
logger.warning("Setting %s is not a list, using default.", setting_def.key)
|
logger.warning("Setting %s is not a list, using default.", setting_def.key)
|
||||||
setting_array = []
|
setting_array = []
|
||||||
|
|
||||||
return [ExtraField.parse_obj(obj) for obj in setting_array]
|
fields = [ExtraField.parse_obj(obj) for obj in setting_array]
|
||||||
|
extra_field_cache[entity_type] = fields
|
||||||
|
return fields
|
||||||
|
|
||||||
|
|
||||||
async def add_or_update_extra_field(db: AsyncSession, entity_type: EntityType, extra_field: ExtraField) -> None:
|
async def add_or_update_extra_field(db: AsyncSession, entity_type: EntityType, extra_field: ExtraField) -> None:
|
||||||
@@ -189,6 +197,9 @@ async def add_or_update_extra_field(db: AsyncSession, entity_type: EntityType, e
|
|||||||
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
||||||
await db_setting.update(db=db, definition=setting_def, value=json.dumps(jsonable_encoder(extra_fields)))
|
await db_setting.update(db=db, definition=setting_def, value=json.dumps(jsonable_encoder(extra_fields)))
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
extra_field_cache[entity_type] = extra_fields
|
||||||
|
|
||||||
logger.info("Added/updated extra field %s for entity type %s.", extra_field.key, entity_type.name)
|
logger.info("Added/updated extra field %s for entity type %s.", extra_field.key, entity_type.name)
|
||||||
|
|
||||||
|
|
||||||
@@ -205,6 +216,9 @@ async def delete_extra_field(db: AsyncSession, entity_type: EntityType, key: str
|
|||||||
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
setting_def = parse_setting(f"extra_fields_{entity_type.name}")
|
||||||
await db_setting.update(db=db, definition=setting_def, value=json.dumps(jsonable_encoder(extra_fields)))
|
await db_setting.update(db=db, definition=setting_def, value=json.dumps(jsonable_encoder(extra_fields)))
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
extra_field_cache[entity_type] = extra_fields
|
||||||
|
|
||||||
# Delete the extra field for all entities
|
# Delete the extra field for all entities
|
||||||
if entity_type == EntityType.vendor:
|
if entity_type == EntityType.vendor:
|
||||||
await db_vendor.clear_extra_field(db, key)
|
await db_vendor.clear_extra_field(db, key)
|
||||||
|
|||||||
Reference in New Issue
Block a user