Source code for lotus.views.article

from django.conf import settings
from django.http import Http404, HttpResponseForbidden
from django.views.generic import DetailView, ListView
from django.utils.translation import gettext_lazy as _
from django.urls import reverse

from ..models import Article
from .mixins import (
    ArticleFilterAbstractView,
)

try:
    from view_breadcrumbs import BaseBreadcrumbMixin
except ImportError:
    from .mixins import NoOperationBreadcrumMixin as BaseBreadcrumbMixin


[docs] class ArticleIndexView(BaseBreadcrumbMixin, ArticleFilterAbstractView, ListView): """ Paginated list of articles. """ model = Article template_name = "lotus/article/list.html" paginate_by = settings.LOTUS_ARTICLE_PAGINATION context_object_name = "article_list" crumb_title = settings.LOTUS_CRUMBS_TITLES["article-index"] crumb_urlname = "lotus:article-index" lotus_stage = "articles" @property def crumbs(self): return [ (self.crumb_title, reverse(self.crumb_urlname)), ]
[docs] def get_queryset(self): q = self.apply_article_lookups(self.model.objects, self.get_language_code()) return q.order_by(*self.model.COMMON_ORDER_BY)
[docs] class ArticleDetailView(BaseBreadcrumbMixin, ArticleFilterAbstractView, DetailView): """ Article detail. """ model = Article pk_url_kwarg = "article_pk" template_name = "lotus/article/detail.html" context_object_name = "article_object" crumb_title = None # No usage since title depends from object crumb_urlname = "lotus:article-detail" lotus_stage = "articles" @property def crumbs(self): details_kwargs = { "year": self.object.publish_date.year, "month": self.object.publish_date.month, "day": self.object.publish_date.day, "slug": self.object.slug, } return [ (ArticleIndexView.crumb_title, reverse( ArticleIndexView.crumb_urlname )), (self.object.title, reverse(self.crumb_urlname, kwargs=details_kwargs)), ]
[docs] def get_queryset(self): """ Get the base queryset which may include the basic publication filter depending preview mode. Preview mode is enabled from a flag in session and only for staff user. If it is disabled publication criterias are applied on lookups. Also apply lookup against "preview" mode. """ q = self.apply_article_lookups(self.model.objects, self.get_language_code()) return q
[docs] def get_object(self, queryset=None): """ Apply the right filters to get the article object. """ # Use a custom queryset if provided if queryset is None: queryset = self.get_queryset() # Add proper filters to get object respecting URL arguments q_kwargs = { "publish_date__year": self.kwargs.get("year"), "publish_date__month": self.kwargs.get("month"), "publish_date__day": self.kwargs.get("day"), "slug": self.kwargs.get("slug"), } queryset = queryset.filter(**q_kwargs) # Try to get article object from given lookups try: obj = queryset.get() except queryset.model.DoesNotExist: raise Http404(_("No %(verbose_name)s found matching the query") % {'verbose_name': queryset.model._meta.verbose_name}) return obj
[docs] class PreviewArticleDetailView(ArticleDetailView): """ TODO: Should force set the context var for preview mode at True without to tamper session so the user session is still in its current state but it can preview. """
[docs] def allowed_preview_mode(self, request): """ Force preview mode for querysets. """ return True
[docs] def get_context_data(self, **kwargs): """ Force preview mode in context (without tampering preview mode in session). TODO: Control user staff right to use this """ context = super().get_context_data(**kwargs) context[settings.LOTUS_PREVIEW_VARNAME] = True return context
[docs] def get(self, request, *args, **kwargs): """ Ensure that user is allowed to use this view. """ if not self.request.user.is_staff: return HttpResponseForbidden("You are not allowed to be here.") return super().get(request, *args, **kwargs)