Skip to content

Commit 0c7616f

Browse files
Merge branch 'upstream'
# Conflicts: # connect/models/__init__.py # connect/models/event.py
2 parents 4af8fba + 3a87d3a commit 0c7616f

File tree

5 files changed

+58
-49
lines changed

5 files changed

+58
-49
lines changed

connect/config.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class Config(object):
1414
:param str api_key: Service user ApiKey.
1515
:param str|list[str] products: Optional product ids.
1616
:param str file: Config file name.
17+
:raises ValueError: Raised if either ``file`` or one of ``api_url`` or ``api_key`` are missing.
18+
:raises TypeError: Raised if ``products`` is not a string or list of strings, or if config file
19+
does not contain JSON data.
20+
:raises IOError: Raised if the specified ``file`` could not be opened.
1721
"""
1822

1923
# Global instance
@@ -23,8 +27,7 @@ class Config(object):
2327
def __init__(self, api_url=None, api_key=None, products=None, file=None):
2428
# Check arguments
2529
if not file and not any([api_key, api_url]):
26-
raise ValueError('Filename or api_key and api_url are expected'
27-
'in Config initialization')
30+
raise ValueError('Expected file or api_key and api_url in Config initialization')
2831
if products and not isinstance(products, (str, list)):
2932
raise TypeError('Products can be string or string list. Found type '
3033
+ type(products).__name__)

connect/models/fulfillment.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,15 @@ def removed_items(self):
101101
self.asset.items))
102102

103103
def needs_migration(self, migration_key='migration_info'):
104-
# type: (str) -> bool
104+
"""
105+
Indicates whether the request contains data to be migrated from a legacy product.
106+
Migration is performed by an external service. All you have to do for a request that
107+
needs migration is to skip processing by raising a
108+
:py:class:`connect.exceptions.SkipRequest` exception.
109+
110+
:param str migration_key: The name of the parameter that contains the migration data
111+
(optional; default value is ``migration_info``).
112+
:return: Whether the request needs migrating.
113+
:rtype: bool
114+
"""
105115
return self.asset.get_param_by_id(migration_key) is not None

connect/resources/usage_automation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def get_usage_template(self, product):
7373
:param Product product: Specific product.
7474
:return: The template file contents.
7575
:rtype: bytes
76+
:raises FileRetrievalError: Raised if the file contents could not be retrieved.
7677
"""
7778
location = self._get_usage_template_download_location(product.id)
7879
if not location:
@@ -94,6 +95,7 @@ def submit_usage(self, usage_file, usage_records):
9495
:param list[UsageRecord] usage_records: Records.
9596
:return: Usage file.
9697
:rtype: UsageFile
98+
:raises FileCreationError: Raised if creation or uploading of the file fails.
9799
"""
98100
usage_file = self._create_usage_file(usage_file)
99101
self._upload_usage_records(usage_file, usage_records)

docs/api_reference.rst

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ exceptions
1313
.. automodule:: connect.exceptions
1414
:members:
1515

16-
logger
17-
======
18-
19-
.. automodule:: connect.logger
20-
:members:
21-
2216
models
2317
======
2418

@@ -30,9 +24,3 @@ resources
3024

3125
.. automodule:: connect.resources
3226
:members:
33-
34-
migration_handler
35-
=================
36-
37-
.. automodule:: connect.migration_handler
38-
:members:

examples/fulfillment.py

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,41 +26,47 @@ class FulfillmentExample(FulfillmentAutomation):
2626
def process_request(self, request):
2727
# type: (Fulfillment) -> Union[ActivationTemplateResponse, ActivationTileResponse]
2828

29-
logger.info('Processing request {} for contract {}, product {}, marketplace {}'
30-
.format(request.id,
31-
request.contract.id,
32-
request.asset.product.name,
33-
request.marketplace.name))
34-
35-
# Custom logic
36-
if request.type == 'purchase':
37-
for item in request.asset.items:
38-
if item.quantity > 100000:
39-
raise FailRequest(
40-
message='Is Not possible to purchase product')
41-
42-
for param in request.asset.params:
43-
if param.name == 'email' and not param.value:
44-
param.value_error = 'Email address has not been provided, please provide one'
45-
raise InquireRequest(params=[param])
46-
47-
# Approve by ActivationTile
48-
return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, you decided '
49-
'to have an account in our amazing service!')
50-
# Or
51-
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
52-
53-
# Approve by Template
54-
# return ActivationTemplateResponse('TL-497-535-242')
55-
# Or
56-
# return TemplateResource().get(pk='TEMPLATE_ID')
57-
58-
elif request.type == 'change':
59-
# Fail
60-
raise FailRequest()
61-
else:
62-
# Skip request
29+
if request.needs_migration():
30+
# Skip request if it needs migration (migration is performed by an external service)
31+
logger.info('Skipping request {} because it needs migration.'.format(request.id))
6332
raise SkipRequest()
33+
else:
34+
logger.info('Processing request {} for contract {}, product {}, marketplace {}'
35+
.format(request.id,
36+
request.contract.id,
37+
request.asset.product.name,
38+
request.marketplace.name))
39+
40+
# Custom logic
41+
if request.type == 'purchase':
42+
for item in request.asset.items:
43+
if item.quantity > 100000:
44+
raise FailRequest(
45+
message='Is Not possible to purchase product')
46+
47+
for param in request.asset.params:
48+
if param.name == 'email' and not param.value:
49+
param.value_error = 'Email address has not been provided, ' \
50+
'please provide one'
51+
raise InquireRequest(params=[param])
52+
53+
# Approve by ActivationTile
54+
return ActivationTileResponse('\n # Welcome to Fallball!\n\nYes, you decided '
55+
'to have an account in our amazing service!')
56+
# Or
57+
# return TemplateResource().render(pk='TEMPLATE_ID', request_id=request.id)
58+
59+
# Approve by Template
60+
# return ActivationTemplateResponse('TL-497-535-242')
61+
# Or
62+
# return TemplateResource().get(pk='TEMPLATE_ID')
63+
64+
elif request.type == 'change':
65+
# Fail
66+
raise FailRequest()
67+
else:
68+
# Skip request
69+
raise SkipRequest()
6470

6571

6672
if __name__ == '__main__':

0 commit comments

Comments
 (0)