Skip to content

Commit 90418fa

Browse files
Merge branch 'CPS-21-deserialize' into CPS-8-get-tier-config
2 parents 4810a9e + a057e87 commit 90418fa

File tree

7 files changed

+67
-36
lines changed

7 files changed

+67
-36
lines changed

connect/models/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from .activation_response import ActivationTemplateResponse, ActivationTileResponse
77
from .asset import Asset
88
from .base import BaseModel
9-
from .company import Company
9+
from .company import Company, User
1010
from .connection import Connection
1111
from .contact import Contact, ContactInfo, PhoneNumber
1212
from .event import EventInfo, Events
@@ -63,5 +63,6 @@
6363
'UsageListing',
6464
'UsageRecord',
6565
'UsageRecords',
66+
'User',
6667
'ValueChoice',
6768
]

connect/models/company.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# Copyright (c) 2019 Ingram Micro. All Rights Reserved.
55

66
from .base import BaseModel
7-
from connect.models.schemas import CompanySchema
7+
from connect.models.schemas import CompanySchema, UserSchema
88

99

1010
class Company(BaseModel):
@@ -14,3 +14,12 @@ class Company(BaseModel):
1414

1515
name = None # type: str
1616
""" (str) Company name. """
17+
18+
19+
class User(BaseModel):
20+
""" Represents a user within the platform. """
21+
22+
_schema = UserSchema()
23+
24+
name = None # type: str
25+
""" (str) User name. """

connect/models/event.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Optional
88

99
from .base import BaseModel
10-
from .company import Company
10+
from .company import User
1111
from connect.models.schemas import EventInfoSchema, EventsSchema
1212

1313

@@ -19,8 +19,8 @@ class EventInfo(BaseModel):
1919
at = None # type: Optional[datetime.datetime]
2020
""" (datetime.datetime|None) Date when the event occurred. """
2121

22-
by = None # type: Optional[Company]
23-
""" (:py:class:`.Company`) User that caused the event. """
22+
by = None # type: Optional[User]
23+
""" (:py:class:`.User`) User that caused the event. """
2424

2525

2626
class Events(BaseModel):

connect/models/marketplace.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Optional, List
88

99
from .base import BaseModel
10-
from .company import Company
10+
from .company import Company, User
1111
from .hub import ExtIdHub
1212
from connect.models.schemas import MarketplaceSchema, AgreementStatsSchema, AgreementSchema, \
1313
ActivationSchema, ContractSchema
@@ -88,8 +88,8 @@ class Agreement(BaseModel):
8888
stats = None # type: Optional[AgreementStats]
8989
""" (:py:class:`.AgreementStats` | None) Agreement stats. """
9090

91-
author = None # type: Optional[Company]
92-
""" (:py:class:`.Company` | None) Reference to the user who created the version. """
91+
author = None # type: Optional[User]
92+
""" (:py:class:`.User` | None) Reference to the user who created the version. """
9393

9494
version = None # type: int
9595
""" (int) Chronological number of the version. """
@@ -165,8 +165,8 @@ class Contract(BaseModel):
165165
owner = None # type: Optional[Company]
166166
""" (:py:class:`.Company` | None) Reference object to the owner company. """
167167

168-
creator = None # type: Company
169-
""" (:py:class:`.Company`) Reference object to the creator company. """
168+
creator = None # type: User
169+
""" (:py:class:`.User`) Reference object to the creator. """
170170

171171
created = None # type: datetime.datetime
172172
""" (datetime.datetime) Contract creation date. """
@@ -183,7 +183,7 @@ class Contract(BaseModel):
183183
activation = None # type: Activation
184184
""" (:py:class:`.Activation`) Activation information. """
185185

