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

Use celery task to send email

parent 84c58e4b
No related branches found
No related tags found
1 merge request!5Mailing
Pipeline #59581 failed
...@@ -81,6 +81,11 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -81,6 +81,11 @@ class Invoice(BasePayment, PureDjangoModel):
) )
items = models.ManyToManyField("InvoiceItem", verbose_name=_("Invoice items")) items = models.ManyToManyField("InvoiceItem", verbose_name=_("Invoice items"))
class Meta:
permissions = (
("send_invoice_email", _("Can send invoice by email")),
)
@classmethod @classmethod
def get_variant_choices(cls): def get_variant_choices(cls):
choices = [] choices = []
...@@ -98,10 +103,12 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -98,10 +103,12 @@ class Invoice(BasePayment, PureDjangoModel):
return self.__class__.STATUS_ICONS[self.status] return self.__class__.STATUS_ICONS[self.status]
def get_purchased_items(self): def get_purchased_items(self):
for item in self.items.all(): if self.items.count():
yield item.as_purchased_item() for item in self.items.all():
yield item.as_purchased_item()
else: else:
return self.for_object.get_purchased_items() for item in self.for_object.get_purchased_items():
yield item
def get_person(self): def get_person(self):
if self.person: if self.person:
...@@ -126,7 +133,7 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -126,7 +133,7 @@ class Invoice(BasePayment, PureDjangoModel):
if hasattr(self.for_object, "get_billing_email_recipients"): if hasattr(self.for_object, "get_billing_email_recipients"):
return self.for_object.get_billing_email_recipients() return self.for_object.get_billing_email_recipients()
else: else:
return list(self.billing_email) return [self.billing_email]
@property @property
def purchased_items_table(self): def purchased_items_table(self):
...@@ -160,11 +167,14 @@ class Invoice(BasePayment, PureDjangoModel): ...@@ -160,11 +167,14 @@ class Invoice(BasePayment, PureDjangoModel):
return TotalsTable(values) return TotalsTable(values)
def get_success_url(self): def get_absolute_url(self):
return reverse("invoice_by_token", kwargs={"slug": self.token}) return reverse("invoice_by_token", kwargs={"slug": self.token})
def get_success_url(self):
return self.get_absolute_url()
def get_failure_url(self): def get_failure_url(self):
return reverse("invoice_by_token", kwargs={"slug": self.token}) return self.get_absolute_url()
class InvoiceItem(ExtensibleModel): class InvoiceItem(ExtensibleModel):
......
...@@ -134,3 +134,11 @@ print_invoice_predicate = ( ...@@ -134,3 +134,11 @@ print_invoice_predicate = (
view_invoice_predicate & display_billing_predicate & display_purchased_items_predicate view_invoice_predicate & display_billing_predicate & display_purchased_items_predicate
) )
rules.add_perm("tezor.print_invoice_rule", print_invoice_predicate) rules.add_perm("tezor.print_invoice_rule", print_invoice_predicate)
# Send invoice email
send_invoice_email_predicate = (
has_person & is_own_invoice
| has_global_perm("tezor.send_invoice_email")
| has_object_perm("tezor.send_invoice_email")
)
rules.add_perm("tezor.send_invoice_email_rule", send_invoice_email_predicate)
from aleksis.core.celery import app
from aleksis.core.util.email import send_email
from aleksis.core.util.pdf import generate_pdf_from_template
from .models.invoice import Invoice
@app.task
def email_invoice(invoice_token):
context = {}
invoice = Invoice.objects.get(token=invoice_token)
context["invoice"] = invoice
invoice_pdf, result = generate_pdf_from_template(invoice.group.template_name, context)
result.wait(timeout=30, disable_sync_subtasks=False)
invoice_pdf.refresh_from_db()
send_email(
template_name="invoice",
from_email=invoice.group.client.email,
recipient_list=invoice.get_billing_email_recipients(),
context=context,
attachments=[(invoice_pdf.file.name, invoice_pdf.file.read(), "application/pdf")],
)
...@@ -57,8 +57,8 @@ urlpatterns = [ ...@@ -57,8 +57,8 @@ urlpatterns = [
name="invoice_by_token", name="invoice_by_token",
), ),
path( path(
"invoice/<int:pk>/send/", "invoice/<str:token>/send/",
views.SendInvoiceEmail.as_view(), views.SendInvoiceEmail.as_view(),
name="send_invoice_by_pk", name="send_invoice_by_token",
), ),
] ]
...@@ -20,6 +20,7 @@ from .forms import EditClientForm, EditInvoiceGroupForm ...@@ -20,6 +20,7 @@ from .forms import EditClientForm, EditInvoiceGroupForm
from .models.base import Client from .models.base import Client
from .models.invoice import Invoice, InvoiceGroup from .models.invoice import Invoice, InvoiceGroup
from .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable from .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable
from .tasks import email_invoice
class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView): class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView):
...@@ -32,7 +33,6 @@ class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView): ...@@ -32,7 +33,6 @@ class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView):
self.template_name = invoice.group.template_name self.template_name = invoice.group.template_name
context["invoice"] = invoice context["invoice"] = invoice
print(invoice.group.__dict__)
return context return context
...@@ -194,19 +194,15 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView): ...@@ -194,19 +194,15 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView):
template_name = "tezor/invoice/full.html" template_name = "tezor/invoice/full.html"
class SendInvoiceEmail(View): class SendInvoiceEmail(PermissionRequiredMixin, View):
def get(self, request, pk): permission_required = "tezor.send_invoice_email_rule"
context = {}
invoice = Invoice.objects.get(id=pk) def get(self, request, token):
context["invoice"] = invoice email_invoice.delay(token)
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()) url = request.META.get("HTTP_REFERRER")
context["invoice_pdf"] = attachment if not url:
url = Invoice.objects.get(token=token).get_absolute_url()
send_templated_mail(
template_name="invoice", return redirect(url)
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