from django.views.generic import View from django.shortcuts import render from django.views.decorators.cache import never_cache from django.utils.decorators import method_decorator from django.views.generic import FormView, TemplateView from django.utils.translation import ugettext as _ from django.urls import reverse, reverse_lazy from django.views.generic.detail import DetailView from rules.contrib.views import PermissionRequiredMixin from django_tables2.views import SingleTableView, RequestConfig from templated_email import InlineImage, send_templated_mail from aleksis.core.views import RenderPDFView from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView from aleksis.core.util.pdf import generate_pdf_from_template from .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable from .forms import EditClientForm, EditInvoiceGroupForm from .models.base import Client from .models.invoice import Invoice, InvoiceGroup class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView): permission_required = "tezor.can_print_invoice" def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) invoice = Invoice.objects.get(id=self.kwargs["pk"]) self.template_name = invoice.group.template_name context["invoice"] = invoice print(invoice.group.__dict__) return context class ClientListView(PermissionRequiredMixin, SingleTableView): """Table of all clients.""" model = Client table_class = ClientsTable permission_required = "tezor.view_clients" template_name = "tezor/client/list.html" @method_decorator(never_cache, name="dispatch") class ClientCreateView(PermissionRequiredMixin, AdvancedCreateView): """Create view for clients.""" model = Client form_class = EditClientForm permission_required = "tezor.add_clients" template_name = "tezor/client/create.html" success_url = reverse_lazy("clients") success_message = _("The client has been created.") @method_decorator(never_cache, name="dispatch") class ClientEditView(PermissionRequiredMixin, AdvancedEditView): """Edit view for clients.""" model = Client form_class = EditClientForm permission_required = "tezor.edit_clients" template_name = "tezor/client/edit.html" success_url = reverse_lazy("clients") success_message = _("The client has been saved.") class ClientDeleteView(PermissionRequiredMixin, AdvancedDeleteView): """Delete view for client.""" model = Client permission_required = "tezor.delete_client" template_name = "core/pages/delete.html" success_url = reverse_lazy("clients") success_message = _("The client has been deleted.") class ClientDetailView(PermissionRequiredMixin, DetailView): model = Client permission_required = "tezor.view_client" template_name = "tezor/client/full.html" def get_context_data(self, object): context = super().get_context_data() invoice_groups = object.invoice_groups.all() invoice_groups_table = InvoiceGroupsTable(invoice_groups) RequestConfig(self.request).configure(invoice_groups_table) context["invoice_groups_table"] = invoice_groups_table return context class InvoiceGroupDetailView(PermissionRequiredMixin, DetailView): model = InvoiceGroup permission_required = "tezor.view_invoice_group" template_name = "tezor/invoice_group/full.html" def get_context_data(self, object): context = super().get_context_data() invoices = object.invoices.all() invoices_table = InvoicesTable(invoices) RequestConfig(self.request).configure(invoices_table) context["invoices_table"] = invoices_table return context @method_decorator(never_cache, name="dispatch") class InvoiceGroupCreateView(PermissionRequiredMixin, AdvancedCreateView): """Create view for invoice_groups.""" model = InvoiceGroup form_class = EditInvoiceGroupForm permission_required = "tezor.add_invoice_groups" template_name = "tezor/invoice_group/create.html" success_url = reverse_lazy("clients") success_message = _("The invoice_group has been created.") def form_valid(self, form): client = Client.objects.get(id=self.kwargs["pk"]) InvoiceGroup.objects.create(client=client, name=form.cleaned_data["name"], template_name=form.cleaned_data["template_name"]) return super().form_valid(form) @method_decorator(never_cache, name="dispatch") class InvoiceGroupEditView(PermissionRequiredMixin, AdvancedEditView): """Edit view for invoice_groups.""" model = InvoiceGroup form_class = EditInvoiceGroupForm permission_required = "tezor.edit_invoice_groups" template_name = "tezor/invoice_group/edit.html" success_url = reverse_lazy("invoice_groups") success_message = _("The invoice_group has been saved.") class InvoiceGroupDeleteView(PermissionRequiredMixin, AdvancedDeleteView): """Delete view for invoice_group.""" model = InvoiceGroup permission_required = "tezor.delete_invoice_group" template_name = "core/pages/delete.html" success_url = reverse_lazy("invoice_groups") success_message = _("The invoice_group has been deleted.") class InvoiceDetailView(PermissionRequiredMixin, DetailView): model = Invoice permission_required = "tezor.view_invoice" template_name = "tezor/invoice/full.html" class SendInvoiceEmail(View): def get(self, request, pk): context = {} invoice = Invoice.objects.get(id=pk) context["invoice"] = invoice invoice_pdf, result = generate_pdf_from_template(invoice.group.template_name, context, request) attachment = InlineImage(filename=f"{invoice.transaction_id}.pdf", content=invoice_pdf.file.read()) context["invoice_pdf"] = attachment send_templated_mail( template_name="invoice", from_email=invoice.group.client.email, recipient_list=invoice.get_billing_email_recipients(), context=context, )