Skip to content

Commit 7db1965

Browse files
Merge pull request #23 from JaviCerveraIngram/tier-config-requests
Tier Config Requests
2 parents 1ead321 + fb93dcd commit 7db1965

17 files changed

+704
-60
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ $ pip install connect-sdk
3737

3838
### Example
3939
```python
40-
from connect import FulfillmentAutomation
40+
from connect import FulfillmentAutomation, TierConfigAutomation
4141
from connect.logger import logger
4242
from connect.models import ActivationTemplateResponse, ActivationTileResponse
4343
from connect.models.exception import FulfillmentFail, FulfillmentInquire, Skip
@@ -83,8 +83,16 @@ class ExampleRequestProcessor(FulfillmentAutomation):
8383
raise Skip()
8484

8585

86+
class ExampleTierConfigRequestProcessor(TierConfigAutomation):
87+
def process_request(self, request):
88+
pass
89+
90+
8691
if __name__ == '__main__':
8792
request_processor = ExampleRequestProcessor()
8893
request_processor.process()
94+
95+
tier_config_request_processor = ExampleTierConfigRequestProcessor()
96+
tier_config_request_processor.process()
8997
```
9098

connect/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
Copyright (c) 2019 Ingram Micro. All Rights Reserved.
66
"""
77

8-
from .resource import FulfillmentAutomation
8+
from .resource import FulfillmentAutomation, TierConfigAutomation
99

1010
name = 'connect'
1111

@@ -14,5 +14,6 @@
1414
'resource',
1515
'models',
1616
'logger',
17-
'FulfillmentAutomation'
17+
'FulfillmentAutomation',
18+
'TierConfigAutomation',
1819
]

connect/models/activation_response.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class ActivationTileResponse(object):
1212
tile = 'Activation succeeded' # type: str
1313

14-
def __init__(self, markdown=None):
14+
def __init__(self, markdown=''):
1515
# type: (str) -> None
1616
try:
1717
self.tile = json.loads(markdown)

connect/models/asset.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
from marshmallow import fields, post_load
9-
from typing import List
9+
from typing import List, Optional
1010

1111
from .base import BaseModel, BaseSchema
1212
from .connection import Connection, ConnectionSchema
@@ -26,12 +26,14 @@ class Asset(BaseModel):
2626
tiers = None # type: Tiers
2727

2828
def get_param_by_id(self, id_):
29+
# type: (str) -> Optional[Param]
2930
try:
3031
return list(filter(lambda param: param.id == id_, self.params))[0]
3132
except IndexError:
3233
return None
3334

3435
def get_item_by_mpn(self, mpn):
36+
# type: (str) -> Optional[Item]
3537
try:
3638
return list(filter(lambda item: item.mpn == mpn, self.items))[0]
3739
except IndexError:

connect/models/marketplace.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ class Contract(BaseModel):
7878
agreement = None # type: Agreement
7979
marketplace = None # type: Marketplace
8080
owner = None # type: Company
81-
creater = None # type: Company
8281
created = None # type: str
8382
updated = None # type: str
8483
enrolled = None # type: str
@@ -95,7 +94,6 @@ class ContractSchema(BaseSchema):
9594
agreement = fields.Nested(AgreementSchema, only=('id', 'name'))
9695
marketplace = fields.Nested(MarketplaceSchema, only=('id', 'name'))
9796
owner = fields.Nested(CompanySchema, only=('id', 'name'))
98-
creater = fields.Nested(CompanySchema, only=('id', 'name'))
9997
created = fields.DateTime()
10098
updated = fields.DateTime()
10199
enrolled = fields.Str()

connect/models/parameters.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,25 @@ class ValueChoice(BaseModel):
1616
label = None # type: str
1717

1818

19+
class Constraints(BaseModel):
20+
hidden = None # type: bool
21+
required = None # type: bool
22+
choices = None # type: List[ValueChoice]
23+
24+
25+
class Param(BaseModel):
26+
name = None # type: str
27+
type = None # type: str
28+
value = None # type: str
29+
value_choices = None # type: List[ValueChoice]
30+
value_error = None # type: str
31+
32+
# Undocumented fields (they appear in PHP SDK)
33+
title = None # type: str
34+
scope = None # type: str
35+
constraints = None # type: Constraints
36+
37+
1938
class ValueChoiceSchema(Schema):
2039
value = fields.Str()
2140
label = fields.Str()
@@ -25,12 +44,14 @@ def make_object(self, data):
2544
return ValueChoice(**data)
2645

2746

28-
class Param(BaseModel):
29-
name = None # type: str
30-
type = None # type: str
31-
value = None # type: str
32-
value_choices = None # type: List[ValueChoice]
33-
value_error = None # type: str
47+
class ConstraintsSchema(BaseSchema):
48+
hidden = fields.Bool()
49+
required = fields.Bool()
50+
choices = fields.List(fields.Nested(ValueChoiceSchema))
51+
52+
@post_load
53+
def make_object(self, data):
54+
return Constraints(**data)
3455

3556

3657
class ParamSchema(BaseSchema):
@@ -40,6 +61,11 @@ class ParamSchema(BaseSchema):
4061
value_choices = fields.List(fields.Nested(ValueChoiceSchema))
4162
value_error = fields.Str()
4263

64+
# Undocumented fields (they appear in PHP SDK)
65+
title = fields.Str(required=False)
66+
scope = fields.Str(required=False)
67+
constraints = fields.Nested(ConstraintsSchema, required=False)
68+
4369
@post_load
4470
def make_object(self, data):
4571
return Param(**data)

connect/models/tier_config.py

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
This file is part of the Ingram Micro Cloud Blue Connect SDK.
5+
Copyright (c) 2019 Ingram Micro. All Rights Reserved.
6+
"""
7+
from marshmallow import fields, post_load
8+
from typing import Optional, List
9+
10+
from connect.models import Param, ParamSchema
11+
from connect.models.base import BaseModel, BaseSchema
12+
from connect.models.company import Company, CompanySchema
13+
from connect.models.connection import Connection, ConnectionSchema
14+
from connect.models.contact import ContactInfo, ContactInfoSchema
15+
from connect.models.product import Product, ProductSchema
16+
17+
18+
class Account(BaseModel):
19+
name = None # type: str
20+
external_id = None # type: str
21+
external_uid = None # type: str
22+
contact_info = None # type: ContactInfo
23+
24+
25+
class EventInfo(BaseModel):
26+
at = None # type: str
27+
by = None # type: Company
28+
29+
30+
class Events(BaseModel):
31+
created = None # type: EventInfo
32+
inquired = None # type: EventInfo
33+
pended = None # type: EventInfo
34+
validated = None # type: EventInfo
35+
updated = None # type: EventInfo
36+
37+
38+
class Template(BaseModel):
39+
representation = None # type: str
40+
41+
42+
class TierConfig(BaseModel):
43+
name = None # type: str
44+
account = None # type: Account
45+
product = None # type: Product
46+
tier_level = None # type: int
47+
connection = None # type: Connection
48+
events = None # type: Events
49+
params = None # type: List[Param]
50+
template = None # type: Template
51+
52+
# Undocumented fields (they appear in PHP SDK)
53+
open_request = None # type: BaseModel
54+
55+
def get_param_by_id(self, id_):
56+
# type: (str) -> Optional[Param]
57+
try:
58+
return list(filter(lambda param: param.id == id_, self.params))[0]
59+
except IndexError:
60+
return None
61+
62+
63+
class Activation(BaseModel):
64+
link = None # type: str
65+
66+
67+
class TierConfigRequest(BaseModel):
68+
type = None # type: str
69+
status = None # type: str
70+
configuration = None # type: TierConfig
71+
events = None # type: Events
72+
params = None # type: List[Param]
73+
assignee = None # type: Company
74+
template = None # type: Template
75+
activation = None # type: Activation
76+
77+
def get_param_by_id(self, id_):
78+
# type: (str) -> Optional[Param]
79+
try:
80+
return list(filter(lambda param: param.id == id_, self.params))[0]
81+
except IndexError:
82+
return None
83+
84+
85+
class AccountSchema(BaseSchema):
86+
name = fields.Str()
87+
external_id = fields.Str()
88+
external_uid = fields.Str()
89+
contact_info = fields.Nested(ContactInfoSchema)
90+
91+
@post_load
92+
def make_object(self, data):
93+
return Account(**data)
94+
95+
96+
class EventInfoSchema(BaseSchema):
97+
at = fields.Str()
98+
by = fields.Nested(CompanySchema)
99+
100+
@post_load
101+
def make_object(self, data):
102+
return EventInfo(**data)
103+
104+
105+
class EventsSchema(BaseSchema):
106+
created = fields.Nested(EventInfoSchema)
107+
inquired = fields.Nested(EventInfoSchema, required=False)
108+
pended = fields.Nested(EventInfoSchema, required=False)
109+
validated = fields.Nested(EventInfoSchema, required=False)
110+
updated = fields.Nested(EventInfoSchema, required=False)
111+
112+
@post_load
113+
def make_object(self, data):
114+
return Events(**data)
115+
116+
117+
class TemplateSchema(BaseSchema):
118+
representation = fields.Str()
119+
120+
@post_load
121+
def make_object(self, data):
122+
return Template(**data)
123+
124+
125+
class TierConfigSchema(BaseSchema):
126+
name = fields.Str()
127+
account = fields.Nested(AccountSchema)
128+
product = fields.Nested(ProductSchema)
129+
tier_level = fields.Int()
130+
connection = fields.Nested(ConnectionSchema)
131+
events = fields.Nested(EventsSchema)
132+
params = fields.List(fields.Nested(ParamSchema))
133+
template = fields.Nested(TemplateSchema)
134+
135+
# Undocumented fields (they appear in PHP SDK)
136+
open_request = fields.Nested(BaseSchema)
137+
138+
@post_load
139+
def make_object(self, data):
140+
return TierConfig(**data)
141+
142+
143+
class ActivationSchema(BaseSchema):
144+
link = fields.Str()
145+
146+
@post_load
147+
def make_object(self, data):
148+
return Activation(**data)
149+
150+
151+
class TierConfigRequestSchema(BaseSchema):
152+
type = fields.Str()
153+
status = fields.Str()
154+
configuration = fields.Nested(TierConfigSchema)
155+
events = fields.Nested(EventsSchema)
156+
params = fields.List(fields.Nested(ParamSchema))
157+
assignee = fields.Nested(CompanySchema)
158+
template = fields.Nested(TemplateSchema)
159+
activation = fields.Nested(ActivationSchema)
160+
161+
@post_load
162+
def make_object(self, data):
163+
return TierConfigRequest(**data)

