from django.views.generic import DetailView, ListView, DeleteView
from django.views.generic.edit import FormMixin, ModelFormMixin, BaseCreateView, BaseUpdateView, ProcessFormView, BaseFormView
from django.views.generic.base import TemplateResponseMixin, View
from django.views.generic.detail import SingleObjectTemplateResponseMixin, SingleObjectMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse, reverse_lazy
from django.shortcuts import get_object_or_404, redirect
from django.utils import timezone
from django.utils.decorators import method_decorator
from sendfile import sendfile
import os
import logging
from polls.views import make_win_csv
from core.settings import MEDIA_ROOT, BASE_DIR, SENDFILE_ROOT
from notifications.notify import vk_messages_allowed
from .models import AidRequest, AidDocument, get_next_date, is_image
from .forms import AidRequestCreateForm, SelectExportMonthForm
from .create_paper import create_paper
logger = logging.getLogger(__name__)
@method_decorator(login_required, name='dispatch')
[docs]class AidRequestList(ListView):
# template_name = 'fin_aid/aidrequest_list.html'
model = AidRequest
[docs] def get_queryset(self):
return AidRequest.user_requests(self.request.user)
@method_decorator(login_required, name='dispatch')
# Inherits all ancestors shared by CreateView and UpdateView + SuccessMessageMixin
[docs]class AidRequestCreateUpdate(SuccessMessageMixin, SingleObjectTemplateResponseMixin, TemplateResponseMixin,
ModelFormMixin, FormMixin, SingleObjectMixin, ProcessFormView, View):
model = AidRequest
form_class = AidRequestCreateForm
template_name = 'fin_aid/aidrequest_form.html'
[docs] def get_success_url(self):
return reverse('fin_aid:aid_request_detail', args=(self.object.id,))
[docs] def get_context_data(self, **kwargs):
context = super(AidRequestCreateUpdate, self).get_context_data(**kwargs)
context['student_deadline_dt'] = get_next_date(None, 'student_deadline')
context['payment_dt'] = get_next_date(get_next_date(None, 'student_deadline'), 'payment')
return context
[docs]class AidRequestCreate(AidRequestCreateUpdate, BaseCreateView):
[docs] def get_success_message(self, cleaned_data):
success_message = "Заявление на матпомощь принято. Результаты рассмотрения будут доступны в личном кабинете."
if not vk_messages_allowed(self.request.user):
success_message += ' <a class="alert-link" href={}>Разрешите получение уведомлений ВКонтакте,</a> и мы ' \
'оповестим Вас о рассмотрении заявления!'.format(reverse("blog:article_detail", args=['notifications']))
return success_message
[docs]class AidRequestUpdate(AidRequestCreateUpdate, BaseUpdateView):
success_message = "Заявление на матпомощь изменено. Результаты рассмотрения будут доступны в личном кабинете"
[docs] def dispatch(self, request, *args, **kwargs):
aid_request = get_object_or_404(AidRequest, pk=self.kwargs['pk'])
if not aid_request.can_view(request.user):
raise PermissionDenied
if aid_request.status not in [AidRequest.WAITING, AidRequest.INFO_NEEDED]:
messages.error(self.request, "Заявление уже рассмотрено, Вы не можете изменить его")
return redirect(reverse_lazy('fin_aid:index'))
return super(AidRequestUpdate, self).dispatch(request, *args, **kwargs)
@method_decorator(login_required, name='dispatch')
[docs]class AidRequestDelete(DeleteView):
model = AidRequest
success_url = reverse_lazy('fin_aid:aid_request_list')
[docs] def dispatch(self, request, *args, **kwargs):
aid_request = get_object_or_404(AidRequest, pk=self.kwargs['pk'])
if not aid_request.can_view(request.user):
raise PermissionDenied
if aid_request.status not in [AidRequest.WAITING, AidRequest.INFO_NEEDED]:
messages.add_message(self.request, messages.ERROR,
"Заявление уже рассмотрено, Вы не можете удалить его")
return redirect(reverse_lazy('fin_aid:index'))
return super(AidRequestDelete, self).dispatch(request, *args, **kwargs)
@method_decorator(login_required, name='dispatch')
[docs]class AidRequestDetail(DetailView):
model = AidRequest
[docs] def dispatch(self, request, *args, **kwargs):
aid_request = get_object_or_404(AidRequest, pk=self.kwargs['pk'])
if not aid_request.can_view(request.user):
raise PermissionDenied
return super(AidRequestDetail, self).dispatch(request, *args, **kwargs)
[docs]class ExportAidRequest(BaseFormView, FormMixin, ProcessFormView, View):
form_class = SelectExportMonthForm
success_url = reverse_lazy("admin:fin_aid_aidrequest_changelist")
[docs] def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or \
(not request.user.groups.filter(name="finance").exists() and not request.user.is_superuser):
raise PermissionDenied
return super(ExportAidRequest, self).dispatch(request, *args, **kwargs)