Skip to content
Snippets Groups Projects
Commit dcaff446 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Allow sending invoice by mail

parent e28c6fa9
No related branches found
No related tags found
1 merge request!5Mailing
Pipeline #58879 failed
# 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,
),
]
...@@ -6,6 +6,7 @@ from aleksis.core.mixins import ExtensibleModel ...@@ -6,6 +6,7 @@ from aleksis.core.mixins import ExtensibleModel
class Client(ExtensibleModel): class Client(ExtensibleModel):
name = models.CharField(verbose_name=_("Name"), max_length=255) name = models.CharField(verbose_name=_("Name"), max_length=255)
email = models.EmailField(verbose_name=_("Email"))
class Meta: class Meta:
constraints = [ constraints = [
......
...@@ -50,6 +50,12 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -50,6 +50,12 @@ class Invoice(BasePayment, PureDjangoModel):
models.UniqueConstraint(fields=["transaction_id", "group"], name="number_uniq_per_group") 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 @property
def purchased_items_table(self): def purchased_items_table(self):
items = [i._asdict() for i in self.get_purchased_items()] items = [i._asdict() for i in self.get_purchased_items()]
......
{% 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 %}
...@@ -55,4 +55,9 @@ urlpatterns = [ ...@@ -55,4 +55,9 @@ urlpatterns = [
views.InvoiceDetailView.as_view(), views.InvoiceDetailView.as_view(),
name="invoice_by_pk", name="invoice_by_pk",
), ),
path(
"invoice/<int:pk>/send/",
views.SendInvoiceEmail.as_view(),
name="send_invoice_by_pk",
),
] ]
...@@ -9,9 +9,11 @@ from django.views.generic.detail import DetailView ...@@ -9,9 +9,11 @@ from django.views.generic.detail import DetailView
from rules.contrib.views import PermissionRequiredMixin from rules.contrib.views import PermissionRequiredMixin
from django_tables2.views import SingleTableView, RequestConfig from django_tables2.views import SingleTableView, RequestConfig
from templated_email import InlineImage, send_templated_mail
from aleksis.core.views import RenderPDFView from aleksis.core.views import RenderPDFView
from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView 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 .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable
from .forms import EditClientForm, EditInvoiceGroupForm from .forms import EditClientForm, EditInvoiceGroupForm
...@@ -153,3 +155,21 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView): ...@@ -153,3 +155,21 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView):
model = Invoice model = Invoice
permission_required = "tezor.view_invoice" permission_required = "tezor.view_invoice"
template_name = "tezor/invoice/full.html" 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,
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment