summaryrefslogtreecommitdiff
path: root/postgresqleu/digisign
diff options
context:
space:
mode:
authorMagnus Hagander2023-11-14 14:40:23 +0000
committerMagnus Hagander2023-11-14 14:40:23 +0000
commit1cf692e9e2ee60403261b6c360ec55090fe84dfe (patch)
tree8e398534aff37c0b5efe3f52f4308aa2aa17f1aa /postgresqleu/digisign
parent2ab6df0872e54107b1f890d282d66949267595bd (diff)
Download completed digital contracts and store them in the db
For now, also allow viewing of the contracts from the administrative interface by organizers, but not yet by the sponsors themselves (no reason not to, just one step at a time).
Diffstat (limited to 'postgresqleu/digisign')
-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
4 files changed, 48 insertions, 1 deletions
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