Skip to content

Commit dfe29bb

Browse files
authored
Merge pull request #80 from novafloss/74_drop_compat
Refs #74 - drop callback support
2 parents 22544bb + 905eb39 commit dfe29bb

File tree

12 files changed

+18
-537
lines changed

12 files changed

+18
-537
lines changed

CHANGELOG

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ about future releases, check `milestones`_ and :doc:`/about/vision`.
88
2.2 (unreleased)
99
----------------
1010

11-
- Nothing changed yet.
11+
- Feature #74 - Drop callback support.
1212

1313

1414
2.1 (2017-03-25)

CONTRIBUTING.rst

-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ get the setup. Here is an example to run the tests:
8888
DOCUSIGN_INTEGRATOR_KEY='your-integrator-key' \
8989
DOCUSIGN_TEST_TEMPLATE_ID='UUID-of-your-docusign-template' \
9090
DOCUSIGN_TEST_SIGNER_RETURN_URL='http://example.com/signer-return/' \
91-
DOCUSIGN_TEST_CALLBACK_URL='http://example.com/callback/' \
9291
make test
9392
9493

demo/django_docusign_demo/forms.py

-22
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ class SettingsForm(forms.Form):
3535
min_value=0.001,
3636
max_value=30,
3737
)
38-
use_callback = forms.BooleanField(
39-
label=_('use callback'),
40-
required=False,
41-
)
4238

4339

4440
class CreateSignatureForm(forms.Form):
@@ -55,15 +51,6 @@ class CreateSignatureForm(forms.Form):
5551
formset_factory(django_docusign.SignerForm, extra=2),
5652
label=_('signers'),
5753
)
58-
callback_url = forms.URLField(
59-
label=_('API callback URL'),
60-
)
61-
62-
def __init__(self, *args, **kwargs):
63-
use_callback = kwargs.pop('use_callback')
64-
super(CreateSignatureForm, self).__init__(*args, **kwargs)
65-
if not use_callback:
66-
del self.fields['callback_url']
6754

6855

6956
class CreateSignatureTemplateForm(forms.Form):
@@ -81,12 +68,3 @@ class CreateSignatureTemplateForm(forms.Form):
8168
formset_factory(django_docusign.SignerForm, extra=2),
8269
label=_('signers'),
8370
)
84-
callback_url = forms.URLField(
85-
label=_('API callback URL'),
86-
)
87-
88-
def __init__(self, *args, **kwargs):
89-
use_callback = kwargs.pop('use_callback')
90-
super(CreateSignatureTemplateForm, self).__init__(*args, **kwargs)
91-
if not use_callback:
92-
del self.fields['callback_url']

demo/django_docusign_demo/templates/signer_return.html

-9
This file was deleted.

demo/django_docusign_demo/tests.py

+2-148
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import django.test
1313
from django.test.utils import override_settings
1414

15-
import pydocusign
16-
import pydocusign.test
1715
from django_docusign import api as django_docusign
1816

1917
from django_docusign_demo import models, views
@@ -107,7 +105,6 @@ def create_signature(self):
107105
'signers-1-email': u'paul@example.com',
108106
'document': document_file,
109107
'title': u'A very simple PDF document',
110-
'callback_url': u'http://tech.novapost.fr',
111108
}
112109
response = self.client.post(url, data)
113110
self.assertEqual(response.status_code, 302)
@@ -118,19 +115,7 @@ def test_form_valid(self):
118115
"""Can create a signature using 'create_signature' URL."""
119116
self.assertTrue(self.signature.signature_backend_id)
120117

121-
def test_create_signature_callback_enabled(self):
122-
session = self.client.session
123-
session['use_callback'] = True
124-
session.save()
125-
126-
with mock.patch(self.pydocusign_create_envelope_method) \
127-
as mock_envelope:
128-
mock_envelope.return_value = str(uuid.uuid4())
129-
self.assertTrue(self.signature.signature_backend_id)
130-
envelope = mock_envelope.call_args_list[0][0][0]
131-
self.assertIsNotNone(envelope.eventNotification)
132-
133-
def test_create_signature_callback_disabled(self):
118+
def test_create_signature_no_event(self):
134119
with mock.patch(self.pydocusign_create_envelope_method) \
135120
as mock_envelope:
136121
mock_envelope.return_value = str(uuid.uuid4())
@@ -147,27 +132,6 @@ def test_signer_view(self):
147132
self.assertTrue(
148133
response['Location'].startswith('https://demo.docusign.net'))
149134

150-
@mock.patch('pydocusign.DocuSignClient.get_envelope_recipients')
151-
def test_signer_return_view_callback_enabled(self, mock_recipients):
152-
session = self.client.session
153-
session['use_callback'] = True
154-
session.save()
155-
156-
signature = self.create_signature()
157-
signer = signature.signers.all()[0]
158-
159-
url = reverse('anysign:signer_return', args=[signer.pk])
160-
response = self.client.get(url)
161-
self.assertFalse(mock_recipients.called)
162-
self.assertEqual(response.status_code, 302)
163-
self.assertRedirects(
164-
response,
165-
reverse('anysign:signer_return_with_callback', args=[signer.pk]))
166-
signature.refresh_from_db()
167-
signer.refresh_from_db()
168-
self.assertEqual(signature.status, 'draft')
169-
self.assertEqual(signer.status, 'draft')
170-
171135
@mock.patch('pydocusign.DocuSignClient.get_envelope_recipients')
172136
def test_signer_return_canceled(self, mock_recipients):
173137
signature = self.create_signature()
@@ -363,112 +327,6 @@ def test_signer_all_signed(self, mock_recipients):
363327
self.assertEqual(signer1.status, 'completed')
364328
self.assertEqual(signer2.status, 'completed')
365329

366-
def send_signature_callback(self, data):
367-
url = reverse('anysign:signature_callback')
368-
request_body = pydocusign.test.generate_notification_callback_body(
369-
data=data,
370-
template_url='http://diecutter.io/github/'
371-
'novafloss/pydocusign/master/'
372-
'pydocusign/templates/callback.xml')
373-
response = self.client.post(
374-
url,
375-
content_type='text/xml',
376-
data=request_body,
377-
)
378-
self.assertEqual(response.status_code, 200)
379-
return response
380-
381-
def test_signature_callback(self):
382-
"""Callback view handles DocuSign's 'sent' status."""
383-
signature = self.create_signature()
384-
self.assertEqual(signature.signers.get(signing_order=1).status,
385-
'draft')
386-
self.assertEqual(signature.signers.get(signing_order=2).status,
387-
'draft')
388-
signers = signature.signers.all().order_by('signing_order')
389-
data = {
390-
"RecipientStatuses": [
391-
{
392-
"Email": signer.email,
393-
"UserName": signer.full_name,
394-
"ClientUserId": signer.pk,
395-
"Status": pydocusign.Recipient.STATUS_SENT,
396-
"Sent": "2014-10-06T01:10:01.000012",
397-
} for signer in signers
398-
399-
],
400-
"EnvelopeId": signature.signature_backend_id,
401-
"Subject": signature.document_title,
402-
"UserName": "Bob",
403-
"Created": "2014-10-06T01:10:00.000012",
404-
"Sent": "2014-10-06T01:10:01.000012",
405-
}
406-
# First, we receive "sent" callback.
407-
self.send_signature_callback(data)
408-
signature.refresh_from_db()
409-
self.assertEqual(signature.signers.get(signing_order=1).status,
410-
'sent')
411-
self.assertEqual(signature.signers.get(signing_order=2).status,
412-
'sent')
413-
# Then, envelope is "delivered" to recipients.
414-
data['RecipientStatuses'][0]['Status'] = "Delivered"
415-
data['RecipientStatuses'][0]['Delivered'] = "2014-10-06" \
416-
"T01:10:02.000012"
417-
self.send_signature_callback(data)
418-
signature.refresh_from_db()
419-
self.assertEqual(signature.signers.get(signing_order=1).status,
420-
'delivered')
421-
self.assertEqual(signature.signers.get(signing_order=2).status,
422-
'sent')
423-
# A recipient signs.
424-
data['RecipientStatuses'][0]['Status'] = "Signed"
425-
data['RecipientStatuses'][0]['Signed'] = "2014-10-06" \
426-
"T01:10:03.000012"
427-
self.send_signature_callback(data)
428-
signature.refresh_from_db()
429-
self.assertEqual(signature.status, 'sent')
430-
self.assertEqual(signature.signers.get(signing_order=1).status,
431-
'completed')
432-
self.assertEqual(signature.signers.get(signing_order=2).status,
433-
'sent')
434-
# Last recipient signs.
435-
data['RecipientStatuses'][1]['Status'] = "Signed"
436-
data['RecipientStatuses'][1]['Signed'] = "2014-10-06" \
437-
"T01:10:04.000012"
438-
data['Status'] = "Completed"
439-
data['Completed'] = "2014-10-06T01:10:04.000012"
440-
self.send_signature_callback(data)
441-
signature.refresh_from_db()
442-
self.assertEqual(signature.status, 'completed')
443-
self.assertEqual(signature.signers.get(signing_order=1).status,
444-
'completed')
445-
self.assertEqual(signature.signers.get(signing_order=2).status,
446-
'completed')
447-
# But we could also have received "decline" callback.
448-
del data['Completed']
449-
del data['RecipientStatuses'][1]['Signed']
450-
data['RecipientStatuses'][1]['Status'] = "Declined"
451-
data['RecipientStatuses'][1]['Declined'] = "2014-10-06" \
452-
"T01:10:05.000012"
453-
data['Status'] = "Declined"
454-
data['Declined'] = "2014-10-06T01:10:05.000012"
455-
self.send_signature_callback(data)
456-
signature.refresh_from_db()
457-
self.assertEqual(signature.status, 'declined')
458-
self.assertEqual(signature.signers.get(signing_order=1).status,
459-
'completed')
460-
self.assertEqual(signature.signers.get(signing_order=2).status,
461-
'declined')
462-
self.assertEqual(signature.signers.get(signing_order=2).status_details,
463-
u'')
464-
# Make sure we handle optional "decline reason" as well.
465-
data['RecipientStatuses'][1]['DeclineReason'] = "Do not sign a test!"
466-
self.send_signature_callback(data)
467-
signature.refresh_from_db()
468-
self.assertEqual(signature.status, 'declined')
469-
self.assertEqual(signature.signers.get(signing_order=2).status_details,
470-
u'Do not sign a test!')
471-
472330

