Source code for 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
[docs]class ProductListView(FilterView):
model = Product
filterset_class = ProductFilter
template_name_suffix = '_list'
paginate_by = 20
[docs]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
[docs] def get_url_release_formset(self):
return self._get_formset(URLReleaseFormSet,
prefix='url_releases')
[docs] def get_package_release_formset(self):
return self._get_formset(PackageReleaseFormSet,
prefix='package_releases')
[docs] def get_screenshot_formset(self):
return self._get_formset(ScreenshotFormSet,
prefix='screenshots')
[docs] 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,
))
[docs] 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,
)
[docs] 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())
[docs] 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,
))
[docs] 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')
[docs]class ProductCreateView(ProductFormMixin, CreateView):
model = Product
form_class = ProductCreateForm
[docs] 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
[docs] 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
[docs] def get(self, request, *args, **kwargs):
self.object = None
return super().get(request, *args, **kwargs)
[docs] def post(self, request, *args, **kwargs):
self.object = None
return super().post(request, *args, **kwargs)
[docs] def get_success_message(self, cleaned_data):
return _("""A product '%(title)s' was successfully created.""") % {
'title': cleaned_data['title']
}
@permission_required('products.change_product')
[docs]class ProductUpdateView(ProductFormMixin, UpdateView):
model = Product
form_class = ProductUpdateForm
[docs] def get(self, request, *args, **kwargs):
self.object = self.get_object()
return super().get(request, *args, **kwargs)
[docs] def post(self, request, *args, **kwargs):
self.object = self.get_object()
return super().post(request, *args, **kwargs)
[docs] def get_success_message(self, cleaned_data):
return _("""The product '%(title)s' was successfully updated.""") % {
'title': cleaned_data['title']
}
@permission_required('products.delete_product')
[docs]class ProductDeleteView(DeleteSuccessMessageMixin, DeleteView):
model = Product
success_url = reverse_lazy('products_product_list')
[docs]class ProductPreviewView(SingleObjectPreviewViewMixin, DetailView):
model = Product
template_name = "products/components/product_detail.html"
[docs]class URLReleaseDetailView(DetailView):
model = URLRelease
[docs] def get(self, request, *args, **kwargs):
self.object = self.get_object()
# ページビューを加算してURLへ飛ばす
self.object.pageview += 1
self.object.save()
return HttpResponseRedirect(self.object.url)
[docs]class PackageReleaseDetailView(DetailView):
model = PackageRelease
[docs] 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()