Skip to content

Commit dfd90d3

Browse files
authored
feat: Implement cart_clear API method and the corresponding internal method (#170)
1 parent 07590f1 commit dfd90d3

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

src/viur/shop/data/translations.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,5 +941,12 @@
941941
"de": "Name",
942942
"en": "Name",
943943
},
944+
945+
# --- Errors --------------------------------------------------------------
946+
"viur.shop.error.cart.is_frozen": {
947+
# note: {{cart_key}} is a substitution variable for translations, not for an f-string!
948+
"en": r"The cart {{cart_key}} can no longer be edited.",
949+
"de": r"Der Warenkorb {{cart_key}} kann nicht mehr bearbeitet werden.",
950+
}
944951
}
945952
"""Initial translations used inside the viur-shop backend"""

src/viur/shop/modules/api.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def cart_update(
207207
*,
208208
cart_key: str | db.Key,
209209
cart_type: CartType = SENTINEL, # TODO: necessary?
210-
name: str = None,
210+
name: str = SENTINEL,
211211
customer_comment: str = SENTINEL,
212212
shipping_address_key: str | db.Key = SENTINEL,
213213
shipping_key: str | db.Key = SENTINEL,
@@ -267,15 +267,20 @@ def cart_remove(
267267
def cart_clear(
268268
self,
269269
*,
270-
cart_key: str | db.Key,
271-
remove_sub_carts: bool = False,
270+
cart_key: str | db.Key | t.Literal["BASKET"] = SENTINEL,
271+
keep_sub_carts: bool = False,
272272
):
273273
"""Remove direct or all children
274274
275-
:param remove_sub_carts: Remove child leafs, keep nodes
275+
:param cart_key: Key of the (sub) cart (node) from which
276+
the children should be removed.
277+
Use "BASKET" as key to use the basket of the current session.
278+
:param keep_sub_carts: Keep child nodes, remove only leafs
276279
"""
280+
if cart_key == "BASKET":
281+
cart_key = self.shop.cart.get_current_session_cart_key(create_if_missing=False)
277282
cart_key = self._normalize_external_key(cart_key, "cart_key")
278-
raise errors.NotImplemented # TODO
283+
return JsonResponse(self.shop.cart.cart_clear(cart_key, keep_sub_carts=keep_sub_carts))
279284

280285
@exposed
281286
def basket_list(

src/viur/shop/modules/cart.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import viur.shop.types.exceptions as e
44
from viur import toolkit
5-
from viur.core import conf, current, db, errors, exposed
5+
from viur.core import conf, current, db, errors, exposed, translate
66
from viur.core.bones import BaseBone
77
from viur.core.prototypes import Tree
88
from viur.core.prototypes.tree import SkelType
@@ -544,6 +544,31 @@ def cart_remove(
544544
# current.session.get().markChanged()
545545
EVENT_SERVICE.call(Event.CART_CHANGED, skel=skel, deleted=True)
546546

547+
def cart_clear(
548+
self,
549+
cart_key: db.Key,
550+
*,
551+
keep_sub_carts: bool = False,
552+
) -> None:
553+
cart_skel = self.editSkel("node")
554+
if not cart_skel.read(cart_key):
555+
raise errors.NotFound
556+
if cart_skel["is_frozen"]:
557+
raise errors.Forbidden(
558+
translate("viur.shop.error.cart.is_frozen",
559+
default_variables={"cart_key": cart_key})
560+
)
561+
562+
for leaf_skel in toolkit.iter_skel(self.editSkel("leaf").all().filter("parententry =", cart_skel["key"])):
563+
leaf_skel.delete()
564+
565+
if not keep_sub_carts:
566+
for node_skel in toolkit.iter_skel(self.editSkel("node").all().filter("parententry =", cart_skel["key"])):
567+
self.cart_clear(node_skel["key"], keep_sub_carts=keep_sub_carts)
568+
node_skel.delete()
569+
570+
EVENT_SERVICE.call(Event.CART_CHANGED, skel=cart_skel, cleared=True)
571+
547572
# --- Hooks ---------------------------------------------------------------
548573

549574
def additional_add_or_update_article(

0 commit comments

Comments
 (0)