From 5ec92d141ed3c876f21490c9ae652ae4138b97d2 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Tue, 14 Nov 2017 18:48:44 +0100 Subject: [PATCH] lingo: send new remote invoices by email (#13122) --- .../lingo/migrations/0031_auto_20171114_1702.py | 36 +++++++++++ combo/apps/lingo/models.py | 69 +++++++++++++++++++++- .../combo/invoice_email_notification_body.html | 23 ++++++++ .../combo/invoice_email_notification_body.txt | 6 ++ .../combo/invoice_email_notification_subject.txt | 4 ++ 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 combo/apps/lingo/migrations/0031_auto_20171114_1702.py create mode 100644 combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.html create mode 100644 combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.txt create mode 100644 combo/apps/lingo/templates/lingo/combo/invoice_email_notification_subject.txt diff --git a/combo/apps/lingo/migrations/0031_auto_20171114_1702.py b/combo/apps/lingo/migrations/0031_auto_20171114_1702.py new file mode 100644 index 0000000..cf0e5d0 --- /dev/null +++ b/combo/apps/lingo/migrations/0031_auto_20171114_1702.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lingo', '0030_transaction_to_be_paid_remote_items'), + ] + + operations = [ + migrations.CreateModel( + name='InvoiceEmailNotification', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('invoice_id', models.CharField(max_length=128)), + ('last_notification_datetime', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'get_latest_by': 'last_notification_datetime', + }, + ), + migrations.AddField( + model_name='regie', + name='invoice_email_notifications_delay', + field=models.IntegerField(default=0, help_text='In days'), + preserve_default=False, + ), + migrations.AddField( + model_name='invoiceemailnotification', + name='regie', + field=models.ForeignKey(to='lingo.Regie'), + ), + ] diff --git a/combo/apps/lingo/models.py b/combo/apps/lingo/models.py index b8b75a5..6937133 100644 --- a/combo/apps/lingo/models.py +++ b/combo/apps/lingo/models.py @@ -27,15 +27,19 @@ from decimal import Decimal import eopayment from jsonfield import JSONField -from django import template from django.conf import settings from django.db import models from django.forms import models as model_forms, Select from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.core.mail import EmailMultiAlternatives +from django.core.urlresolvers import reverse from django.utils.http import urlencode +from django.contrib.auth.models import User +from django.template.loader import render_to_string + from combo.data.fields import RichTextField from combo.data.models import CellBase from combo.data.library import register_cell_class @@ -91,6 +95,7 @@ class Regie(models.Model): text_on_success = models.TextField( verbose_name=_('Custom text displayed on success'), blank=True, null=True) + invoice_email_notifications_delay = models.IntegerField(help_text=_('In days')) def is_remote(self): return self.webservice_url != '' @@ -203,6 +208,56 @@ class Regie(models.Model): extra_fee=True, user_cancellable=False).save() + def notify_new_remote_invoices_by_email(self): + logger = logging.getLogger(__name__) + subject_template = 'lingo/combo/invoice_email_notification_subject.txt' + text_body_template = 'lingo/combo/invoice_email_notification_body.txt' + html_body_template = 'lingo/combo/invoice_email_notification_body.html' + if not self.is_remote(): + return + + url = self.webservice_url + '/pending_invoices_by_nameid/' + response = requests.get(url, remote_service=None, cache_duration=0, log_errors=True) + data = response.json()['data'] + if not data: + return + for uuid, items in data.iteritems(): + user_get_kwargs = {} + try: + user = User.objects.get(saml_identifiers__name_id=uuid) + except User.DoesNotExist: + logger.warning('Invoices available for unknown user: %s', uuid) + continue + if items['invoices']: + for item in items['invoices']: + try: + notification = InvoiceEmailNotification.objects.filter(regie=self, invoice_id=item['id']).latest() + if notification.last_notification_datetime > timezone.now()-timezone.timedelta(days=self.invoice_email_notifications_delay): + continue + except InvoiceEmailNotification.DoesNotExist: + pass + remote_item = build_remote_item(item, self) + # get host url in order to build payment url + base_url = getattr(settings, 'SITE_BASE_URL', '') + payment_url = reverse('view-item', kwargs={'regie_id': self.id, + 'item_crypto_id': remote_item.crypto_id}) + ctx = {'payment_url': urlparse.urljoin(base_url, payment_url), + 'item': remote_item} + if base_url: + ctx.update({'portal_url': base_url}) + + subject = render_to_string([subject_template], ctx).strip() + text_body = render_to_string([text_body_template], ctx) + html_body = render_to_string([html_body_template], ctx) + message = EmailMultiAlternatives(subject, text_body, + settings.DEFAULT_FROM_EMAIL, [user.email]) + message.attach_alternative(html_body, 'text/html') + if item['has_pdf']: + invoice_pdf = self.get_invoice_pdf(user, item['id']) + message.attach('%s.pdf' % item['id'], invoice_pdf.content) + message.send() + InvoiceEmailNotification.objects.create(regie=self, invoice_id=item['id']) + class BasketItem(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True) @@ -619,3 +674,15 @@ class TipiPaymentFormCell(CellBase): continue context['regies'].append(regie_id) return extra_context + + +class InvoiceEmailNotification(models.Model): + regie = models.ForeignKey(Regie) + invoice_id = models.CharField(max_length=128) + last_notification_datetime = models.DateTimeField(auto_now_add=True) + + class Meta: + get_latest_by = 'last_notification_datetime' + + def __unicode__(self): + return _(u'notification for %s at %s') % (invoice_id, last_notification_datetime) diff --git a/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.html b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.html new file mode 100644 index 0000000..34a793c --- /dev/null +++ b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.html @@ -0,0 +1,23 @@ +{% load i18n %} + + + +

{% blocktrans with id=item.id %} + A new invoice nr. {{ id }} is available. + {% endblocktrans %} +

+ {% if portal_url %} +

+ {% blocktrans %} + To view it please go to portal or pay it directly. + {% endblocktrans %} +

+ {% else %} +

+ {% blocktrans %} + Pay it. + {% endblocktrans %} +

+ {% endif %} + + diff --git a/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.txt b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.txt new file mode 100644 index 0000000..aa8d1f2 --- /dev/null +++ b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_body.txt @@ -0,0 +1,6 @@ +{% load i18n %} +{% blocktrans with id=item.id %}A new invoice nr. {{ id }} is available.{% endblocktrans %} +{% if portal_url %} +{% blocktrans %}To view it please go to {{ portal_url }} or pay it directly on {{ payment_url }}.{% endblocktrans %} +{% else %}{% blocktrans %}Pay it on {{ payment_url }}.{% endblocktrans %} +{% endif %} diff --git a/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_subject.txt b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_subject.txt new file mode 100644 index 0000000..142a34d --- /dev/null +++ b/combo/apps/lingo/templates/lingo/combo/invoice_email_notification_subject.txt @@ -0,0 +1,4 @@ +{% load i18n %} +{% blocktrans with invoice_id=item.id %} +Your new invoice nr. {{ invoice_id }} +{% endblocktrans %} -- 2.15.0