You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.6 KiB
101 lines
3.6 KiB
from io import BytesIO
|
|
|
|
from django.contrib import messages
|
|
from django.utils.datetime_safe import datetime
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.views.generic import UpdateView, DeleteView, CreateView, DetailView, ListView
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
from django.core.exceptions import ValidationError
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import redirect, get_object_or_404
|
|
from django.urls import reverse_lazy
|
|
from docxtpl import DocxTemplate
|
|
from docx.opc.constants import CONTENT_TYPE
|
|
from jinja2.exceptions import UndefinedError, TemplateSyntaxError
|
|
|
|
from abonapp.models import Abon
|
|
from djing.global_base_views import OrderedFilteredList
|
|
from djing.lib.mixins import LoginAdminMixin, LoginAdminPermissionMixin
|
|
from docsapp.models import DocumentTemplateModel
|
|
from docsapp.forms import DocumentTemplateModelForm
|
|
|
|
|
|
class DocumentsListView(LoginAdminMixin, OrderedFilteredList):
|
|
model = DocumentTemplateModel
|
|
|
|
|
|
class SimpleListView(LoginAdminMixin, ListView):
|
|
template_name = 'docsapp/simple_list.html'
|
|
model = DocumentTemplateModel
|
|
|
|
def get_context_data(self, **kwargs):
|
|
kwargs.update({
|
|
'account_name': self.kwargs.get('account_name')
|
|
})
|
|
return super().get_context_data(**kwargs)
|
|
|
|
|
|
class DocumentUpdateView(LoginAdminPermissionMixin, UpdateView):
|
|
permission_required = 'docsapp.change_documenttemplatemodel'
|
|
model = DocumentTemplateModel
|
|
form_class = DocumentTemplateModelForm
|
|
|
|
|
|
class DocumentDeleteView(LoginAdminPermissionMixin, DeleteView):
|
|
permission_required = 'docsapp.delete_documenttemplatemodel'
|
|
model = DocumentTemplateModel
|
|
success_url = reverse_lazy('docsapp:docs_list')
|
|
|
|
|
|
class DocumentCreateView(LoginAdminMixin, PermissionRequiredMixin, CreateView):
|
|
model = DocumentTemplateModel
|
|
form_class = DocumentTemplateModelForm
|
|
permission_required = 'docsapp.add_documenttemplatemodel'
|
|
|
|
|
|
class RenderDocument(LoginAdminPermissionMixin, DetailView):
|
|
model = DocumentTemplateModel
|
|
permission_required = 'docsapp.view_documenttemplatemodel'
|
|
context_object_name = 'document'
|
|
extra_context = {
|
|
'date': datetime.now()
|
|
}
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
self.object = obj
|
|
acc = get_object_or_404(Abon, username=self.kwargs.get('uname'))
|
|
|
|
try:
|
|
doc = DocxTemplate(
|
|
obj.doc_template.path
|
|
)
|
|
context = self.get_context_data(object=obj)
|
|
context.update(self.get_context_account(acc))
|
|
doc.render(context)
|
|
|
|
destination_document_file = BytesIO()
|
|
doc.get_docx().save(destination_document_file)
|
|
resp = HttpResponse(
|
|
destination_document_file.getvalue(),
|
|
content_type=CONTENT_TYPE.WML_DOCUMENT
|
|
)
|
|
resp['Content-Disposition'] = 'attachment; filename="document.docx"'
|
|
return resp
|
|
except (UndefinedError, ValidationError, TemplateSyntaxError) as e:
|
|
messages.error(request, str(e))
|
|
return redirect('docsapp:docs_list')
|
|
|
|
def get_context_account(self, account):
|
|
if not isinstance(account, Abon):
|
|
raise ValidationError(message=_('Account required and must be Abon'))
|
|
bp = '_' * 20
|
|
return {
|
|
'account': account,
|
|
'passport': getattr(account, 'passportinfo', {
|
|
'series': bp,
|
|
'number': bp,
|
|
'distributor': bp,
|
|
'date_of_acceptance': bp
|
|
})
|
|
}
|