kawaz.apps.products.views のソースコード

import os
from django.http import (HttpResponse,
                         HttpResponseRedirect,
                         HttpResponseNotFound)
from django.views.generic import CreateView
from django.views.generic import UpdateView
from django.views.generic import DetailView
from django.views.generic import DeleteView
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext as _
from django_filters.views import FilterView
from permission.decorators import permission_required
from kawaz.core.views.delete import DeleteSuccessMessageMixin
from kawaz.core.views.preview import SingleObjectPreviewViewMixin
from .forms import ProductCreateForm, ProductUpdateForm
from .forms import PackageReleaseFormSet, URLReleaseFormSet, ScreenshotFormSet
from .models import Product
from .models import PackageRelease, URLRelease
from .filters import ProductFilter


[ドキュメント]class ProductListView(FilterView): model = Product filterset_class = ProductFilter template_name_suffix = '_list' paginate_by = 20
[ドキュメント]class ProductDetailView(DetailView): model = Product
[ドキュメント]class ProductFormMixin(SuccessMessageMixin): def _get_formset(self, formset_class, **kwargs): if self.request.method in ('PUT', 'POST'): kwargs.update({ 'data': self.request.POST, 'files': self.request.FILES, }) if hasattr(self, 'object'): kwargs.update({ 'instance': self.object, }) formset = formset_class(**kwargs) return formset
[ドキュメント] def get_url_release_formset(self): return self._get_formset(URLReleaseFormSet, prefix='url_releases')
[ドキュメント] def get_package_release_formset(self): return self._get_formset(PackageReleaseFormSet, prefix='package_releases')
[ドキュメント] def get_screenshot_formset(self): return self._get_formset(ScreenshotFormSet, prefix='screenshots')
[ドキュメント] def get(self, request, *args, **kwargs): form_class = self.get_form_class() form = self.get_form(form_class) # formsets url_release_formset = self.get_url_release_formset() package_release_formset = self.get_package_release_formset() screenshot_formset = self.get_screenshot_formset() return self.render_to_response(self.get_context_data( form=form, url_release_formset=url_release_formset, package_release_formset=package_release_formset, screenshot_formset=screenshot_formset, ))
[ドキュメント] def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = self.get_form(form_class) # formsets url_release_formset = self.get_url_release_formset() package_release_formset = self.get_package_release_formset() screenshot_formset = self.get_screenshot_formset() if (form.is_valid() and url_release_formset.is_valid() and package_release_formset.is_valid() and screenshot_formset.is_valid()): return self.form_valid( form, url_release_formset, package_release_formset, screenshot_formset, ) else: return self.form_invalid( form, url_release_formset, package_release_formset, screenshot_formset, )
[ドキュメント] def form_valid(self, form, url_release_formset, package_release_formset, screenshot_formset): form.instance.last_modifier = self.request.user self.object = form.save() success_message = self.get_success_message(form.cleaned_data) if success_message: messages.success(self.request, success_message) # assign instance to all formsets formsets = (url_release_formset, package_release_formset, screenshot_formset) for formset in formsets: instances = formset.save(commit=False) for instance in instances: instance.product = self.object instance.save() # 削除にチェックされたオブジェクトを削除 for instance in formset.deleted_objects: instance.delete() return HttpResponseRedirect(self.get_success_url())
[ドキュメント] def form_invalid(self, form, url_release_formset, package_release_formset, screenshot_formset): return self.render_to_response(self.get_context_data( form=form, url_release_formset=url_release_formset, package_release_formset=package_release_formset, screenshot_formset=screenshot_formset, ))
[ドキュメント] def get_form_kwargs(self): kwargs = super().get_form_kwargs() if 'project' in self.request.GET: # ?project=<pk>を指定すると、それが初期状態になる default_project = self.request.GET['project'] pk = int(default_project) kwargs.update({'initial': {'project': pk}}) return kwargs
@permission_required('products.add_product')
[ドキュメント]class ProductCreateView(ProductFormMixin, CreateView): model = Product form_class = ProductCreateForm
[ドキュメント] def get_form(self, form_class=ProductCreateForm): form = super().get_form(form_class) # Contact Infoの初期値としてニックネームとメールアドレスを入れている user = getattr(self.request, 'user') contact_info = "{}: {}".format(user.nickname, user.email) form.fields['contact_info'].initial = contact_info return form
[ドキュメント] def form_valid(self, *args, **kwargs): response = super().form_valid(*args, **kwargs) if self.object: # 作成に成功した場合は作成したユーザーを自動的に管理者に加える # # Note: # これはManyToManyRelationになるためinstanceが存在しないと # 行えない。したがってまずインスタンスの生成を行なっている # self.object は親の form_valid で設定される # self.object.join(self.request.user) return response
[ドキュメント] def get(self, request, *args, **kwargs): self.object = None return super().get(request, *args, **kwargs)
[ドキュメント] def post(self, request, *args, **kwargs): self.object = None return super().post(request, *args, **kwargs)
[ドキュメント] def get_success_message(self, cleaned_data): return _("""A product '%(title)s' was successfully created.""") % { 'title': cleaned_data['title'] }
@permission_required('products.change_product')
[ドキュメント]class ProductUpdateView(ProductFormMixin, UpdateView): model = Product form_class = ProductUpdateForm
[ドキュメント] def get(self, request, *args, **kwargs): self.object = self.get_object() return super().get(request, *args, **kwargs)
[ドキュメント] def post(self, request, *args, **kwargs): self.object = self.get_object() return super().post(request, *args, **kwargs)
[ドキュメント] def get_success_message(self, cleaned_data): return _("""The product '%(title)s' was successfully updated.""") % { 'title': cleaned_data['title'] }
@permission_required('products.delete_product')
[ドキュメント]class ProductDeleteView(DeleteSuccessMessageMixin, DeleteView): model = Product success_url = reverse_lazy('products_product_list')
[ドキュメント] def get_success_message(self): return _("The product was successfully deleted.")
[ドキュメント]class ProductPreviewView(SingleObjectPreviewViewMixin, DetailView): model = Product template_name = "products/components/product_detail.html"
[ドキュメント]class URLReleaseDetailView(DetailView): model = URLRelease
[ドキュメント] def get(self, request, *args, **kwargs): self.object = self.get_object() # ページビューを加算してURLへ飛ばす self.object.pageview += 1 self.object.save() return HttpResponseRedirect(self.object.url)
[ドキュメント]class PackageReleaseDetailView(DetailView): model = PackageRelease
[ドキュメント] def get(self, request, *args, **kwargs): self.object = self.get_object() try: name = self.object.filename path = self.object.file_content.path mimetype = self.object.mimetype f = open(path, 'rb') response = HttpResponse(f.read(), content_type=mimetype) response['Content-Length'] = os.fstat(f.fileno()).st_size response['Content-Disposition'] = ( 'attachment; filename={}'.format(name) ) # ダウンロードを加算する self.object.downloads += 1 self.object.save() return response except FileNotFoundError: # DBにゴミレコードが残っている場合レコードを削除 self.object.delete() return HttpResponseNotFound()