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):
)
items = models.ManyToManyField("InvoiceItem", verbose_name=_("Invoice items"))
class Meta:
permissions = (
("send_invoice_email", _("Can send invoice by email")),
)
@classmethod
def get_variant_choices(cls):
choices = []
......@@ -98,10 +103,12 @@ class Invoice(BasePayment, PureDjangoModel):
return self.__class__.STATUS_ICONS[self.status]
def get_purchased_items(self):
for item in self.items.all():
yield item.as_purchased_item()
if self.items.count():
for item in self.items.all():
yield item.as_purchased_item()
else:
return self.for_object.get_purchased_items()
for item in self.for_object.get_purchased_items():
yield item
def get_person(self):
if self.person:
......@@ -126,7 +133,7 @@ class Invoice(BasePayment, PureDjangoModel):
if hasattr(self.for_object, "get_billing_email_recipients"):
return self.for_object.get_billing_email_recipients()
else:
return list(self.billing_email)
return [self.billing_email]
@property
def purchased_items_table(self):
......@@ -160,11 +167,14 @@ class Invoice(BasePayment, PureDjangoModel):
return TotalsTable(values)
def get_success_url(self):
def get_absolute_url(self):
return reverse("invoice_by_token", kwargs={"slug": self.token})
def get_success_url(self):
return self.get_absolute_url()
def get_failure_url(self):
return reverse("invoice_by_token", kwargs={"slug": self.token})
return self.get_absolute_url()
class InvoiceItem(ExtensibleModel):
......
......@@ -134,3 +134,11 @@ print_invoice_predicate = (
view_invoice_predicate & display_billing_predicate & display_purchased_items_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 = [
name="invoice_by_token",
),
path(
"invoice/<int:pk>/send/",
"invoice/<str:token>/send/",
views.SendInvoiceEmail.as_view(),
name="send_invoice_by_pk",
name="send_invoice_by_token",
),
]
......@@ -20,6 +20,7 @@ from .forms import EditClientForm, EditInvoiceGroupForm
from .models.base import Client
from .models.invoice import Invoice, InvoiceGroup
from .tables import ClientsTable, InvoiceGroupsTable, InvoicesTable
from .tasks import email_invoice
class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView):
......@@ -32,7 +33,6 @@ class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView):
self.template_name = invoice.group.template_name
context["invoice"] = invoice
print(invoice.group.__dict__)
return context
......@@ -194,19 +194,15 @@ class InvoiceDetailView(PermissionRequiredMixin, DetailView):
template_name = "tezor/invoice/full.html"
class SendInvoiceEmail(View):
class SendInvoiceEmail(PermissionRequiredMixin, 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,
)
permission_required = "tezor.send_invoice_email_rule"
def get(self, request, token):
email_invoice.delay(token)
url = request.META.get("HTTP_REFERRER")
if not url:
url = Invoice.objects.get(token=token).get_absolute_url()
return redirect(url)
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