Publishing tags, and fixes.
[wolnelektury.git] / src / club / payment_methods.py
index e74ae83..6bb6f8e 100644 (file)
@@ -1,10 +1,14 @@
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from hashlib import sha256
 from django.conf import settings
 from django.urls import reverse
 from django.utils.timezone import now
 from django.conf import settings
 from django.urls import reverse
 from django.utils.timezone import now
+from django.utils.translation import get_language
 from paypal.rest import agreement_approval_url
 from paypal.rest import agreement_approval_url
+from django.template.loader import render_to_string
+from .payu import POSS
 
 
 class PaymentMethod(object):
 
 
 class PaymentMethod(object):
@@ -28,6 +32,14 @@ class PayU(PaymentMethod):
     def __init__(self, pos_id):
         self.pos_id = pos_id
 
     def __init__(self, pos_id):
         self.pos_id = pos_id
 
+    def invite_widget(self, schedule):
+        return render_to_string(
+            'club/payment/payu_invite.html',
+            {
+                'schedule': schedule,
+            }
+        )
+
     def initiate(self, request, schedule):
         # Create Order at once.
         from .models import PayUOrder
     def initiate(self, request, schedule):
         # Create Order at once.
         from .models import PayUOrder
@@ -54,6 +66,36 @@ class PayURe(PaymentMethod):
     def initiate(self, request, schedule):
         return reverse('club_payu_rec_payment', args=[schedule.key])
 
     def initiate(self, request, schedule):
         return reverse('club_payu_rec_payment', args=[schedule.key])
 
+    def invite_widget(self, schedule):
+        from . import forms
+        pos = POSS[self.pos_id]
+        widget_args = {
+            'merchant-pos-id': pos.pos_id,
+            'shop-name': "SHOW NAME",
+            'total-amount': str(int(schedule.amount * 100)),
+            'currency-code': pos.currency_code,
+            'customer-language': get_language(), # filter to pos.languages
+            'customer-email': schedule.email,
+            'store-card': 'true',
+            'recurring-payment': 'true',
+        }
+        widget_sig = sha256(
+            (
+                "".join(v for (k, v) in sorted(widget_args.items())) +
+                pos.secondary_key
+            ).encode('utf-8')
+        ).hexdigest()
+        
+        return render_to_string(
+            'payu/rec_widget.html',
+            {
+                'form': forms.PayUCardTokenForm(),
+                'pos': POSS[self.pos_id],
+                'widget_args': widget_args,
+                'widget_sig': widget_sig,
+            }
+        )
+    
     def pay(self, request, schedule):
         # Create order, put it and see what happens next.
         from .models import PayUOrder
     def pay(self, request, schedule):
         # Create order, put it and see what happens next.
         from .models import PayUOrder
@@ -104,14 +146,21 @@ class PayPal(PaymentMethod):
     is_recurring = True
     is_onetime = False
 
     is_recurring = True
     is_onetime = False
 
+    def invite_widget(self, schedule):
+        return render_to_string(
+            'club/payment/paypal_invite.html',
+            {
+                'schedule': schedule,
+            }
+        )
+    
     def initiate(self, request, schedule):
         app = request.GET.get('app')
         return agreement_approval_url(schedule.amount, schedule.key, app=app)
 
     def pay(self, request, schedule):
     def initiate(self, request, schedule):
         app = request.GET.get('app')
         return agreement_approval_url(schedule.amount, schedule.key, app=app)
 
     def pay(self, request, schedule):
-        from datetime import date, timedelta, datetime
-        from pytz import utc
-        tomorrow = datetime(*(date.today() + timedelta(2)).timetuple()[:3], tzinfo=utc)
+        from datetime import date, timedelta, datetime, timezone
+        tomorrow = datetime(*(date.today() + timedelta(2)).timetuple()[:3], tzinfo=timezone.utc)
         any_active = False
         for ba in schedule.billingagreement_set.all():
             active = ba.check_agreement()
         any_active = False
         for ba in schedule.billingagreement_set.all():
             active = ba.check_agreement()