From 39e938087004e345708c47d6c90723dd44627d7f Mon Sep 17 00:00:00 2001 From: Sven Eberth Date: Wed, 15 Jan 2025 01:10:48 +0100 Subject: [PATCH] fix: Ensure derives are generated in `FileBone` inside a `RecordBone` too (WIP) --- src/viur/core/bones/file.py | 13 ++++++++++++- src/viur/core/bones/record.py | 16 ++++++++++++++++ src/viur/core/bones/relational.py | 2 ++ src/viur/core/tasks.py | 4 ++-- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/viur/core/bones/file.py b/src/viur/core/bones/file.py index c1139d0d7..dd79e220a 100644 --- a/src/viur/core/bones/file.py +++ b/src/viur/core/bones/file.py @@ -210,12 +210,23 @@ def postSavedHandler(self, skel, boneName, key): the derived files directly. """ super().postSavedHandler(skel, boneName, key) + from viur.core.skeleton import RelSkel, Skeleton + + logging.debug(f"{skel}") + logging.debug(f"{skel.skeletonCls}") + if issubclass(skel.skeletonCls, Skeleton): + prefix = f"{skel.kindName}_{boneName}" + elif issubclass(skel.skeletonCls, RelSkel): + prefix = f"{skel.skeletonCls.__name__}_{boneName}" + else: + raise NotImplementedError(f"Cannot handle {skel.skeletonCls=}") + logging.debug(f"{prefix}: {skel.skeletonCls}") def handleDerives(values): if isinstance(values, dict): values = [values] for val in (values or ()): # Ensure derives getting build for each file referenced in this relation - ensureDerived(val["dest"]["key"], f"{skel.kindName}_{boneName}", self.derive) + ensureDerived(val["dest"]["key"], prefix, self.derive) values = skel[boneName] if self.derive and values: diff --git a/src/viur/core/bones/record.py b/src/viur/core/bones/record.py index 582884f30..6c1eb191d 100644 --- a/src/viur/core/bones/record.py +++ b/src/viur/core/bones/record.py @@ -1,5 +1,6 @@ import json import typing as t +import logging from viur.core.bones.base import BaseBone, ReadFromClientError, ReadFromClientErrorSeverity @@ -103,6 +104,21 @@ def singleValueFromClient(self, value, skel, bone_name, client_data): ) return usingSkel, usingSkel.errors + def postSavedHandler(self, skel: "SkeletonInstance", boneName: str, key: str) -> None: + super().postSavedHandler(skel, boneName, key) + try: + logging.info(f"Record bone {boneName=} | {key=} has been saved") + logging.debug(f"Record bone {skel=} has been saved") + for idx, lang, value in self.iter_bone_value(skel, boneName): + using = self.using() + using.unserialize(value) + logging.debug(f"{using=}") + for bone_name, bone in using.items(): + bone.postSavedHandler(using, bone_name, None) + except Exception as e: + logging.exception(e) + + def getSearchTags(self, skel: 'viur.core.skeleton.SkeletonInstance', name: str) -> set[str]: """ Collects search tags from the 'using' skeleton instance for the given bone. diff --git a/src/viur/core/bones/relational.py b/src/viur/core/bones/relational.py index 403129d01..4929d6012 100644 --- a/src/viur/core/bones/relational.py +++ b/src/viur/core/bones/relational.py @@ -502,6 +502,8 @@ def postSavedHandler(self, skel: "SkeletonInstance", boneName: str, key: db.Key) :param boneName: The name of the relational bone. :param key: The key of the saved skeleton instance. """ + if key is None: # RecordBone container has no key + return if not skel[boneName]: values = [] elif self.multiple and self.languages: diff --git a/src/viur/core/tasks.py b/src/viur/core/tasks.py index 409d669c1..39fe1afa7 100644 --- a/src/viur/core/tasks.py +++ b/src/viur/core/tasks.py @@ -791,9 +791,9 @@ def _qryStep(cls, qryDict: dict[str, t.Any]) -> None: qry.origKind = qryDict["origKind"] qry.queries.distinct = qryDict["distinct"] if qry.srcSkel: - qryIter = qry.fetch(5) + qryIter = qry.fetch(100) else: - qryIter = qry.run(5) + qryIter = qry.run(100) for item in qryIter: try: cls.handleEntry(item, qryDict["customData"])