Skip to content

Commit f559eb3

Browse files
authored
fix: Get renderer working as expected (#105)
* Remove `register` loop from `shop` reference in modules * Create a new renderer instance for this module
1 parent 6e7be62 commit f559eb3

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

src/viur/shop/modules/abstract.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from viur.core import Module, current, translate
44
from viur.core.prototypes import List, Tree
55
from viur.core.prototypes.tree import SkelType
6+
from viur.core.render.abstract import AbstractRenderer
67
from viur.core.skeleton import SkeletonInstance
7-
88
from ..globals import SHOP_LOGGER
99

1010
if t.TYPE_CHECKING:
@@ -37,7 +37,8 @@ def __init__(
3737
shop: "Shop" = None,
3838
*args, **kwargs
3939
):
40-
# logger.debug(f"{self.__class__.__name__}<ShopModuleAbstract>.__init__()")
40+
# logger.debug(f"{self.__class__.__name__}<ShopModuleAbstract>.__init__({moduleName=}, {modulePath=}, {shop=})")
41+
self._is_registered = False
4142
if shop is None:
4243
raise ValueError("Missing shop argument!")
4344
if moduleName is None:
@@ -51,6 +52,23 @@ def __init__(
5152
super().__init__(moduleName, modulePath, *args, **kwargs)
5253
self.shop: "Shop" = shop
5354

55+
def register(self, target: dict, render: AbstractRenderer) -> None:
56+
"""
57+
Overwritten to avoid loops.
58+
The modules have an `shop` root/parent reference, but this should
59+
not again be discovered by :meth:`register`.
60+
61+
Furthermore, this creates a new renderer instance just for this module
62+
(with the `parent` reference), which does usually the viur-core in
63+
:meth:`core.__build_app`. Otherwise, every module would use the same
64+
shop renderer.
65+
"""
66+
if self._is_registered:
67+
return
68+
self._is_registered = True
69+
render = type(render)(parent=self) # Create a new renderer instance for this module
70+
return super().register(target, render)
71+
5472
@property
5573
def session(self) -> dict:
5674
"""Return a own session scope for this module"""

src/viur/shop/shop.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
from viur.core import conf, logging
55
from viur.core.bones import RelationalBone
6-
from viur.core.decorators import exposed
76
from viur.core.module import Module
87
from viur.core.modules.translation import Creator, TranslationSkel
98
from viur.core.modules.user import UserSkel
109
from viur.core.prototypes.instanced_module import InstancedModule
10+
from viur.core.render.abstract import AbstractRenderer
1111
from viur.core.skeleton import MetaSkel, skeletonByKind
1212
from viur.shop.data.translations import TRANSLATIONS
1313
from viur.shop.skeletons.article import ArticleAbstractSkel
@@ -29,6 +29,8 @@
2929

3030

3131
class Shop(InstancedModule, Module):
32+
_is_registered_for: t.ClassVar[set[str]] = set()
33+
3234
def __init__(
3335
self,
3436
*,
@@ -50,6 +52,7 @@ def __init__(
5052
#
5153
**kwargs: t.Any,
5254
):
55+
# logger.debug(f"{self.__class__.__name__}<Shop>.__init__()")
5356
super().__init__()
5457
self.hooks = HOOK_SERVICE
5558

@@ -115,8 +118,26 @@ def __call__(self, *args, **kwargs) -> t.Self:
115118
SHOP_INSTANCE.set(self)
116119
elif self.modulePath == f"/vi/{self.moduleName}":
117120
SHOP_INSTANCE_VI.set(self)
121+
122+
import renders
123+
124+
logger.debug(dir(renders))
125+
118126
return self
119127

128+
def register(self, target: dict, render: AbstractRenderer) -> None:
129+
"""
130+
Overwritten to avoid loops.
131+
The modules have an `shop` root/parent reference, but this should
132+
not again be discovered by :meth:`register`.
133+
"""
134+
# logging.debug(f"{self.__class__.__name__}.register() {self.moduleName=} {self.modulePath=} "
135+
# f"{id(target)=} {render=} {self._is_registered_for=}")
136+
if (render_name := f"{type(render).__module__}.{type(render).__qualname__}") in Shop._is_registered_for:
137+
return
138+
Shop._is_registered_for.add(render_name)
139+
return super().register(target, render)
140+
120141
def _set_kind_names(self) -> None:
121142
"""Set kindname of bones where the kind name can be dynamically
122143
@@ -228,6 +249,16 @@ def _add_translations(self) -> None:
228249
except Exception as exc:
229250
logger.exception(f"Failed to write added translation {skel=} :: {exc}")
230251

252+
def __repr__(self) -> str:
253+
cls = type(self)
254+
return (
255+
f"<{cls.__module__}.{cls.__qualname__} object"
256+
f"with moduleName={getattr(self, "moduleName", "NOT_SET")}, "
257+
f"modulePath={getattr(self, "modulePath", "NOT_SET")}, "
258+
f"render={getattr(self, "render", "NOT_SET")}"
259+
f"at {hex(id(self))}>"
260+
)
261+
231262

232263
Shop.html = True
233264
Shop.vi = True

0 commit comments

Comments
 (0)