summaryrefslogtreecommitdiff
path: root/postgresqleu
diff options
context:
space:
mode:
Diffstat (limited to 'postgresqleu')
-rw-r--r--postgresqleu/confsponsor/urls.py2
-rw-r--r--postgresqleu/confsponsor/views.py40
-rw-r--r--postgresqleu/digisign/implementations/signwell.py10
-rw-r--r--postgresqleu/digisign/migrations/0003_digisigncompleteddocument.py23
-rw-r--r--postgresqleu/digisign/models.py11
-rw-r--r--postgresqleu/digisign/util.py5
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