diff --git a/src/articles/tests/test_html_views.py b/src/articles/tests/test_html_views.py index 1ece30f..415b053 100644 --- a/src/articles/tests/test_html_views.py +++ b/src/articles/tests/test_html_views.py @@ -52,6 +52,7 @@ def _assert_article_is_rendered(item: Article, res: HttpResponse) -> None: assert item.title in content html = item.get_formatted_content assert html in content + assert "Last-Modified" in res.headers @pytest.mark.django_db() diff --git a/src/articles/views/html/single_article.py b/src/articles/views/html/single_article.py index 7b2d104..e1bb409 100644 --- a/src/articles/views/html/single_article.py +++ b/src/articles/views/html/single_article.py @@ -1,10 +1,24 @@ +import datetime + from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import last_modified from articles.models import Article +def get_article_last_modified(request: WSGIRequest, slug: str) -> datetime.datetime: + key = request.GET.get("draft_key") + qs = Article.objects.all().only("updated_at") + if key: + return get_object_or_404(qs, draft_key=key, slug=slug).updated_at + if not request.user.is_authenticated: + qs = qs.filter(status=Article.PUBLISHED) + return get_object_or_404(qs, slug=slug).updated_at + + +@last_modified(get_article_last_modified) def view_article(request: WSGIRequest, slug: str) -> HttpResponse: article = get_article(request, slug) if not request.user.is_authenticated: