diff options
Diffstat (limited to 'postgresqleu')
-rw-r--r-- | postgresqleu/confsponsor/urls.py | 2 | ||||
-rw-r--r-- | postgresqleu/confsponsor/views.py | 40 | ||||
-rw-r--r-- | postgresqleu/digisign/implementations/signwell.py | 10 | ||||
-rw-r--r-- | postgresqleu/digisign/migrations/0003_digisigncompleteddocument.py | 23 | ||||
-rw-r--r-- | postgresqleu/digisign/models.py | 11 | ||||
-rw-r--r-- | postgresqleu/digisign/util.py | 5 |
6 files changed, 88 insertions, 3 deletions
diff --git a/postgresqleu/confsponsor/urls.py b/postgresqleu/confsponsor/urls.py index 2ad5fcfe..161a5892 100644 --- a/postgresqleu/confsponsor/urls.py +++ b/postgresqleu/confsponsor/urls.py @@ -31,9 +31,11 @@ urlpatterns = [ url(r'^admin/(\w+)/(\d+)/$', views.sponsor_admin_sponsor), url(r'^admin/(\w+)/(\d+)/edit/$', backendviews.edit_sponsor), url(r'^admin/(\w+)/(\d+)/contractlog/$', views.sponsor_admin_sponsor_contractlog), + url(r'^admin/(\w+)/(\d+)/contractview/$', views.sponsor_admin_sponsor_contractview), url(r'^admin/(\w+)/(\d+)/resendcontract/$', views.sponsor_admin_sponsor_resendcontract), url(r'^admin/(\w+)/(\d+)/addcontract/$', views.sponsor_admin_addcontract), url(r'^admin/(\w+)/(\d+)/markaddcontract/$', views.sponsor_admin_markaddcontract), + url(r'^admin/(\w+)/(\d+)/viewaddcontract/(\d+)/$', views.sponsor_admin_viewaddcontract), url(r'^admin/(\w+)/benefit/(\d+)/$', views.sponsor_admin_benefit), url(r'^admin/(\w+)/sendmail/$', views.sponsor_admin_send_mail), url(r'^admin/(\w+)/viewmail/(\d+)/$', views.sponsor_admin_view_mail), diff --git a/postgresqleu/confsponsor/views.py b/postgresqleu/confsponsor/views.py index 6db589d1..061e136d 100644 --- a/postgresqleu/confsponsor/views.py +++ b/postgresqleu/confsponsor/views.py @@ -1038,7 +1038,7 @@ def _unclaim_benefit(request, claimed_benefit): def sponsor_admin_sponsor(request, confurlname, sponsorid): conference = get_authenticated_conference(request, confurlname) - sponsor = get_object_or_404(Sponsor, id=sponsorid, conference=conference) + sponsor = get_object_or_404(Sponsor.objects.select_related('contract', 'contract__digisigncompleteddocument', 'invoice').defer('contract__digisigncompleteddocument__completedpdf'), id=sponsorid, conference=conference) if request.method == 'POST' and request.POST.get('confirm', '0') == '1': # Confirm one of the benefits, so do this before we load the list @@ -1148,7 +1148,7 @@ def sponsor_admin_sponsor(request, confurlname, sponsorid): 'unclaimedbenefits': unclaimedbenefits, 'noclaimbenefits': noclaimbenefits, 'conference_has_contracts': SponsorshipContract.objects.filter(conference=conference, sponsorshiplevel=None).exists(), - 'additionalcontracts': SponsorAdditionalContract.objects.filter(sponsor=sponsor).order_by('id'), + 'additionalcontracts': SponsorAdditionalContract.objects.select_related('contract', 'digitalcontract', 'digitalcontract__digisigncompleteddocument').defer('digitalcontract__digisigncompleteddocument__completedpdf', 'contract__contractpdf').filter(sponsor=sponsor).order_by('id'), 'addcontractform': SponsorAddContractForm(sponsor), 'breadcrumbs': (('/events/sponsor/admin/{0}/'.format(conference.urlname), 'Sponsors'),), 'euvat': settings.EU_VAT, @@ -1176,6 +1176,25 @@ def sponsor_admin_sponsor_contractlog(request, confurlname, sponsorid): @login_required @transaction.atomic +def sponsor_admin_sponsor_contractview(request, confurlname, sponsorid): + conference = get_authenticated_conference(request, confurlname) + + sponsor = get_object_or_404(Sponsor.objects.select_related('contract', 'contract__digisigncompleteddocument'), id=sponsorid, conference=conference) + + if not sponsor.confirmed: # Cannot-happen + raise Http404("Page not valid for unconfirmed sponsors") + + if not sponsor.contract.completed: + raise Http404("Contract not completed") + + resp = HttpResponse(content_type='application/pdf') + resp['Content-disposition'] = 'filename="%s.pdf"' % sponsor.name + resp.write(sponsor.contract.digisigncompleteddocument.completedpdf) + return resp + + +@login_required +@transaction.atomic def sponsor_admin_sponsor_resendcontract(request, confurlname, sponsorid): conference = get_authenticated_conference(request, confurlname) @@ -1882,3 +1901,20 @@ def sponsor_admin_markaddcontract(request, confurlname, sponsorid): raise Http404("Invalid value for which") return HttpResponseRedirect("../") + + +@login_required +@transaction.atomic +def sponsor_admin_viewaddcontract(request, confurlname, sponsorid, contractid): + conference = get_authenticated_conference(request, confurlname) + sponsor = get_object_or_404(Sponsor, id=sponsorid, conference=conference) + + if not sponsor.confirmed: # Cannot-happen + raise Http404("Page not valid for unconfirmed sponsors") + + acontract = get_object_or_404(SponsorAdditionalContract.objects.select_related('contract', 'digitalcontract', 'digitalcontract__digisigncompleteddocument'), sponsor=sponsor, completed__isnull=False, digitalcontract__completed__isnull=False) + + resp = HttpResponse(content_type='application/pdf') + resp['Content-disposition'] = 'filename="%s.pdf"' % acontract.contract.contractname + resp.write(acontract.digitalcontract.digisigncompleteddocument.completedpdf) + return resp diff --git a/postgresqleu/digisign/implementations/signwell.py b/postgresqleu/digisign/implementations/signwell.py index 6b1df6c3..fd82a4b4 100644 --- a/postgresqleu/digisign/implementations/signwell.py +++ b/postgresqleu/digisign/implementations/signwell.py @@ -7,7 +7,7 @@ from django.conf import settings from postgresqleu.util.widgets import StaticTextWidget from postgresqleu.digisign.backendforms import BackendProviderForm -from postgresqleu.digisign.models import DigisignDocument, DigisignLog +from postgresqleu.digisign.models import DigisignDocument, DigisignCompletedDocument, DigisignLog from postgresqleu.digisign.util import digisign_handlers import base64 @@ -281,6 +281,14 @@ class Signwell(BaseProvider): }, timeout=10) time.sleep(10) + def fetch_completed(self, doc): + print("Fetching completed document {}".format(doc.documentid)) + r = requests.get('https://www.signwell.com/api/v1/documents/{}/completed_pdf/'.format(doc.documentid), headers={ + 'X-Api-Key': self.provider.config.get('apikey'), + }, timeout=60) + r.raise_for_status() + DigisignCompletedDocument(document=doc, completedpdf=r.content).save() + def process_webhook(self, request): if 'application/json' not in request.META['CONTENT_TYPE']: return HttpResponse("Invalid content type", status=400) diff --git a/postgresqleu/digisign/migrations/0003_digisigncompleteddocument.py b/postgresqleu/digisign/migrations/0003_digisigncompleteddocument.py new file mode 100644 index 00000000..4c8d531a --- /dev/null +++ b/postgresqleu/digisign/migrations/0003_digisigncompleteddocument.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.14 on 2023-11-14 13:54 + +from django.db import migrations, models +import django.db.models.deletion +import postgresqleu.util.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('digisign', '0002_contract_dates'), + ] + + operations = [ + migrations.CreateModel( + name='DigisignCompletedDocument', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('completedpdf', postgresqleu.util.fields.PdfBinaryField(blank=True, max_length=1000000, verbose_name='Document PDF')), + ('document', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='digisign.digisigndocument')), + ], + ), + ] diff --git a/postgresqleu/digisign/models.py b/postgresqleu/digisign/models.py index 6d14f2dd..fd0cc0ba 100644 --- a/postgresqleu/digisign/models.py +++ b/postgresqleu/digisign/models.py @@ -2,6 +2,8 @@ from django.db import models import json +from postgresqleu.util.fields import PdfBinaryField + class DigisignProvider(models.Model): name = models.CharField(max_length=100, null=False, blank=False, unique=True) @@ -40,6 +42,15 @@ class DigisignDocument(models.Model): ('documentid', 'provider'), ) + @property + def has_completed_pdf(self): + return self.digisigncompleteddocument is not None + + +class DigisignCompletedDocument(models.Model): + document = models.OneToOneField(DigisignDocument, null=False, blank=False, on_delete=models.CASCADE) + completedpdf = PdfBinaryField(null=False, blank=True, max_length=1000000, verbose_name='Document PDF') + class DigisignLog(models.Model): provider = models.ForeignKey(DigisignProvider, null=False, blank=False, on_delete=models.CASCADE) diff --git a/postgresqleu/digisign/util.py b/postgresqleu/digisign/util.py index f8809737..81e38e09 100644 --- a/postgresqleu/digisign/util.py +++ b/postgresqleu/digisign/util.py @@ -1,5 +1,9 @@ from django.utils import timezone +from datetime import timedelta + +from postgresqleu.scheduler.util import trigger_immediate_job_run + digisign_providers = { 'postgresqleu.digisign.implementations.signwell.Signwell': (), @@ -24,6 +28,7 @@ class DigisignHandlerBase: def completed(self): self.doc.completed = timezone.now() self.doc.save(update_fields=['completed', ]) + trigger_immediate_job_run('digisign_fetch_completed', timedelta(minutes=1)) def expired(self): pass |