Imports at the start.
[wolnelektury.git] / src / club / models.py
index f36aada..1d993bc 100644 (file)
@@ -2,16 +2,20 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from datetime import datetime, timedelta
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from datetime import datetime, timedelta
+import os
+import tempfile
 from django.apps import apps
 from django.conf import settings
 from django.contrib.sites.models import Site
 from django.apps import apps
 from django.conf import settings
 from django.contrib.sites.models import Site
-from django.core.mail import send_mail
+from django.core.mail import send_mail, EmailMessage
 from django.urls import reverse
 from django.db import models
 from django import template
 from django.utils.timezone import now
 from django.utils.translation import ugettext_lazy as _, ungettext, ugettext, get_language
 from catalogue.utils import get_random_hash
 from django.urls import reverse
 from django.db import models
 from django import template
 from django.utils.timezone import now
 from django.utils.translation import ugettext_lazy as _, ungettext, ugettext, get_language
 from catalogue.utils import get_random_hash
+from messaging.states import Level
+from reporting.utils import render_to_pdf
 from .payment_methods import recurring_payment_method, single_payment_method
 from .payu import models as payu_models
 from . import utils
 from .payment_methods import recurring_payment_method, single_payment_method
 from .payu import models as payu_models
 from . import utils
@@ -113,14 +117,14 @@ class Schedule(models.Model):
     def update_contact(self):
         Contact = apps.get_model('messaging', 'Contact')
         if not self.payed_at:
     def update_contact(self):
         Contact = apps.get_model('messaging', 'Contact')
         if not self.payed_at:
-            level = Contact.TRIED
+            level = Level.TRIED
             since = self.started_at
         else:
             since = self.payed_at
             if self.is_recurring():
             since = self.started_at
         else:
             since = self.payed_at
             if self.is_recurring():
-                level = Contact.RECURRING
+                level = Level.RECURRING
             else:
             else:
-                level = Contact.SINGLE
+                level = Level.SINGLE
         Contact.update(self.email, level, since, self.expires_at)
 
 
         Contact.update(self.email, level, since, self.expires_at)
 
 
@@ -238,6 +242,33 @@ class PayUOrder(payu_models.Order):
             if not self.schedule.email_sent:
                 self.schedule.send_email()
 
             if not self.schedule.email_sent:
                 self.schedule.send_email()
 
+    @classmethod
+    def send_receipt(cls, email, year):
+        qs = cls.objects.filter(status='COMPLETED', schedule__email=email, completed_at__year=year).order_by('completed_at')
+        if not qs.exists(): return
+        ctx = {
+            "email": email,
+            "year": year,
+            "next_year": year + 1,
+            "total": qs.aggregate(s=models.Sum('schedule__amount'))['s'],
+            "orders": qs,
+        }
+        temp = tempfile.NamedTemporaryFile(prefix='receipt-', suffix='.pdf', delete=False)
+        temp.close()
+        render_to_pdf(temp.name, 'club/receipt.texml', ctx, {
+            "fnp.eps": os.path.join(settings.STATIC_ROOT, "img/fnp.eps"),
+            })
+
+        message = EmailMessage(
+                f'Odlicz od podatku swoje darowizny przekazane dla Wolnych Lektur',
+                template.loader.render_to_string('club/receipt_email.txt', ctx),
+                settings.CONTACT_EMAIL, [email]
+            )
+        with open(temp.name, 'rb') as f:
+            message.attach('wolnelektury-darowizny.pdf', f.read(), 'application/pdf')
+        message.send()
+        os.unlink(f.name)
+
 
 class PayUCardToken(payu_models.CardToken):
     schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
 
 class PayUCardToken(payu_models.CardToken):
     schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)