You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

94 lines
2.9 KiB

# -*- 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})