diff --git a/aleksis/apps/tezor/migrations/0002_client_email.py b/aleksis/apps/tezor/migrations/0002_client_email.py new file mode 100644 index 0000000000000000000000000000000000000000..6633ae74361e1b6b0651b62f2c32586f0fb714b9 --- /dev/null +++ b/aleksis/apps/tezor/migrations/0002_client_email.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-03-09 20:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tezor', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='client', + name='email', + field=models.EmailField(default='', max_length=254, verbose_name='Email'), + preserve_default=False, + ), + ] diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py index 459f9b22b924289f33a4f192e28b2794973184e0..85f85ccf9f3d67cc362c6704852c81602f958101 100644 --- a/aleksis/apps/tezor/models/base.py +++ b/aleksis/apps/tezor/models/base.py @@ -6,6 +6,7 @@ from aleksis.core.mixins import ExtensibleModel class Client(ExtensibleModel): name = models.CharField(verbose_name=_("Name"), max_length=255) + email = models.EmailField(verbose_name=_("Email")) class Meta: constraints = [ diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py index fd6be73de84a1e3113009a4d38351adc9d7db4c2..7dcad881b85266d1eb099b49d5ab7a318b200932 100644 --- a/aleksis/apps/tezor/models/invoice.py +++ b/aleksis/apps/tezor/models/invoice.py @@ -50,6 +50,12 @@ class Invoice(BasePayment, PureDjangoModel): models.UniqueConstraint(fields=["transaction_id", "group"], name="number_uniq_per_group") ] + def get_billing_email_recipients(self): + if hasattr(self.for_object, "get_billing_email_recipients"): + return self.for_object.get_billing_email_recipients() + else: + return list(self.billing_email) + @property def purchased_items_table(self): items = [i._asdict() for i in self.get_purchased_items()] diff --git a/aleksis/apps/tezor/templates/templated_email/invoice.email b/aleksis/apps/tezor/templates/templated_email/invoice.email new file mode 100644 index 0000000000000000000000000000000000000000..d6496f320baa0c33e2a132fa4dea7d0f971b5372 --- /dev/null +++ b/aleksis/apps/tezor/templates/templated_email/invoice.email @@ -0,0 +1,26 @@ +{% extends "templated_email/base.email" %} + +{% load i18n %} + +{% block subject %}{% trans "Invoice" %} {{ invoice }}{% endblock %} + +{% block plain %} + {% blocktrans with invoice=invoice %} + Please find attached invoice number {{ invoice.transaction_id }} for {{ + invoice.description }} please carefully read the PDF file concerning all + payment details. + {% endblocktrans %} + +{% endblock %} + +{% block html %} + +<p> + {% blocktrans with invoice=invoice %} + Please find attached invoice number {{ invoice.transaction_id }} for {{ + invoice.description }} please carefully read the PDF file concerning all + payment details. + {% endblocktrans %} +</p> + +{% endblock %} diff --git a/aleksis/apps/tezor/urls.py b/aleksis/apps/tezor/urls.py index 627d64f756e6bd336acfe3be02a244a15ae069de..baf77d09ab2a7254074da33d2403cf273e776294 100644 --- a/aleksis/apps/tezor/urls.py +++ b/aleksis/apps/tezor/urls.py @@ -55,4 +55,9 @@ urlpatterns = [ views.InvoiceDetailView.as_view(), name="invoice_by_pk", ), + path( + "invoice/<int:pk>/send/", + views.SendInvoiceEmail.as_view(), + name="send_invoice_by_pk", + ), ] diff --git a/aleksis/apps/tezor/views.py b/aleksis/apps/tezor/views.py index 27939605b54e85cf57ce36abaad31d147e8132da..f6618033972bf245e12faf564412aabcedf083be 100644 --- a/aleksis/apps/tezor/views.py +++ b/aleksis/apps/tezor/views.py @@ -9,9 +9,11 @@ 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 @@ -153,3 +155,21 @@ 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, + )