473331
class SignatureTemplateFunctionalTestCase(SignatureFunctionalTestCase):
474332
"""Functional test suite for signature template workflow."""
@@ -491,7 +349,6 @@ def create_signature(self):
491349
'signers-1-email': u'paul@example.com',
492350
'template_id': template_id,
493351
'title': u'A very simple PDF document',
494-
'callback_url': u'http://tech.novapost.fr',
495352
}
496353
response = self.client.post(url, data)
497354
self.assertEqual(response.status_code, 302)
@@ -517,11 +374,9 @@ def test_setup_explicit(self):
517374
'app_token': 'some-token',
518375
'timeout': 300.0,
519376
}
520-
backend = django_docusign.DocuSignBackend(
521-
use_callback=True, **explicit_options)
377+
backend = django_docusign.DocuSignBackend(**explicit_options)
522378
for key, value in explicit_options.items():
523379
self.assertEqual(getattr(backend.docusign_client, key), value)
524-
self.assertTrue(backend.use_callback)
525380

526381
def test_setup_settings(self):
527382
"""DocuSignBackend uses settings.DOCUSIGN_*."""
@@ -539,7 +394,6 @@ def test_setup_settings(self):
539394
for key, value in overrides.items():
540395
key = key.lower()[len('DOCUSIGN_'):]
541396
self.assertEqual(getattr(backend.docusign_client, key), value)
542-
self.assertFalse(backend.use_callback)
543397

544398
def test_setup_priority(self):
545399
"""Explicit arguments have priority over settings."""

demo/django_docusign_demo/urls.py

-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from django.conf import settings
22
from django.conf.urls import url, include
33
from django.conf.urls.static import static
4-
from django.views.decorators.csrf import csrf_exempt
54

65
from django_docusign_demo import views
76

@@ -12,12 +11,10 @@
1211
create_signature_template_view = views.CreateSignatureTemplateView.as_view()
1312
signer_view = views.SignerView.as_view()
1413
signer_return_view = views.SignerReturnView.as_view()
15-
signer_return_with_callback_view = views.SignerReturnWithCallbackView.as_view()
1614
signer_canceled_view = views.SignerCanceledView.as_view()
1715
signer_error_view = views.SignerErrorView.as_view()
1816
signer_declined_view = views.SignerDeclinedView.as_view()
1917
signer_signed_view = views.SignerSignedView.as_view()
20-
signature_callback_view = csrf_exempt(views.SignatureCallbackView.as_view())
2118

2219

2320
urlpatterns = [
@@ -34,9 +31,6 @@
3431
url(r'^signer/(?P<pk>\d+)/return/$',
3532
signer_return_view,
3633
name='signer_return'),
37-
url(r'^signer/(?P<pk>\d+)/return-with-callback/$',
38-
signer_return_with_callback_view,
39-
name='signer_return_with_callback'),
4034
url(r'^signer/(?P<pk>\d+)/canceled/$',
4135
signer_canceled_view,
4236
name='signer_canceled'),
@@ -49,9 +43,6 @@
4943
url(r'^signer/(?P<pk>\d+)/signed/$',
5044
signer_signed_view,
5145
name='signer_signed'),
52-
url(r'signature/callback/$',
53-
signature_callback_view,
54-
name='signature_callback')
5546
],
5647
namespace='anysign',
5748
app_name='anysign',

0 commit comments

Comments
 (0)