Skip to content

Commit 7ec55ae

Browse files
committed
feat: Evaluate x-viur-bonelist on default viewSkel()
- Introduces generic `SkelModule.skel()` function to obtain a skeleton instance. - Modifies all prototypes to accept `bones_from_request` Replacement for #1376
1 parent 3541e1b commit 7ec55ae

File tree

4 files changed

+42
-4
lines changed

4 files changed

+42
-4
lines changed

src/viur/core/prototypes/list.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def viewSkel(self, *args, **kwargs) -> SkeletonInstance:
3737
3838
:return: Returns a Skeleton instance for viewing an entry.
3939
"""
40-
return self.baseSkel(*args, **kwargs)
40+
return self.skel(bones_from_request=True, **kwargs)
4141

4242
def addSkel(self, *args, **kwargs) -> SkeletonInstance:
4343
"""

src/viur/core/prototypes/singleton.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def viewSkel(self, *args, **kwargs) -> SkeletonInstance:
3838
3939
:return: Returns a Skeleton instance for viewing the singleton entry.
4040
"""
41-
return self.baseSkel(*args, **kwargs)
41+
return self.skel(bones_from_request=True, **kwargs)
4242

4343
def editSkel(self, *args, **kwargs) -> SkeletonInstance:
4444
"""

src/viur/core/prototypes/skelmodule.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,45 @@ def baseSkel(self, *args, **kwargs) -> SkeletonInstance:
108108
109109
By default, baseSkel is used by :func:`~viewSkel`, :func:`~addSkel`, and :func:`~editSkel`.
110110
"""
111-
return self._resolveSkelCls(*args, **kwargs)()
111+
return self._resolveSkelCls(**kwargs)()
112+
113+
def skel(
114+
self,
115+
bones: t.Iterable[str] = (),
116+
bones_from_request: bool = False,
117+
**kwargs,
118+
) -> SkeletonInstance:
119+
"""
120+
Retrieve module-specific skeleton, optionally as subskel.
121+
122+
:param bones: ALlows to specify a list of bones to form a subskel.
123+
:param bones_from_request: Evaluates header X-VIUR-BONELIST to contain a comma-separated list of bones.
124+
Using this parameter enforces that the Skeleton class has a subskel named "*" for required bones that
125+
must exist.
126+
127+
The parameters `bones` and `bones_from_request` can be combined.
128+
"""
129+
skel_cls = self._resolveSkelCls(**kwargs)
130+
bones = set(bones) if bones else set()
131+
132+
if (
133+
bones_from_request # feature generally enabled?
134+
and skel_cls.subSkels.get("*") # a named subSkel "*"" must exist
135+
# and (bonelist := current.request.get().kwargs.get("x-viur-bonelist")) # param must be given (DEBUG!)
136+
and (bonelist := current.request.get().request.headers.get("x-viur-bonelist")) # header must be given
137+
):
138+
bones |= {bone.strip() for bone in bonelist.split(",")}
139+
140+
# Return a subskel?
141+
if bones:
142+
# When coming from outside of a request, "*" must always be contained.
143+
if bones_from_request:
144+
return skel_cls.subskel("*", bones=bones)
145+
146+
return skel_cls.subskel(bones=bones)
147+
148+
# Otherwise, return full skeleton
149+
return skel_cls()
112150

113151
def _apply_default_order(self, query: db.Query):
114152
"""

src/viur/core/prototypes/tree.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def viewSkel(self, skelType: SkelType, *args, **kwargs) -> SkeletonInstance:
9898
9999
:return: Returns a Skeleton instance for viewing an entry.
100100
"""
101-
return self.baseSkel(skelType, *args, **kwargs)
101+
return self.skel(bones_from_request=True, skelType=skelType, **kwargs)
102102

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

0 commit comments

Comments
 (0)