Source code for shuup.simple_cms.views

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from django.http import Http404
from django.http.response import HttpResponseRedirect
from django.utils.translation import get_language
from django.views.generic.detail import DetailView

from shuup.simple_cms.models import Page
from shuup.utils.django_compat import reverse


[docs]class PageView(DetailView): model = Page slug_field = "translations__url" slug_url_kwarg = "url" template_name = "shuup/simple_cms/page.jinja" context_object_name = "page"
[docs] def get(self, request, *args, **kwargs): """ Override normal get method to return correct page based on the active language and slug Cases: 1. Page is not found: `raise Http404()` like django would. 2. No translation in active language for the page: `raise Http404()`. 3. Translation was found for active language, but the url doesn't match given url: `return HttpResponseRedirect` to the active languages url. 4. If none of the upper matches: render page normally. """ # get currently active language self.object = self.get_object() # set the chosen template if not self.object.has_translation(get_language()): # Page hasn't been translated into the current language; that's always a 404 raise Http404() self.object.set_current_language(get_language()) if self.object.url != self.kwargs[self.slug_url_kwarg]: # Wrong URL, hm! return HttpResponseRedirect(reverse("shuup:cms_page", kwargs={"url": self.object.url})) context = self.get_context_data(object=self.object) return self.render_to_response(context)
[docs] def get_template_names(self): object = self.get_object() return [object.template_name]
[docs] def get_queryset(self): if getattr(self.request.user, "is_superuser", False): # Superusers may see all pages despite their visibility status return self.model.objects.for_shop(self.request.shop).filter(deleted=False) return self.model.objects.visible(self.request.shop, user=self.request.user)