· 5 years ago · Feb 07, 2020, 01:38 PM
1from marshmallow import Schema, fields, pre_load, INCLUDE
2
3
4class CredentialsSchema(Schema):
5 api_key = fields.String()
6 secret_key = fields.String()
7 uid = fields.String()
8 password = fields.String()
9
10
11class TrackingSettingsSchema(Schema):
12 track_from = fields.DateTime(allow_none=True)
13 track_balance = fields.Boolean(default=True)
14 track_objects = fields.Boolean(default=False)
15
16
17class ExchangeInfoSchema(Schema):
18 class Meta:
19 unknown = INCLUDE
20
21 string_id = fields.String()
22 ccxt_id = fields.String()
23
24
25class PreviousUpdateSchema(Schema):
26 type = fields.String()
27 date = fields.DateTime()
28 status = fields.String()
29 last_response = fields.Dict()
30
31
32class ExchangeContainerSchema(Schema):
33 class Meta:
34 unknown = INCLUDE
35
36 credentials = fields.Nested(CredentialsSchema)
37 tracking_settings = fields.Nested(TrackingSettingsSchema)
38 exchange_info = fields.Nested(ExchangeInfoSchema)
39 headers = fields.Dict()
40 previous_updates = fields.List(fields.Nested(PreviousUpdateSchema))
41
42 @pre_load
43 def change_structure(self, data, **kwargs):
44 # there is no easier way how to restructure data from flat
45 # to nested structure
46 data['credentials'] = {
47 'api_key': data.pop('api_key'),
48 'secret_key': data.pop('secret_key'),
49 'uid': data.pop('uid'),
50 'password': data.pop('password'),
51 }
52 data['tracking_settings'] = {
53 'track_from': data.pop('track_from'),
54 'track_balance': data.pop('track_balance'),
55 'track_objects': data.pop('track_objects')
56 }
57 return data
58
59
60if __name__ == '__main__':
61 request = {
62 'api_key': 'api_key__',
63 'secret_key': 'secret_key__',
64 'uid': 'uid__',
65 'password': 'password__',
66 'headers': {'some_header': 'any'},
67 'track_from': '2020-02-07T13:55:58',
68 'track_balance': 'true',
69 'track_objects': 'false',
70 'exchange_info': {
71 'string_id': 'kraken',
72 'ccxt_id': 'kraken'
73 },
74 'previous_updates': [
75 {
76 'type': 'balances',
77 'date': '2020-02-07T13:55:58',
78 'status': 'done',
79 'last_response': {'last_id': 'any'}
80 }
81 ]
82 }
83
84 result = ExchangeContainerSchema().load(request)