connect/resource/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
"""
77

88
from .fulfillment_automation import FulfillmentAutomation
9-
from .fulfillment import FulfillmentResource
9+
from .automation import AutomationResource
1010
from .template import TemplateResource
11+
from .tier_config_automation import TierConfigAutomation
1112

1213

1314
__all__ = [
1415
'FulfillmentAutomation',
15-
'FulfillmentResource',
16-
'TemplateResource'
16+
'AutomationResource',
17+
'TemplateResource',
18+
'TierConfigAutomation',
1719
]
Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,37 @@
77

88
import json
99

10-
from typing import List
10+
from typing import Any, List, Dict
1111

1212
from connect.logger import function_log
13-
from connect.models import FulfillmentSchema, Param, ActivationTileResponse
13+
from connect.models import Param, ActivationTileResponse
1414
from .base import BaseResource
1515
from .template import TemplateResource
1616
from .utils import join_url
1717

1818

19-
class FulfillmentResource(BaseResource):
20-
resource = 'requests'
19+
class AutomationResource(BaseResource):
2120
limit = 1000
22-
schema = FulfillmentSchema()
2321

2422
def build_filter(self):
25-
# type: () -> dict
26-
filters = super(FulfillmentResource, self).build_filter()
27-
if self.config.products:
28-
filters['asset.product.id__in'] = ','.join(self.config.products)
29-
23+
# type: () -> Dict[str, Any]
24+
filters = super(AutomationResource, self).build_filter()
3025
filters['status'] = 'pending'
3126
return filters
3227

28+
def process(self):
29+
# type: () -> None
30+
for request in self.list:
31+
self.dispatch(request)
32+
33+
def dispatch(self, request):
34+
raise NotImplementedError('Please implement `{}.dispatch` method'
35+
.format(self.__class__.__name__))
36+
37+
def process_request(self, request):
38+
raise NotImplementedError('Please implement `{}.process_request` method'
39+
.format(self.__class__.__name__))
40+
3341
@function_log
3442
def approve(self, pk, data):
3543
# type: (str, dict) -> str
@@ -39,7 +47,8 @@ def approve(self, pk, data):
3947
@function_log
4048
def inquire(self, pk):
4149
# type: (str) -> str
42-
return self.api.post(url=join_url(self._obj_url(pk), 'inquire/'), data=json.dumps({}))
50+
url = join_url(self._obj_url(pk), 'inquire/')
51+
return self.api.post(url=url, data=json.dumps({}))
4352

4453
@function_log
4554
def fail(self, pk, reason):

0 commit comments

Comments
 (0)