# -*- coding: utf-8 -*- import logging from django.views.decorators.csrf import csrf_protect from django.core.paginator import Paginator, InvalidPage from django.shortcuts import render, redirect, get_object_or_404 from django.conf import settings from project.teasers.models import get_teasers_for_path from .models import Category, Entry from .forms import EntryForm from .emails import mail_entry PAGINATE_BY = getattr(settings, 'GUESTBOOK_PAGINATE_BY', 25) log = logging.getLogger('guestbook') @csrf_protect def index(request): form = None if request.method == 'POST': form = EntryForm(data=request.POST) if form.is_valid(): entry = form.save() try: mail_entry(entry) # уведомить по почте except Exception as e: log.exception(e) return redirect('guestbook-thanks') # если у записи не указана дата публикации, то учитывается дата создания list_qry = (Entry.objects.filter(published=True) .extra(select={'ordering_date': 'CASE WHEN pub_date IS NOT NULL THEN pub_date ELSE created_at END'}) .order_by('-ordering_date') ) paginator = Paginator(list_qry, PAGINATE_BY) try: page_num = int(request.GET.get('page', 1)) page = paginator.page(page_num) except (ValueError, InvalidPage) as e: page_num = 1 page = paginator.page(1) teasers = get_teasers_for_path(request.path + u'?page=%s' % page_num) return render(request, 'guestbook/object_list.html', { 'paginator': paginator, 'page': page, 'form': form or EntryForm(), 'teasers': teasers, }) def category_list(request, slug): """Вопросы-ответы внутри категории.""" category = get_object_or_404(Category, slug__iexact=slug) # если у записи не указана дата публикации, то учитывается дата создания list_qry = (Entry.objects.filter(category=category, published=True) .extra(select={'ordering_date': 'CASE WHEN pub_date IS NOT NULL THEN pub_date ELSE created_at END'}) .order_by('-ordering_date') ) paginator = Paginator(list_qry, PAGINATE_BY) try: page_num = int(request.GET.get('page', 1)) page = paginator.page(page_num) except (ValueError, InvalidPage) as e: page_num = 1 page = paginator.page(1) teasers = get_teasers_for_path(request.path + u'?page=%s' % page_num) return render(request, 'guestbook/category_list.html', { 'paginator': paginator, 'page': page, 'category': category, 'teasers': teasers, }) def thanks(request): teasers = get_teasers_for_path(request.path) return render(request, 'guestbook/thanks.html', {'teasers': teasers})