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