from django.views import generic
from django.shortcuts import redirect, get_object_or_404
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse, reverse_lazy
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.contrib import messages
from cycle_storage.models import Bicycle, Storage, Place
from cycle_storage.forms import BicycleCreateForm
[docs]class BicycleDetail(generic.DetailView):
model = Bicycle
[docs]def has_bike(user):
return user.is_authenticated() and Bicycle.objects.filter(owner=user).count() > 0
@method_decorator(login_required, name="dispatch")
[docs]class MyBicycleDetail(generic.DetailView):
model = Bicycle
template = "bicycle/bicycle_detail.html"
[docs] def dispatch(self, request, *args, **kwargs):
if not has_bike(request.user):
return redirect('bicycle:bicycle_create')
else:
return super(MyBicycleDetail, self).dispatch(request, *args, **kwargs)
[docs] def get_object(self):
return get_object_or_404(Bicycle, owner=self.request.user)
@method_decorator(login_required, name="dispatch")
[docs]class BicycleCreate(generic.CreateView):
model = Bicycle
form_class = BicycleCreateForm
success_url = reverse_lazy('bicycle:bicycle_my')
[docs] def dispatch(self, request, *args, **kwargs):
if has_bike(request.user):
messages.add_message(self.request, messages.ERROR, "Вы уже зарегистрировали велосипед в системе.")
return redirect('bicycle:bicycle_my')
else:
return super(BicycleCreate, self).dispatch(request, *args, **kwargs)
@method_decorator(login_required, name='dispatch')
[docs]class BicycleUpdate(generic.UpdateView):
model = Bicycle
form_class = BicycleCreateForm
success_url = reverse_lazy('bicycle:bicycle_my')
[docs] def dispatch(self, request, *args, **kwargs):
bicycle = get_object_or_404(Bicycle, pk=self.kwargs['pk'])
if bicycle.owner != request.user:
raise PermissionDenied
if bicycle.request_status not in [Bicycle.WAITING]:
messages.add_message(self.request, messages.ERROR,
"Заявление уже рассмотрено, Вы не можете изменить его")
return redirect(reverse_lazy('bicycle:bicycle_my'))
return super(BicycleUpdate, self).dispatch(request, *args, **kwargs)
@method_decorator(login_required, name='dispatch')
[docs]class BicycleDelete(generic.DeleteView):
model = Bicycle
success_url = reverse_lazy('bicycle:index')
[docs] def dispatch(self, request, *args, **kwargs):
bicycle = get_object_or_404(Bicycle, pk=self.kwargs['pk'])
if bicycle.owner != request.user:
# messages.add_message(self.request, messages.ERROR, "Вы не можете удалить чужое заявление")
raise PermissionDenied
messages.add_message(self.request, messages.SUCCESS, "Заявление успешно удалено")
return super(BicycleDelete, self).dispatch(request, *args, **kwargs)