Source code for fin_aid.views

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] def form_valid(self, form): response = super(AidRequestCreateUpdate, self).form_valid(form) self.object.applicant = self.object.applicant or self.request.user for i in range(1, 4): document = form.cleaned_data['document' + str(i)] if document: AidDocument.objects.create(file=document, request=self.object, is_image=is_image(document)) self.object.save() if self.object.applicant.userprofile.is_approved: try: AidDocument.objects.filter(request=self.object, is_application_paper=True).delete() create_paper(self.object) except Exception as e: logger.exception(e, exc_info=True, extra={'request': self.request}) return response
[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)
[docs] def form_invalid(self, form): messages.error("Выберите допустимый год и месяц для создания выгрузки") return redirect(reverse_lazy("admin:fin_aid_aidrequest_changelist"))
[docs] def form_valid(self, form): year, month = form.cleaned_data["year"], form.cleaned_data["month"] filename = os.path.join(SENDFILE_ROOT, "export_{}_{}.csv".format(year, month)) AidRequest.to_csv(filename, year, month) if 'Windows' in self.request.user_agent.os.family or 'windows' in self.request.user_agent.os.family: oldfilename, filename = filename, os.path.join(SENDFILE_ROOT, "export_{}_{}win.csv".format(year, month)) if not make_win_csv(oldfilename, filename): filename = oldfilename logger.warning("Can't change file encoding for Windows") return sendfile(self.request, filename, attachment=True, attachment_filename="export_{}_{}.csv".format(year, month))