django-simplecms/cms/views.py

116 wiersze
3.8 KiB
Python
Czysty Zwykły widok Historia

2019-08-23 15:19:40 +00:00
from django.urls import reverse
from django.shortcuts import redirect
2019-03-27 15:49:14 +00:00
from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import DetailView, UpdateView, CreateView
2019-08-23 15:19:40 +00:00
from .models import Page, Section, SubSection
from .forms import PageForm, SectionFormSet, SectionForm, SubSectionFormSet, SubSectionForm
from .utils import get_config
2019-03-27 15:49:14 +00:00
class StaffRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff
class MenuMixin(object):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pages = Page.objects.filter(menu=True)
footer = get_config(10)
context.update({
'pages': pages,
'footer': footer,
})
return context
2019-08-25 21:36:58 +00:00
class MemoryMixin(object):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
request.session['previous_url'] = request.path
return super().dispatch(request, *args, **kwargs)
class PageView(MenuMixin, MemoryMixin, DetailView):
2019-03-27 15:49:14 +00:00
model = Page
template_name = 'cms/page.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
page = self.object
sections = page.sections.all()
context.update({
'page': page,
'sections': sections,
})
return context
2019-08-26 07:47:52 +00:00
class CreatePage(StaffRequiredMixin, MenuMixin, CreateView):
model = Page
form_class = PageForm
template_name = 'cms/new.html'
2019-08-26 07:47:52 +00:00
class CreateSection(StaffRequiredMixin, MenuMixin, CreateView):
2019-08-23 15:19:40 +00:00
model = Section
form_class = SectionForm
template_name = 'cms/new.html'
def form_valid(self, form):
form.instance.page = Page.objects.get(pk=self.kwargs.get('pk'))
form.save()
2019-08-25 21:36:58 +00:00
return redirect(self.request.session.get('previous_url'))
2019-08-23 15:19:40 +00:00
2019-08-26 07:47:52 +00:00
class CreateSubSection(StaffRequiredMixin, MenuMixin, CreateView):
2019-08-23 15:19:40 +00:00
model = SubSection
form_class = SubSectionForm
template_name = 'cms/new.html'
def form_valid(self, form):
form.instance.section = Section.objects.get(pk=self.kwargs.get('pk'))
form.save()
2019-08-25 21:36:58 +00:00
return redirect(self.request.session.get('previous_url'))
2019-08-23 15:19:40 +00:00
2019-08-26 07:47:52 +00:00
class BaseUpdateView(StaffRequiredMixin, MenuMixin, UpdateView):
2019-03-27 15:49:14 +00:00
template_name = 'cms/edit.html'
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
2019-08-23 15:19:40 +00:00
formset = self.formset_class(request.POST, request.FILES, instance=self.object)
2019-03-27 15:49:14 +00:00
if form.is_valid() and formset.is_valid():
return self.form_valid(form, formset)
else:
return self.form_invalid(form, formset)
def form_valid(self, form, formset):
form.save()
formset.save()
2019-08-25 21:36:58 +00:00
return redirect(self.request.session.get('previous_url'))
2019-03-27 15:49:14 +00:00
def form_invalid(self, form, formset):
return self.render_to_response(self.get_context_data(form=form, formset=formset))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if 'formset' not in context:
2019-08-23 15:19:40 +00:00
formset = self.formset_class(instance=self.object)
2019-03-27 15:49:14 +00:00
context.update({
'formset': formset,
2019-08-23 15:19:40 +00:00
'formset_form_url': self.get_formset_form_url(self.object),
2019-08-26 07:47:52 +00:00
'formset_description': self.formset_class.model._meta.verbose_name,
2019-03-27 15:49:14 +00:00
})
return context
2019-08-23 15:19:40 +00:00
class UpdatePage(BaseUpdateView):
model = Page
form_class = PageForm
formset_class = SectionFormSet
def get_formset_form_url(self, page):
return reverse('cms:createsection', args=[page.pk])
class UpdateSection(BaseUpdateView):
model = Section
form_class = SectionForm
formset_class = SubSectionFormSet
def get_formset_form_url(self, page):
return reverse('cms:createsubsection', args=[page.pk])