Skip to content

Commit

Permalink
feat: Evaluate x-viur-bonelist on default viewSkel()
Browse files Browse the repository at this point in the history
- Introduces generic `SkelModule.skel()` function to obtain a skeleton instance.
- Modifies all prototypes to accept `bones_from_request`

Replacement for #1376
  • Loading branch information
phorward committed Jan 23, 2025
1 parent 3541e1b commit 7ec55ae
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/viur/core/prototypes/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def viewSkel(self, *args, **kwargs) -> SkeletonInstance:
:return: Returns a Skeleton instance for viewing an entry.
"""
return self.baseSkel(*args, **kwargs)
return self.skel(bones_from_request=True, **kwargs)

def addSkel(self, *args, **kwargs) -> SkeletonInstance:
"""
Expand Down
2 changes: 1 addition & 1 deletion src/viur/core/prototypes/singleton.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def viewSkel(self, *args, **kwargs) -> SkeletonInstance:
:return: Returns a Skeleton instance for viewing the singleton entry.
"""
return self.baseSkel(*args, **kwargs)
return self.skel(bones_from_request=True, **kwargs)

def editSkel(self, *args, **kwargs) -> SkeletonInstance:
"""
Expand Down
40 changes: 39 additions & 1 deletion src/viur/core/prototypes/skelmodule.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,45 @@ def baseSkel(self, *args, **kwargs) -> SkeletonInstance:
By default, baseSkel is used by :func:`~viewSkel`, :func:`~addSkel`, and :func:`~editSkel`.
"""
return self._resolveSkelCls(*args, **kwargs)()
return self._resolveSkelCls(**kwargs)()

def skel(
self,
bones: t.Iterable[str] = (),
bones_from_request: bool = False,
**kwargs,
) -> SkeletonInstance:
"""
Retrieve module-specific skeleton, optionally as subskel.
:param bones: ALlows to specify a list of bones to form a subskel.
:param bones_from_request: Evaluates header X-VIUR-BONELIST to contain a comma-separated list of bones.
Using this parameter enforces that the Skeleton class has a subskel named "*" for required bones that
must exist.
The parameters `bones` and `bones_from_request` can be combined.
"""
skel_cls = self._resolveSkelCls(**kwargs)
bones = set(bones) if bones else set()

if (
bones_from_request # feature generally enabled?
and skel_cls.subSkels.get("*") # a named subSkel "*"" must exist
# and (bonelist := current.request.get().kwargs.get("x-viur-bonelist")) # param must be given (DEBUG!)
and (bonelist := current.request.get().request.headers.get("x-viur-bonelist")) # header must be given
):
bones |= {bone.strip() for bone in bonelist.split(",")}

# Return a subskel?
if bones:
# When coming from outside of a request, "*" must always be contained.
if bones_from_request:
return skel_cls.subskel("*", bones=bones)

return skel_cls.subskel(bones=bones)

# Otherwise, return full skeleton
return skel_cls()

def _apply_default_order(self, query: db.Query):
"""
Expand Down
2 changes: 1 addition & 1 deletion src/viur/core/prototypes/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def viewSkel(self, skelType: SkelType, *args, **kwargs) -> SkeletonInstance:
:return: Returns a Skeleton instance for viewing an entry.
"""
return self.baseSkel(skelType, *args, **kwargs)
return self.skel(bones_from_request=True, skelType=skelType, **kwargs)

def addSkel(self, skelType: SkelType, *args, **kwargs) -> SkeletonInstance:
"""
Expand Down

0 comments on commit 7ec55ae

Please sign in to comment.