Source code for kawaz.apps.blogs.views

from django.views.generic import UpdateView
from django.views.generic import CreateView
from django.views.generic import DeleteView
from django.views.generic import DetailView
from django.views.generic import ListView
from django.views.generic import TodayArchiveView
from django.views.generic import DayArchiveView
from django.views.generic import MonthArchiveView
from django.views.generic import YearArchiveView
from django.views.generic.dates import MultipleObjectMixin
from django.core.urlresolvers import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext as _
from permission.decorators import permission_required
from kawaz.core.views.preview import SingleObjectPreviewViewMixin
from kawaz.core.personas.models import Persona
from kawaz.core.views.delete import DeleteSuccessMessageMixin

from .forms import EntryForm
from .models import Entry, Category


[docs]class EntryMultipleObjectMixin(MultipleObjectMixin): """ アクセスしたユーザーにより閲覧可能な記事を指定するためのMixin """ paginate_by = 5
[docs] def get_queryset(self): return Entry.objects.published(self.request.user)
@permission_required('blogs.view_entry')
[docs]class EntryListView(ListView, EntryMultipleObjectMixin): model = Entry
@permission_required('blogs.view_entry')
[docs]class EntryDetailView(DetailView): model = Entry
@permission_required('blogs.add_entry')
[docs]class EntryCreateView(SuccessMessageMixin, CreateView): model = Entry form_class = EntryForm
[docs] def get_form(self, form_class=EntryForm): # Model.cleanでValidationを行うために # ここで作者を設定している # 議論参照 # https://github.com/kawazrepos/Kawaz3rd/pull/134 form = super().get_form(form_class) # 記事の作成者を自動的に指定 form.instance.author = self.request.user return form
[docs] def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user return kwargs
[docs] def get_success_message(self, cleaned_data): return _("""A blog entry '%(title)s' was successfully created.""") % { 'title': cleaned_data['title'] }
@permission_required('blogs.change_entry')
[docs]class EntryUpdateView(SuccessMessageMixin, UpdateView): model = Entry form_class = EntryForm
[docs] def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user return kwargs
[docs] def get_success_message(self, cleaned_data): return _("""The blog entry '%(title)s' was successfully updated.""") % { 'title': cleaned_data['title'] }
@permission_required('blogs.delete_entry')
[docs]class EntryDeleteView(DeleteSuccessMessageMixin, DeleteView): model = Entry success_url = reverse_lazy('blogs_entry_list')
[docs] def get_success_message(self): return _("The blog entry was successfully deleted.")
[docs]class EntryTodayArchiveView(TodayArchiveView, EntryMultipleObjectMixin): model = Entry date_field = 'published_at'
[docs]class EntryDayArchiveView(DayArchiveView, EntryMultipleObjectMixin): model = Entry date_field = 'published_at' month_format = '%m'
[docs]class EntryMonthArchiveView(MonthArchiveView, EntryMultipleObjectMixin): model = Entry date_field = 'published_at' month_format = '%m'
[docs]class EntryYearArchiveView(YearArchiveView, EntryMultipleObjectMixin): model = Entry date_field = 'published_at' # paginatorを有効にするとき、allow_empty=Trueが必要 # http://stackoverflow.com/questions/8624507/django-paginate-by-year allow_empty = True
[docs]class EntryAuthorMixin(EntryMultipleObjectMixin): """ 特定ユーザーが執筆した記事に限定して閲覧するためのMixin """
[docs] def get_queryset(self): # urlにて渡されたユーザーの名前を取得 # | get('author')だとバグにより urlpattern に author が指定されていない # | 場合は None が帰るためバグに気が付きにくい。 # | したがって敢えて kwargs['author'] と指定している username = self.kwargs['author'] # 名前からインスタンスを指定、存在しない場合は強制404 self.author = get_object_or_404(Persona, username=username) # 著者でQuerySetを更に絞る return super().get_queryset().filter(author=self.author)
[docs] def get_context_data(self, **kwargs): # ユーザーをコンテキストに入れておく data = super().get_context_data(**kwargs) data['author'] = self.author return data
[docs]class EntryAuthorListView(EntryListView, EntryAuthorMixin): pass
[docs]class EntryAuthorTodayArchiveView(EntryTodayArchiveView, EntryAuthorMixin): pass
[docs]class EntryAuthorDayArchiveView(EntryDayArchiveView, EntryAuthorMixin): pass
[docs]class EntryAuthorMonthArchiveView(EntryMonthArchiveView, EntryAuthorMixin): pass
[docs]class EntryAuthorYearArchiveView(EntryYearArchiveView, EntryAuthorMixin): pass
[docs]class EntryPreviewView(SingleObjectPreviewViewMixin, DetailView): model = Entry template_name = "blogs/components/entry_detail.html"
[docs]class EntryCategoryListView(EntryAuthorMixin, ListView): template_name = 'blogs/entry_list.html'
[docs] def get_queryset(self): qs = super().get_queryset() author = self.kwargs.get('author', None) category = self.kwargs.get('pk', None) return qs.filter(category__author__username=author, category__pk=int(category))
[docs] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) category_pk = self.kwargs.get('pk', None) context['category'] = Category.objects.get(pk=int(category_pk)) return context