@@ -57,23 +57,25 @@ def _ensure_current_session_cart(self):
57
57
current .session .get ().markChanged ()
58
58
# Store basket at the user skel, it will be shared over multiple sessions / devices
59
59
if user := current .user .get ():
60
- user_skel = conf .main_app .vi .user .editSkel ()
61
- user_skel .fromDB (user ["key" ])
62
- user_skel .setBoneValue ("basket" , key )
63
- user_skel .toDB ()
60
+ db .RunInTransaction (self ._set_basket_txn , user_key = user ["key" ], basket_key = key )
64
61
return self .session ["session_cart_key" ]
65
62
66
63
def detach_session_cart (self ) -> db .Key :
67
64
key = self .session ["session_cart_key" ]
68
65
self .session ["session_cart_key" ] = None
69
66
current .session .get ().markChanged ()
70
67
if user := current .user .get ():
71
- user_skel = conf .main_app .vi .user .editSkel ()
72
- user_skel .fromDB (user ["key" ])
73
- user_skel ["basket" ] = None
74
- user_skel .toDB ()
68
+ db .RunInTransaction (self ._set_basket_txn , user_key = user ["key" ], basket_key = None )
75
69
return key
76
70
71
+ @staticmethod
72
+ def _set_basket_txn (user_key : db .Key , basket_key : db .Key | None ) -> SkeletonInstance :
73
+ user_skel = conf .main_app .vi .user .editSkel ()
74
+ user_skel .fromDB (user_key )
75
+ user_skel .setBoneValue ("basket" , basket_key )
76
+ user_skel .toDB ()
77
+ return user_skel
78
+
77
79
def get_available_root_nodes (self , * args , ** kwargs ) -> list [dict [t .Literal ["name" , "key" ], str ]]:
78
80
root_nodes = [self .current_session_cart ]
79
81
@@ -99,6 +101,9 @@ def listRootNodes(self, *args, **kwargs) -> t.Any:
99
101
100
102
:returns: The rendered representation of the available root-nodes.
101
103
"""
104
+ if utils .string .is_prefix (self .render .kind , "json" ):
105
+ # TODO: add in viur-core
106
+ current .request .get ().response .headers ["Content-Type" ] = "application/json"
102
107
return self .render .listRootNodes ([
103
108
self .render .renderSkelValues (skel )
104
109
for skel in self .getAvailableRootNodes (* args , ** kwargs )
@@ -174,6 +179,7 @@ def get_article(
174
179
self ,
175
180
article_key : db .Key ,
176
181
parent_cart_key : db .Key ,
182
+ must_be_listed : bool = True ,
177
183
):
178
184
if not isinstance (article_key , db .Key ):
179
185
raise TypeError (f"article_key must be an instance of db.Key" )
@@ -185,7 +191,8 @@ def get_article(
185
191
query : db .Query = skel .all ()
186
192
query .filter ("parententry =" , parent_cart_key )
187
193
query .filter ("article.dest.__key__ =" , article_key )
188
- query .filter ("shop_listed =" , True )
194
+ if must_be_listed :
195
+ query .filter ("shop_listed =" , True )
189
196
skel = query .getSkel ()
190
197
return skel
191
198
@@ -205,7 +212,7 @@ def add_or_update_article(
205
212
if not self .is_valid_node (parent_cart_key ):
206
213
raise e .InvalidArgumentException ("parent_cart_key" , parent_cart_key )
207
214
parent_skel = None
208
- if not (skel := self .get_article (article_key , parent_cart_key )):
215
+ if not (skel := self .get_article (article_key , parent_cart_key , must_be_listed = False )):
209
216
logger .info ("This is an add" )
210
217
skel = self .addSkel ("leaf" )
211
218
res = skel .setBoneValue ("article" , article_key )
@@ -217,7 +224,10 @@ def add_or_update_article(
217
224
else :
218
225
skel ["parentrepo" ] = parent_skel ["parentrepo" ]
219
226
article_skel : SkeletonInstance = self .shop .article_skel ()
220
- assert article_skel .fromDB (article_key )
227
+ if not article_skel .fromDB (article_key ):
228
+ raise errors .NotFound (f"Article with key { article_key = } does not exist!" )
229
+ if not article_skel ["shop_listed" ]:
230
+ raise errors .UnprocessableEntity (f"Article is not listed for the shop!" )
221
231
# Copy values from the article
222
232
for bone in skel .keys ():
223
233
if not bone .startswith ("shop_" ): continue
@@ -279,7 +289,7 @@ def move_article(
279
289
raise TypeError (f"parent_cart_key must be an instance of db.Key" )
280
290
if not isinstance (new_parent_cart_key , db .Key ):
281
291
raise TypeError (f"parent_cart_key must be an instance of db.Key" )
282
- if not (skel := self .get_article (article_key , parent_cart_key )):
292
+ if not (skel := self .get_article (article_key , parent_cart_key , must_be_listed = False )):
283
293
raise e .InvalidArgumentException (
284
294
"article_key" ,
285
295
descr_appendix = f"Article does not exist in cart node { parent_cart_key } ."
@@ -449,6 +459,7 @@ def freeze_cart(
449
459
) -> None :
450
460
# TODO: for node in tree:
451
461
# freeze node with values, discount, shipping (JSON dump? bone duplication?)
462
+ # ensure each article still exists and shop_listed is True
452
463
...
453
464
454
465
# -------------------------------------------------------------------------
0 commit comments