Skip to content

Commit

Permalink
fix: Ensure derives are generated in FileBone inside a RecordBone
Browse files Browse the repository at this point in the history
… too (WIP)
  • Loading branch information
sveneberth committed Jan 15, 2025
1 parent 84d80ba commit 39e9380
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/viur/core/bones/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
16 changes: 16 additions & 0 deletions src/viur/core/bones/record.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json
import typing as t
import logging

from viur.core.bones.base import BaseBone, ReadFromClientError, ReadFromClientErrorSeverity

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions src/viur/core/bones/relational.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions src/viur/core/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"])
Expand Down

0 comments on commit 39e9380

Please sign in to comment.