186-
signee = None # type: Optional[Company]
187-
""" (:py:class:`.Company` | None) Reference object to the user of the owner company,
186+
signee = None # type: Optional[User]
187+
""" (:py:class:`.User` | None) Reference object to the user of the owner company,
188188
who signed the contract.
189189
"""

connect/models/schemas.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# Copyright (c) 2019 Ingram Micro. All Rights Reserved.
55

66
from marshmallow import Schema, fields, post_load
7+
import six
78

89

910
class BaseSchema(Schema):
@@ -138,9 +139,18 @@ def make_object(self, data):
138139
return DownloadLink(**data)
139140

140141

142+
class UserSchema(BaseSchema):
143+
name = fields.Str()
144+
145+
@post_load
146+
def make_object(self, data):
147+
from connect.models import User
148+
return User(**data)
149+
150+
141151
class EventInfoSchema(BaseSchema):
142152
at = fields.DateTime(allow_none=True)
143-
by = fields.Nested(CompanySchema, allow_none=True)
153+
by = fields.Nested(UserSchema, allow_none=True)
144154

145155
@post_load
146156
def make_object(self, data):
@@ -216,25 +226,36 @@ def make_object(self, data):
216226
return Renewal(**data)
217227

218228

229+
class QuantityField(fields.Field):
230+
def _deserialize(self, value, attr, obj, **kwargs):
231+
if isinstance(value, six.string_types):
232+
if value == 'unlimited':
233+
return -1
234+
else:
235+
try:
236+
float_val = float(value)
237+
int_val = int(float_val)
238+
return int_val if int_val == float_val else float_val
239+
except ValueError:
240+
raise ValueError({
241+
attr: [u'Not a valid string encoded number nor "unlimited".']
242+
})
243+
elif isinstance(value, (int, float)):
244+
return value
245+
else:
246+
raise ValueError({attr: [u'Not a valid int, float or string.']})
247+
248+
219249
class ItemSchema(BaseSchema):
220250
mpn = fields.Str()
221-
quantity = fields.Str()
222-
old_quantity = fields.Str(allow_none=True)
251+
quantity = QuantityField()
252+
old_quantity = QuantityField(allow_none=True)
223253
renewal = fields.Nested(RenewalSchema, allow_none=True)
224254
global_id = fields.Str()
225255

226256
@post_load
227257
def make_object(self, data):
228258
from connect.models import Item
229-
params = ('quantity', 'old_quantity')
230-
for param in params:
231-
if param in data:
232-
if data[param] != 'unlimited':
233-
float_val = float(data[param])
234-
int_val = int(float_val)
235-
data[param] = int_val if float_val == int_val else float_val
236-
else:
237-
data[param] = -1
238259
return Item(**data)
239260

240261

@@ -261,7 +282,7 @@ class AgreementSchema(BaseSchema):
261282
updated = fields.DateTime()
262283
owner = fields.Nested(CompanySchema)
263284
stats = fields.Nested(AgreementStatsSchema, allow_none=True)
264-
author = fields.Nested(CompanySchema, allow_none=True)
285+
author = fields.Nested(UserSchema, allow_none=True)
265286
version = fields.Int()
266287
active = fields.Bool()
267288
link = fields.Str()
@@ -285,13 +306,13 @@ class ContractSchema(BaseSchema):
285306
agreement = fields.Nested(AgreementSchema, only=('id', 'name'))
286307
marketplace = fields.Nested(MarketplaceSchema, only=('id', 'name'), allow_none=True)
287308
owner = fields.Nested(CompanySchema, only=('id', 'name'), allow_none=True)
288-
creator = fields.Nested(CompanySchema, only=('id', 'name'))
309+
creator = fields.Nested(UserSchema, only=('id', 'name'))
289310
created = fields.DateTime()
290311
updated = fields.DateTime()
291312
enrolled = fields.DateTime(allow_none=True)
292313
version_created = fields.DateTime()
293314
activation = fields.Nested(ActivationSchema)
294-
signee = fields.Nested(CompanySchema, only=('id', 'name'), allow_none=True)
315+
signee = fields.Nested(UserSchema, only=('id', 'name'), allow_none=True)
295316

296317
@post_load
297318
def make_object(self, data):
@@ -471,7 +492,7 @@ class TierConfigRequestSchema(BaseSchema):
471492
configuration = fields.Nested(TierConfigSchema)
472493
events = fields.Nested(EventsSchema, allow_none=True)
473494
params = fields.Nested(ParamSchema, many=True)
474-
assignee = fields.Nested(CompanySchema, allow_none=True)
495+
assignee = fields.Nested(UserSchema, allow_none=True)
475496
template = fields.Nested(TemplateSchema, allow_none=True)
476497
reason = fields.Str(allow_none=True)
477498
activation = fields.Nested(ActivationSchema, allow_none=True)

connect/models/tier_config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Optional, List
77

88
from .base import BaseModel
9-
from .company import Company
9+
from .company import User
1010
from .connection import Connection
1111
from .contact import ContactInfo
1212
from .event import Events
@@ -139,8 +139,8 @@ class TierConfigRequest(BaseModel):
139139
Params can be modified only in Pending state.
140140
"""
141141

142-
assignee = None # type: Optional[Company]
143-
""" (:py:class:`.Company` | None) TCR environment. One of: test, prod, preview. """
142+
assignee = None # type: Optional[User]
143+
""" (:py:class:`.User` | None) TCR environment. One of: test, prod, preview. """
144144

145145
template = None # type: Optional[Template]
146146
""" (:py:class:`.Template` | None) Template Object. This is filled only if TCR is approved. """

tests/test_tier_config.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from connect.exceptions import FailRequest, InquireRequest, SkipRequest
1414
from connect.models import Param, ActivationTileResponse, ActivationTemplateResponse, BaseModel, \
1515
Company, Connection, EventInfo, Hub, Product, TierConfigRequest, TierConfig, Events, \
16-
Template, Activation, Account
16+
Template, Activation, Account, User
1717
from connect.resources import TierConfigAutomation
1818
from .common import Response, load_str
1919

@@ -95,7 +95,7 @@ def test_create_resource():
9595
assert isinstance(events.updated, EventInfo)
9696
assert isinstance(events.updated.at, datetime)
9797
assert str(events.updated.at) == '2018-11-21 11:10:29'
98-
assert isinstance(events.updated.by, Company)
98+
assert isinstance(events.updated.by, User)
9999
assert events.updated.by.id == 'PA-000-000'
100100
assert events.updated.by.name == 'Username'
101101

@@ -124,13 +124,13 @@ def test_create_resource():
124124
assert isinstance(events.inquired, EventInfo)
125125
assert isinstance(events.inquired.at, datetime)
126126
assert str(events.inquired.at) == '2018-11-21 11:10:29'
127-
assert isinstance(events.inquired.by, Company)
127+
assert isinstance(events.inquired.by, User)
128128
assert events.inquired.by.id == 'PA-000-000'
129129
assert events.inquired.by.name == 'Username'
130130
assert isinstance(events.pended, EventInfo)
131131
assert isinstance(events.pended.at, datetime)
132132
assert str(events.pended.at) == '2018-11-21 11:10:29'
133-
assert isinstance(events.pended.by, Company)
133+
assert isinstance(events.pended.by, User)
134134
assert events.pended.by.id == 'PA-000-001'
135135
assert events.pended.by.name == 'Username1'
136136
assert not events.validated
@@ -144,7 +144,7 @@ def test_create_resource():
144144
assert request.params[0].value == 'param_a_value'
145145

146146
assignee = request.assignee
147-
assert isinstance(assignee, Company)
147+
assert isinstance(assignee, User)
148148
assert assignee.id == 'PA-000-000'
149149
assert assignee.name == 'Username'
150150

0 commit comments

Comments
 (0)