diff --git a/src/purchase/admin.py b/src/purchase/admin.py index a25c379..308c300 100644 --- a/src/purchase/admin.py +++ b/src/purchase/admin.py @@ -3,7 +3,7 @@ from django.contrib.admin import register from django.utils.translation import gettext_lazy as _ from solo.admin import SingletonModelAdmin -from purchase.models import Basket, BasketItem, CacheEtag, PaymentMethod, Product +from purchase.models import Basket, BasketItem, Cache, PaymentMethod, Product from purchase.templatetags.purchase import currency @@ -73,4 +73,4 @@ class BasketAdmin(admin.ModelAdmin): return currency(instance.price) -admin.site.register(CacheEtag, SingletonModelAdmin) +admin.site.register(Cache, SingletonModelAdmin) diff --git a/src/purchase/migrations/0011_rename_cacheetag_cache.py b/src/purchase/migrations/0011_rename_cacheetag_cache.py new file mode 100644 index 0000000..bec44ef --- /dev/null +++ b/src/purchase/migrations/0011_rename_cacheetag_cache.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.1 on 2022-09-25 19:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("purchase", "0010_rename_basketitemetag_cacheetag"), + ] + + operations = [ + migrations.RenameModel( + old_name="CacheEtag", + new_name="Cache", + ), + ] diff --git a/src/purchase/migrations/0012_rename_value_cache_etag_cache_last_modified.py b/src/purchase/migrations/0012_rename_value_cache_etag_cache_last_modified.py new file mode 100644 index 0000000..c544ccf --- /dev/null +++ b/src/purchase/migrations/0012_rename_value_cache_etag_cache_last_modified.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.1 on 2022-09-25 19:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("purchase", "0011_rename_cacheetag_cache"), + ] + + operations = [ + migrations.RenameField( + model_name="cache", + old_name="value", + new_name="etag", + ), + migrations.AddField( + model_name="cache", + name="last_modified", + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/src/purchase/models.py b/src/purchase/models.py index 4400290..a3b0d46 100644 --- a/src/purchase/models.py +++ b/src/purchase/models.py @@ -224,12 +224,21 @@ class BasketItem(Model): ] -class CacheEtag(SingletonModel): - value = models.UUIDField(default=uuid.uuid4) +class Cache(SingletonModel): + etag = models.UUIDField(default=uuid.uuid4) + last_modified = models.DateTimeField(auto_now=True) def __str__(self) -> str: - return str(self.value) + return str(self.etag) def refresh(self): - self.value = uuid.uuid4() + self.etag = uuid.uuid4() self.save() + + +def reports_etag(request): + return str(Cache.get_solo().etag) + + +def reports_last_modified(request): + return Cache.get_solo().last_modified diff --git a/src/purchase/signals.py b/src/purchase/signals.py index b3ed4e6..68e181d 100644 --- a/src/purchase/signals.py +++ b/src/purchase/signals.py @@ -1,4 +1,4 @@ def basket_item_on_save(sender, **kwargs): - from purchase.models import CacheEtag + from purchase.models import Cache - CacheEtag.get_solo().refresh() + Cache.get_solo().refresh() diff --git a/src/purchase/views/basket.py b/src/purchase/views/basket.py index f44dbf8..fa112df 100644 --- a/src/purchase/views/basket.py +++ b/src/purchase/views/basket.py @@ -8,8 +8,7 @@ from django.utils.translation import gettext_lazy as _ from django.views.decorators.http import condition, require_http_methods from purchase.forms import BasketForm -from purchase.models import Basket -from purchase.views.reports import reports_etag +from purchase.models import Basket, reports_etag, reports_last_modified @require_http_methods(["GET", "POST"]) @@ -50,7 +49,7 @@ def update_basket(request: HttpRequest, pk: int) -> HttpResponse: @permission_required("purchase.view_basket") -@condition(etag_func=reports_etag) +@condition(etag_func=reports_etag, last_modified_func=reports_last_modified) def list_baskets(request: HttpRequest) -> HttpResponse: context = {"baskets": Basket.objects.priced().order_by("-id")} return TemplateResponse(request, "purchase/basket_list.html", context) diff --git a/src/purchase/views/reports.py b/src/purchase/views/reports.py index 58c4e51..8ee5f41 100644 --- a/src/purchase/views/reports.py +++ b/src/purchase/views/reports.py @@ -18,17 +18,20 @@ from matplotlib.container import BarContainer from matplotlib.dates import AutoDateLocator, ConciseDateFormatter, HourLocator from matplotlib.figure import Figure -from purchase.models import Basket, CacheEtag, PaymentMethod, Product, ProductQuerySet +from purchase.models import ( + Basket, + PaymentMethod, + Product, + ProductQuerySet, + reports_etag, + reports_last_modified, +) matplotlib.use("SVG") -def reports_etag(request): - return str(CacheEtag.get_solo().value) - - @permission_required("purchase.view_basket") -@condition(etag_func=reports_etag) +@condition(etag_func=reports_etag, last_modified_func=reports_last_modified) def products_plots_view(request): products = Product.objects.with_turnover().with_sold() ( @@ -43,7 +46,7 @@ def products_plots_view(request): @permission_required("purchase.view_basket") -@condition(etag_func=reports_etag) +@condition(etag_func=reports_etag, last_modified_func=reports_last_modified) def by_hour_plot_view(request): baskets = list(Basket.objects.priced().order_by("created_at")) context = { @@ -53,7 +56,7 @@ def by_hour_plot_view(request): @permission_required("purchase.view_basket") -@condition(etag_func=reports_etag) +@condition(etag_func=reports_etag, last_modified_func=reports_last_modified) def reports(request): template_name = "purchase/reports.html" baskets = list(Basket.objects.priced().order_by("created_at"))