Source code for shoop.simple_cms.views
# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
from django.core.urlresolvers import reverse
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 shoop.simple_cms.models import Page
[docs]class PageView(DetailView):
model = Page
slug_field = "translations__url"
slug_url_kwarg = "url"
template_name = "shoop/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()
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('shoop:cms_page', kwargs={"url": self.object.url}))
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
[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.all()
return self.model.objects.visible()