diff --git a/eboutic/static/bundled/eboutic/eboutic-index.ts b/eboutic/static/bundled/eboutic/eboutic-index.ts index f31e5088..56597387 100644 --- a/eboutic/static/bundled/eboutic/eboutic-index.ts +++ b/eboutic/static/bundled/eboutic/eboutic-index.ts @@ -9,7 +9,7 @@ interface BasketItem { } document.addEventListener("alpine:init", () => { - Alpine.data("basket", () => ({ + Alpine.data("basket", (lastPurchaseTime?: number) => ({ basket: [] as BasketItem[], init() { @@ -18,6 +18,16 @@ document.addEventListener("alpine:init", () => { this.saveBasket(); }); + // Invalidate basket if a purchase was made + if (lastPurchaseTime !== null && localStorage.basketTimestamp !== undefined) { + if ( + new Date(lastPurchaseTime) >= + new Date(Number.parseInt(localStorage.basketTimestamp)) + ) { + this.basket = []; + } + } + // It's quite tricky to manually apply attributes to the management part // of a formset so we dynamically apply it here this.$refs.basketManagementForm @@ -38,6 +48,7 @@ document.addEventListener("alpine:init", () => { saveBasket() { localStorage.basket = JSON.stringify(this.basket); + localStorage.basketTimestamp = Date.now(); }, /** diff --git a/eboutic/templates/eboutic/eboutic_main.jinja b/eboutic/templates/eboutic/eboutic_main.jinja index 826e78e3..bca15fa2 100644 --- a/eboutic/templates/eboutic/eboutic_main.jinja +++ b/eboutic/templates/eboutic/eboutic_main.jinja @@ -21,7 +21,7 @@ {% block content %}

{% trans %}Eboutic{% endtrans %}

-
+

Panier

diff --git a/eboutic/views.py b/eboutic/views.py index 40ff7255..8abd9ea2 100644 --- a/eboutic/views.py +++ b/eboutic/views.py @@ -48,7 +48,7 @@ from django_countries.fields import Country from core.auth.mixins import CanViewMixin, IsSubscriberMixin from core.views.mixins import FragmentMixin, UseFragmentsMixin from counter.forms import BaseBasketForm, BillingInfoForm, ProductForm -from counter.models import BillingInfo, Counter, Customer, Product +from counter.models import BillingInfo, Counter, Customer, Product, Selling from eboutic.models import ( Basket, BasketItem, @@ -89,7 +89,7 @@ class EbouticMainView(LoginRequiredMixin, FormView): def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs["form_kwargs"] = { - "customer": Customer.get_or_create(self.request.user)[0], + "customer": self.customer, "counter": Counter.objects.get(type="EBOUTIC"), "allowed_products": {product.id: product for product in self.products}, } @@ -116,10 +116,22 @@ class EbouticMainView(LoginRequiredMixin, FormView): def products(self) -> list[Product]: return get_eboutic_products(self.request.user) + @cached_property + def customer(self) -> Customer: + return Customer.get_or_create(self.request.user)[0] + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["products"] = self.products context["customer_amount"] = self.request.user.account_balance + last_purchase: Selling | None = ( + self.customer.buyings.filter(counter__type="EBOUTIC") + .order_by("-date") + .first() + ) + context["last_purchase_time"] = ( + int(last_purchase.date.timestamp() * 1000) if last_purchase else "null" + ) return context