Skip to content
This repository was archived by the owner on Jan 17, 2025. It is now read-only.

Commit 7463579

Browse files
add disposition and status models, methods for respondent gateway
1 parent 5fb4bfa commit 7463579

File tree

4 files changed

+124
-4
lines changed

4 files changed

+124
-4
lines changed

README.md

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ signed_url = gateway.sign_url(url, url_quoting=True)
7070
##### Valid URL
7171
```
7272
# Termination Endlink
73-
end_url = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T16:50:53.899Z&signature=15da726b7802bda810c059ee1604f8fd1237a0618c29185c6b16f09e14242278"
73+
end_url = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456&disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T19:23:23.439Z&signature=d351ff102b3ae6252d47fd54b859ecaf38c2701f214c233848bbdf64c0bc7fe1"
7474
7575
gateway.verify_url(end_url)
7676
7777
# True
7878
```
7979
##### Missing Signature
8080
```
81-
missing_signature = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T16:50:53.899Z"
81+
missing_signature = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456&disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T19:23:23.439Z"
8282
8383
gateway.verify_url(missing_signature)
8484
@@ -88,10 +88,42 @@ gateway.verify_url(missing_signature)
8888
```
8989
# Disposition changed to 1 (from 2) and status to 0 (from 1)
9090
91-
altered_parameters = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456disposition=1&status=0&access_key=rex_access_key&expiration=2021-11-24T16:50:53.899Z&signature=15da726b7802bda810c059ee1604f8fd1237a0618c29185c6b16f09e14242278"
91+
altered_parameters = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456&disposition=1&status=0&access_key=rex_access_key&expiration=2021-11-24T19:23:23.439Z&signature=d351ff102b3ae6252d47fd54b859ecaf38c2701f214c233848bbdf64c0bc7fe1"
9292
9393
gateway.verify_url(altered_parameters)
9494
9595
# False
9696
```
97+
##### Get Disposition of a Survey from Endlink
98+
```
99+
termination = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456&disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T19:23:23.439Z&signature=d351ff102b3ae6252d47fd54b859ecaf38c2701f214c233848bbdf64c0bc7fe1"
100+
101+
disposition = gateway.get_respondent_disposition(termination)
102+
103+
# <GatewayDispositionsEnum.TERMINATION: 2>
104+
105+
disposition.name
106+
107+
# 'TERMINATION'
108+
109+
disposition.value
110+
111+
# 2
112+
```
113+
114+
##### Get Disposition + Status of a Survey from Endlink
115+
```
116+
termination = "https://respondent.fake.rex.dynata.com/end?ctx=XXXX&transaction_id=123456&disposition=2&status=1&access_key=rex_access_key&expiration=2021-11-24T19:23:23.439Z&signature=d351ff102b3ae6252d47fd54b859ecaf38c2701f214c233848bbdf64c0bc7fe1"
117+
118+
status = gateway.get_respondent_status(termination)
119+
120+
#<GatewayStatusEnum.TERMINATION_DYNATA: (<GatewayDispositionsEnum.TERMINATION: 2>, 1)>
121+
122+
status.name
123+
124+
# 'TERMINATION_DYNATA'
125+
126+
status.value
97127
128+
# (<GatewayDispositionsEnum.TERMINATION: 2>, 1)
129+
```

dynata_rex/models/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
Opportunity
2323
)
2424

25+
from .respondent_gateway import (
26+
GatewayGenderEnum,
27+
GatewayDispositionsEnum,
28+
GatewayStatusEnum
29+
)
30+
2531

2632
__all__ = [
2733
'HashableModel',
@@ -40,5 +46,8 @@
4046
'Links',
4147
'Quota',
4248
'Filter',
43-
'Opportunity'
49+
'Opportunity',
50+
'GatewayGenderEnum',
51+
'GatewayDispositionsEnum',
52+
'GatewayStatusEnum'
4453
]
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""
2+
Package: dynata-rex.models
3+
Filename: respondent_gateway.py
4+
Author(s): Grant W
5+
6+
Description: Implementation of dataclasses for Respondent Gateway
7+
"""
8+
# Python Imports
9+
from enum import Enum
10+
11+
12+
class GatewayGenderEnum(Enum):
13+
MALE = 1
14+
FEMALE = 2
15+
16+
17+
class GatewayDispositionsEnum(Enum):
18+
UNKNOWN = 0
19+
COMPLETE = 1
20+
TERMINATION = 2
21+
OVERQUOTA = 3
22+
DUPLICATE = 4
23+
QUALITY = 5
24+
25+
26+
class GatewayStatusEnum(Enum):
27+
"""
28+
Composite status code from Disposition + non-unique status code
29+
Must call as tuple of Gateway Disposition + Status code
30+
ie
31+
>>> disp_code, status_code = 1, 0
32+
>>> disp = GatewayDispositionsEnum(disp_code)
33+
>>> status = RespondentGatewayStatusEnum((disp, status_code))
34+
>>> status.name
35+
'COMPLETE_DEFAULT`
36+
>>> status.value
37+
(<GatewayDispositionsEnum.COMPLETE: 1>, 0)
38+
"""
39+
UNKNOWN_DEFAULT = GatewayDispositionsEnum.UNKNOWN, 0
40+
COMPLETE_DEFAULT = GatewayDispositionsEnum.COMPLETE, 0
41+
COMPLETE_PARTIAL = GatewayDispositionsEnum.COMPLETE, 1
42+
TERMINATION_DYNATA = GatewayDispositionsEnum.TERMINATION, 1
43+
TERMINATION_CLIENT = GatewayDispositionsEnum.TERMINATION, 2
44+
OVERQUOTA_DYNATA = GatewayDispositionsEnum.OVERQUOTA, 1
45+
OVERQUOTA_CLIENT = GatewayDispositionsEnum.OVERQUOTA, 2
46+
DUPLICATE_DEFAULT = GatewayDispositionsEnum.DUPLICATE, 0
47+
QUALITY_ANSWER = GatewayDispositionsEnum.QUALITY, 1
48+
QUALITY_SPEEDING = GatewayDispositionsEnum.QUALITY, 2
49+
QUALITY_SUSPENDED = GatewayDispositionsEnum.QUALITY, 3

dynata_rex/respondent_gateway.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# Third Party Imports
1414

1515
# Local Imports
16+
from dynata_rex.models import GatewayDispositionsEnum, GatewayStatusEnum
1617
from .signer import Signer
1718
from .exceptions import SignatureExpiredException, SignatureInvalidException
1819

@@ -113,3 +114,32 @@ def verify_url(self,
113114
SignatureExpiredException,
114115
SignatureInvalidException):
115116
return False
117+
118+
def get_respondent_disposition(
119+
self, url) -> Union[GatewayDispositionsEnum, None]:
120+
"""
121+
Get the disposition of a respondent from a URL
122+
"""
123+
parsed = urlparse(url)
124+
query_parameters = dict(parse_qsl(parsed.query))
125+
try:
126+
disposition = int(query_parameters['disposition'])
127+
return GatewayDispositionsEnum(disposition)
128+
except KeyError:
129+
return None
130+
131+
def get_respondent_status(
132+
self, url) -> Union[GatewayStatusEnum, None]:
133+
"""
134+
Get the status of a respondent from a URL
135+
"""
136+
parsed = urlparse(url)
137+
query_parameters = dict(parse_qsl(parsed.query))
138+
disposition = self.get_respondent_disposition(url)
139+
if not disposition:
140+
return None
141+
try:
142+
status = int(query_parameters['status'])
143+
return GatewayStatusEnum((disposition, status))
144+
except KeyError:
145+
return None

0 commit comments

Comments
 (0)