xync-schema 0.6.72__tar.gz → 0.6.73.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {xync_schema-0.6.72/xync_schema.egg-info → xync_schema-0.6.73.dev3}/PKG-INFO +1 -1
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/enums.py +4 -2
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/models.py +69 -43
- xync_schema-0.6.73.dev3/xync_schema/pydantic.py +180 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3/xync_schema.egg-info}/PKG-INFO +1 -1
- xync_schema-0.6.72/xync_schema/pydantic.py +0 -159
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.env.sample +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.gitignore +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.pre-commit-config.yaml +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/README.md +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/makefile +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/pyproject.toml +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/setup.cfg +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/tests/__init__.py +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/tests/test_db.py +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/__init__.py +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/SOURCES.txt +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/dependency_links.txt +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/requires.txt +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/top_level.txt +0 -0
|
@@ -66,12 +66,12 @@ class Ex(Model):
|
|
|
66
66
|
|
|
67
67
|
pms: fields.ManyToManyRelation["Pm"]
|
|
68
68
|
curs: fields.ManyToManyRelation[Cur]
|
|
69
|
-
pmcurs: fields.ManyToManyRelation["Pmcur"] = fields.ManyToManyField("models.Pmcur", through="pmcurex")
|
|
69
|
+
# pmcurs: fields.ManyToManyRelation["Pmcur"] = fields.ManyToManyField("models.Pmcur", through="pmcurex")
|
|
70
70
|
coins: fields.ManyToManyRelation[Coin]
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
actors: fields.ReverseRelation["Actor"]
|
|
73
73
|
pmexs: fields.ReverseRelation["Pmex"]
|
|
74
|
-
|
|
74
|
+
pairexs: fields.ReverseRelation["PairEx"]
|
|
75
75
|
# deps: fields.ReverseRelation["Dep"]
|
|
76
76
|
# tests: fields.ReverseRelation["TestEx"]
|
|
77
77
|
|
|
@@ -82,11 +82,11 @@ class Ex(Model):
|
|
|
82
82
|
class PydanticMeta(Model.PydanticMeta):
|
|
83
83
|
include = "name", "logo"
|
|
84
84
|
|
|
85
|
-
def client(self
|
|
85
|
+
def client(self):
|
|
86
86
|
module_name = f"xync_client.{self.name}.ex"
|
|
87
87
|
__import__(module_name)
|
|
88
88
|
client = sys.modules[module_name].ExClient
|
|
89
|
-
return client(self
|
|
89
|
+
return client(self)
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
class Curex(BaseModel):
|
|
@@ -117,37 +117,57 @@ class Coinex(BaseModel):
|
|
|
117
117
|
unique_together = (("ex_id", "coin_id"), ("ex_id", "exid"))
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
class Pair(Model
|
|
120
|
+
class Pair(Model):
|
|
121
121
|
id = fields.SmallIntField(True)
|
|
122
122
|
coin: fields.ForeignKeyRelation[Coin] = fields.ForeignKeyField("models.Coin", related_name="pairs")
|
|
123
123
|
cur: fields.ForeignKeyRelation[Cur] = fields.ForeignKeyField("models.Cur", related_name="pairs")
|
|
124
|
+
|
|
125
|
+
_name = {"coin__ticker", "cur__ticker"}
|
|
126
|
+
|
|
127
|
+
class Meta:
|
|
128
|
+
table_description = "Coin/Currency pairs"
|
|
129
|
+
unique_together = (("coin", "cur"),)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class PairEx(Model, TsTrait):
|
|
133
|
+
pair: fields.ForeignKeyRelation[Pair] = fields.ForeignKeyField("models.Pair", related_name="pairexs")
|
|
134
|
+
pair_id: int
|
|
124
135
|
fee: float = fields.FloatField(default=0)
|
|
125
136
|
ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="pairs")
|
|
137
|
+
ex_id: int
|
|
126
138
|
directions: fields.ReverseRelation["Direction"]
|
|
127
139
|
|
|
128
|
-
_name = {"
|
|
140
|
+
_name = {"pair__coin__ticker", "pair__cur__ticker", "ex__name"}
|
|
129
141
|
|
|
130
142
|
class Meta:
|
|
131
|
-
table_description = "
|
|
132
|
-
unique_together = (("
|
|
143
|
+
table_description = "Pairs on Exs"
|
|
144
|
+
unique_together = (("pair", "ex"),)
|
|
133
145
|
|
|
134
146
|
|
|
135
147
|
class Direction(Model):
|
|
136
148
|
id = fields.SmallIntField(True)
|
|
137
|
-
|
|
149
|
+
pairex: fields.ForeignKeyRelation[PairEx] = fields.ForeignKeyField("models.PairEx", related_name="directions")
|
|
150
|
+
pairex_id: int
|
|
138
151
|
sell: bool = fields.BooleanField()
|
|
139
152
|
total: int = fields.IntField(null=True)
|
|
140
153
|
ads: fields.ReverseRelation["Ad"]
|
|
141
154
|
|
|
142
|
-
_name = {"
|
|
155
|
+
_name = {"pairex__coin__ticker", "pairex__cur__ticker", "sell"}
|
|
143
156
|
|
|
144
157
|
class Meta:
|
|
145
158
|
table_description = "Trade directions"
|
|
146
|
-
unique_together = (("
|
|
159
|
+
unique_together = (("pairex", "sell"),)
|
|
160
|
+
|
|
147
161
|
|
|
162
|
+
class CredHolder(Model, TsTrait):
|
|
163
|
+
user: fields.BackwardOneToOneRelation["User"]
|
|
164
|
+
actor: fields.BackwardOneToOneRelation["Actor"]
|
|
148
165
|
|
|
149
|
-
|
|
166
|
+
|
|
167
|
+
class User(Model, UserInfoTrait):
|
|
150
168
|
id: int = fields.BigIntField(True)
|
|
169
|
+
ch: fields.OneToOneRelation[CredHolder] = fields.OneToOneField("models.CredHolder", "users")
|
|
170
|
+
ch_id: int
|
|
151
171
|
forum: int = fields.BigIntField()
|
|
152
172
|
role: Role = fields.IntEnumField(Role, default=Role.READER)
|
|
153
173
|
status: UserStatus = fields.IntEnumField(UserStatus, default=UserStatus.RESTRICTED)
|
|
@@ -188,11 +208,13 @@ class User(Model, TsTrait, UserInfoTrait):
|
|
|
188
208
|
# computed = ["balance"]
|
|
189
209
|
|
|
190
210
|
|
|
191
|
-
class
|
|
211
|
+
class Actor(Model):
|
|
192
212
|
exid: int = fields.BigIntField()
|
|
193
213
|
name: int = fields.CharField(63)
|
|
194
|
-
ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="
|
|
214
|
+
ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="actors")
|
|
195
215
|
ex_id: int
|
|
216
|
+
ch: fields.OneToOneNullableRelation[CredHolder] = fields.OneToOneField("models.CredHolder", "actor", null=True)
|
|
217
|
+
ch_id: int
|
|
196
218
|
updated_at: datetime | None = DatetimeSecField(auto_now=True)
|
|
197
219
|
|
|
198
220
|
agent: fields.BackwardOneToOneRelation["Agent"]
|
|
@@ -201,34 +223,34 @@ class Contragent(Model):
|
|
|
201
223
|
taken_orders: fields.BackwardFKRelation["Order"]
|
|
202
224
|
|
|
203
225
|
class Meta:
|
|
204
|
-
table_description = "
|
|
226
|
+
table_description = "Actors"
|
|
205
227
|
unique_together = (("ex", "exid"),)
|
|
206
228
|
|
|
207
229
|
|
|
208
230
|
class Agent(Model, TsTrait):
|
|
209
231
|
auth: dict[str, str] = fields.JSONField(null=True)
|
|
210
|
-
|
|
211
|
-
|
|
232
|
+
actor: fields.OneToOneRelation[Actor] = fields.OneToOneField("models.Actor", "agent")
|
|
233
|
+
actor_id: int
|
|
212
234
|
user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="agents")
|
|
213
235
|
user_id: int
|
|
214
236
|
assets: fields.ReverseRelation["Asset"]
|
|
215
237
|
|
|
216
|
-
_name = {"
|
|
238
|
+
_name = {"actor__name"}
|
|
217
239
|
|
|
218
240
|
def balance(self) -> int:
|
|
219
241
|
return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
|
|
220
242
|
|
|
221
243
|
class Meta:
|
|
222
244
|
table_description = "Agents"
|
|
223
|
-
unique_together = (("
|
|
245
|
+
unique_together = (("actor", "user"),)
|
|
224
246
|
|
|
225
247
|
class PydanticMeta(Model.PydanticMeta):
|
|
226
248
|
# max_recursion = 3
|
|
227
|
-
include = "id", "
|
|
249
|
+
include = "id", "actor__ex", "assets", "auth", "updated_at"
|
|
228
250
|
computed = ["balance"]
|
|
229
251
|
|
|
230
252
|
def client(self):
|
|
231
|
-
module_name = f"xync_client.{self.
|
|
253
|
+
module_name = f"xync_client.{self.actor.ex.name}.agent"
|
|
232
254
|
__import__(module_name)
|
|
233
255
|
client = sys.modules[module_name].AgentClient
|
|
234
256
|
return client(self)
|
|
@@ -242,7 +264,7 @@ class Agent(Model, TsTrait):
|
|
|
242
264
|
# return client(self)
|
|
243
265
|
|
|
244
266
|
def asset_client(self):
|
|
245
|
-
module_name = f"xync_client.{self.
|
|
267
|
+
module_name = f"xync_client.{self.actor.ex.name}.asset"
|
|
246
268
|
__import__(module_name)
|
|
247
269
|
client = sys.modules[module_name].AssetClient
|
|
248
270
|
return client(self)
|
|
@@ -269,7 +291,7 @@ class Adpm(Model):
|
|
|
269
291
|
|
|
270
292
|
|
|
271
293
|
class Ad(Model, TsTrait):
|
|
272
|
-
|
|
294
|
+
exid: int = fields.BigIntField()
|
|
273
295
|
direction: fields.ForeignKeyRelation[Direction] = fields.ForeignKeyField("models.Direction", related_name="ads")
|
|
274
296
|
price: float = fields.FloatField()
|
|
275
297
|
max_fiat: float = fields.FloatField()
|
|
@@ -278,7 +300,7 @@ class Ad(Model, TsTrait):
|
|
|
278
300
|
auto_msg: str | None = fields.CharField(255, null=True)
|
|
279
301
|
status: AdStatus = fields.IntEnumField(AdStatus, defaut=AdStatus.active)
|
|
280
302
|
|
|
281
|
-
maker: fields.ForeignKeyRelation[
|
|
303
|
+
maker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "my_ads")
|
|
282
304
|
maker_id: int
|
|
283
305
|
|
|
284
306
|
pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="adpm") # only root pms
|
|
@@ -286,7 +308,7 @@ class Ad(Model, TsTrait):
|
|
|
286
308
|
orders: fields.ReverseRelation["Order"]
|
|
287
309
|
|
|
288
310
|
_icon = "ad"
|
|
289
|
-
_name = {"
|
|
311
|
+
_name = {"direction__pairex__coin__ticker", "direction__pairex__cur__ticker", "direction__sell", "price"}
|
|
290
312
|
|
|
291
313
|
class Meta:
|
|
292
314
|
table_description = "P2P Advertisements"
|
|
@@ -370,18 +392,20 @@ class PmexBank(BaseModel): # banks for SBP
|
|
|
370
392
|
exid: str = fields.CharField(63)
|
|
371
393
|
name: str = fields.CharField(63)
|
|
372
394
|
|
|
395
|
+
creds: fields.ManyToManyRelation["Cred"]
|
|
396
|
+
|
|
373
397
|
class Meta:
|
|
374
398
|
unique_together = (("pmex", "exid"),)
|
|
375
399
|
|
|
376
400
|
|
|
377
|
-
class CredBank(BaseModel): # banks for SBP
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
401
|
+
# class CredBank(BaseModel): # banks for SBP
|
|
402
|
+
# pmexbank: fields.ForeignKeyRelation[PmexBank] = fields.ForeignKeyField("models.PmexBank", "credbanks")
|
|
403
|
+
# pmexbank_id: int
|
|
404
|
+
# cred: fields.ForeignKeyRelation["Cred"] = fields.ForeignKeyField("models.Cred", "credbanks")
|
|
405
|
+
# cred_id: int
|
|
406
|
+
#
|
|
407
|
+
# class Meta:
|
|
408
|
+
# unique_together = (("cred_id", "pmexbank_id"),)
|
|
385
409
|
|
|
386
410
|
|
|
387
411
|
# class Pmcurex(BaseModel): # existence pm in ex for exact cur, with "blocked" flag
|
|
@@ -403,25 +427,27 @@ class Cred(Model):
|
|
|
403
427
|
# country_id: int
|
|
404
428
|
detail: str = fields.CharField(127)
|
|
405
429
|
name: str | None = fields.CharField(127, null=True)
|
|
406
|
-
|
|
407
|
-
|
|
430
|
+
ch: fields.ForeignKeyRelation[CredHolder] = fields.ForeignKeyField("models.CredHolder", "creds")
|
|
431
|
+
ch_id: int
|
|
432
|
+
|
|
433
|
+
banks: fields.ManyToManyRelation[PmexBank] = fields.ManyToManyField("models.PmexBank", related_name="creds")
|
|
408
434
|
|
|
409
435
|
fiat: fields.BackwardOneToOneRelation["Fiat"]
|
|
410
|
-
ads: fields.
|
|
436
|
+
ads: fields.ManyToManyRelation[Ad]
|
|
411
437
|
orders: fields.BackwardFKRelation["Order"]
|
|
412
438
|
|
|
413
439
|
_name = {"exid"}
|
|
414
440
|
|
|
415
441
|
class Meta:
|
|
416
442
|
table_description = "Currency accounts"
|
|
417
|
-
unique_together = (("
|
|
443
|
+
# unique_together = (("actor", "exid"), ("actor_id", "pmcur_id", "detail"))
|
|
418
444
|
|
|
419
445
|
|
|
420
446
|
class Fiat(Model):
|
|
421
447
|
cred: fields.OneToOneRelation[Cred] = fields.OneToOneField("models.Cred", "fiat")
|
|
422
448
|
cred_id: int
|
|
423
449
|
# user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", "fiats")
|
|
424
|
-
# user_id: int # cred.
|
|
450
|
+
# user_id: int # cred.actor.agent.user_id
|
|
425
451
|
amount: float | None = fields.FloatField(default=0)
|
|
426
452
|
target: float | None = fields.FloatField(default=None, null=True)
|
|
427
453
|
|
|
@@ -485,16 +511,16 @@ class Asset(Model):
|
|
|
485
511
|
|
|
486
512
|
|
|
487
513
|
class Order(Model):
|
|
488
|
-
|
|
514
|
+
exid: int = fields.BigIntField()
|
|
489
515
|
ad: fields.ForeignKeyRelation[Ad] = fields.ForeignKeyField("models.Ad", related_name="ads")
|
|
490
516
|
ad_id: int
|
|
491
517
|
amount: float = fields.FloatField()
|
|
492
518
|
cred: fields.ForeignKeyRelation[Cred] = fields.ForeignKeyField("models.Cred", related_name="orders", null=True)
|
|
493
519
|
cred_id: int | None
|
|
494
|
-
taker: fields.ForeignKeyRelation[
|
|
520
|
+
taker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "taken_orders")
|
|
495
521
|
taker_id: int
|
|
496
|
-
maker_topic: int = fields.IntField()
|
|
497
|
-
taker_topic: int = fields.IntField()
|
|
522
|
+
maker_topic: int = fields.IntField(null=True) # todo: remove nullability
|
|
523
|
+
taker_topic: int = fields.IntField(null=True)
|
|
498
524
|
status: OrderStatus = fields.IntEnumField(OrderStatus)
|
|
499
525
|
created_at: datetime | None = DatetimeSecField(auto_now_add=True)
|
|
500
526
|
payed_at: datetime | None = DatetimeSecField(null=True)
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
from xync_schema.enums import AdStatus, PmType, OrderStatus
|
|
5
|
+
from xync_schema.models import Direction, Pmcur, Cred, Actor, Pm, Ad
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class _CurCoin(BaseModel):
|
|
9
|
+
exid: int | str
|
|
10
|
+
ticker: str
|
|
11
|
+
rate: float | None = None
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CoinEpyd(_CurCoin):
|
|
15
|
+
p2p: bool = True
|
|
16
|
+
minimum: float | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CurEpyd(_CurCoin):
|
|
20
|
+
rounding_scale: int | None = None
|
|
21
|
+
minimum: int | None = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class PmexBankPyd(BaseModel):
|
|
25
|
+
id: int | None = None
|
|
26
|
+
exid: str
|
|
27
|
+
name: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class PmPyd(BaseModel):
|
|
31
|
+
id: int | None = None
|
|
32
|
+
name: str
|
|
33
|
+
identifier: str | None = None
|
|
34
|
+
type_: PmType | None = None
|
|
35
|
+
logo: str | None = None
|
|
36
|
+
banks: list[PmexBankPyd] | None = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# class PmcurPyd(BaseModel):
|
|
40
|
+
# id: int | None = None
|
|
41
|
+
# pm_id: int
|
|
42
|
+
# cur_id: int
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class FFiat(BaseModel):
|
|
46
|
+
detail: str
|
|
47
|
+
name: str | None = None
|
|
48
|
+
amount: float = 0
|
|
49
|
+
target: int | None = None
|
|
50
|
+
banks: list[str] = []
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class FiatNew(FFiat):
|
|
54
|
+
cur_id: int
|
|
55
|
+
pm_id: int
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class FiatUpd(FFiat):
|
|
59
|
+
id: int
|
|
60
|
+
exid: int
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class CredPydIn(BaseModel):
|
|
64
|
+
id: int | None = None
|
|
65
|
+
exid: int
|
|
66
|
+
pmcur: Pmcur
|
|
67
|
+
actor: Actor
|
|
68
|
+
detail: str = ""
|
|
69
|
+
name: str = ""
|
|
70
|
+
banks: list[str] | None = None
|
|
71
|
+
|
|
72
|
+
class Config:
|
|
73
|
+
arbitrary_types_allowed = True
|
|
74
|
+
|
|
75
|
+
def args(self) -> tuple[dict, dict]:
|
|
76
|
+
unq: tuple[str, ...] = "id", "exid", "actor", "pmcur"
|
|
77
|
+
df: tuple[str, ...] = "detail", "name"
|
|
78
|
+
d = self.model_dump()
|
|
79
|
+
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class FiatPydIn(BaseModel):
|
|
83
|
+
# unq
|
|
84
|
+
id: int = None
|
|
85
|
+
cred: Cred
|
|
86
|
+
# df
|
|
87
|
+
amount: float
|
|
88
|
+
target: float | None = None
|
|
89
|
+
|
|
90
|
+
class Config:
|
|
91
|
+
arbitrary_types_allowed = True
|
|
92
|
+
|
|
93
|
+
def args(self) -> tuple[dict, dict]:
|
|
94
|
+
unq: tuple[str, ...] = "id", "cred"
|
|
95
|
+
df: tuple[str, ...] = "amount", "target"
|
|
96
|
+
d = self.model_dump()
|
|
97
|
+
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class BaseAd(BaseModel):
|
|
101
|
+
id: int | None = None
|
|
102
|
+
price: float
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class BaseAdPydIn(BaseAd):
|
|
106
|
+
exid: int
|
|
107
|
+
min_fiat: float
|
|
108
|
+
max_fiat: float | None = None
|
|
109
|
+
detail: str | None = None
|
|
110
|
+
auto_msg: str | None = None
|
|
111
|
+
status: AdStatus = AdStatus.active
|
|
112
|
+
maker: Actor = None
|
|
113
|
+
direction: Direction
|
|
114
|
+
|
|
115
|
+
class Config:
|
|
116
|
+
arbitrary_types_allowed = True
|
|
117
|
+
|
|
118
|
+
def args(self) -> tuple[dict, dict]:
|
|
119
|
+
unq: tuple[str, ...] = "id", "exid", "maker", "direction"
|
|
120
|
+
df: tuple[str, ...] = "price", "price", "min_fiat", "max_fiat", "detail", "auto_msg", "status"
|
|
121
|
+
d = self.model_dump(exclude_none=True)
|
|
122
|
+
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class AdBuyPydIn(BaseAdPydIn):
|
|
126
|
+
pms_: list[Pm]
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class AdSalePydIn(BaseAdPydIn):
|
|
130
|
+
creds_: list[Cred]
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class BaseOrder(BaseModel):
|
|
134
|
+
id: int | None = None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class OrderPyd(BaseModel):
|
|
138
|
+
id: int
|
|
139
|
+
amount: float
|
|
140
|
+
status: str
|
|
141
|
+
actions: dict | None = {}
|
|
142
|
+
cred: Cred.pyd()
|
|
143
|
+
is_sell: bool
|
|
144
|
+
actor: int | None = None
|
|
145
|
+
created_at: datetime
|
|
146
|
+
payed_at: datetime | None = None
|
|
147
|
+
appealed_at: datetime | None = None
|
|
148
|
+
confirmed_at: datetime | None = None
|
|
149
|
+
msgs: int = 0
|
|
150
|
+
topic: int
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class OrderPydIn(BaseModel):
|
|
154
|
+
id: int = None
|
|
155
|
+
exid: int
|
|
156
|
+
amount: float
|
|
157
|
+
maker_topic: int | None = None
|
|
158
|
+
taker_topic: int | None = None
|
|
159
|
+
status: OrderStatus = OrderStatus.created
|
|
160
|
+
created_at: datetime
|
|
161
|
+
payed_at: datetime | None = None
|
|
162
|
+
confirmed_at: datetime | None = None
|
|
163
|
+
appealed_at: datetime | None = None
|
|
164
|
+
ad: Ad
|
|
165
|
+
cred: Cred
|
|
166
|
+
taker: Actor
|
|
167
|
+
|
|
168
|
+
class Config:
|
|
169
|
+
arbitrary_types_allowed = True
|
|
170
|
+
|
|
171
|
+
def args(self) -> tuple[dict, dict]:
|
|
172
|
+
unq: tuple[str, ...] = "id", "exid", "amount", "maker_topic", "taker_topic", "ad", "cred", "taker"
|
|
173
|
+
df: tuple[str, ...] = "status", "created_at", "payed_at", "confirmed_at", "appealed_at"
|
|
174
|
+
d = self.model_dump(exclude_none=True)
|
|
175
|
+
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class UreadMsgs(BaseModel):
|
|
179
|
+
order_id: int
|
|
180
|
+
unread_cnt: int
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
from pydantic import BaseModel, model_validator
|
|
3
|
-
|
|
4
|
-
from xync_schema.enums import AdStatus, PmType
|
|
5
|
-
from xync_schema.models import Direction, Pmcur, Ex, Cred, Contragent
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class _CurCoin(BaseModel):
|
|
9
|
-
exid: int | str
|
|
10
|
-
ticker: str
|
|
11
|
-
rate: float | None = None
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class CoinEpyd(_CurCoin):
|
|
15
|
-
p2p: bool = True
|
|
16
|
-
minimum: float | None = None
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class CurEpyd(_CurCoin):
|
|
20
|
-
rounding_scale: int | None = None
|
|
21
|
-
minimum: int | None = None
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class PmexBankPyd(BaseModel):
|
|
25
|
-
id: int | None = None
|
|
26
|
-
exid: str
|
|
27
|
-
name: str
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class PmPyd(BaseModel):
|
|
31
|
-
id: int | None = None
|
|
32
|
-
name: str
|
|
33
|
-
identifier: str | None = None
|
|
34
|
-
type_: PmType | None = None
|
|
35
|
-
logo: str | None = None
|
|
36
|
-
banks: list[PmexBankPyd] | None = None
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
# class PmcurPyd(BaseModel):
|
|
40
|
-
# id: int | None = None
|
|
41
|
-
# pm_id: int
|
|
42
|
-
# cur_id: int
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class FiatUpd(BaseModel):
|
|
46
|
-
detail: str | None = None
|
|
47
|
-
name: str | None = None
|
|
48
|
-
amount: float | None = None
|
|
49
|
-
target: int | None = None
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class FiatNew(FiatUpd):
|
|
53
|
-
cur_id: int
|
|
54
|
-
pm_id: int
|
|
55
|
-
detail: str
|
|
56
|
-
amount: float = 0
|
|
57
|
-
target: int | None = None
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class CredPydIn(BaseModel):
|
|
61
|
-
id: int | None = None
|
|
62
|
-
exid: str
|
|
63
|
-
ex: Ex | None = None
|
|
64
|
-
ex_id: int | None = None
|
|
65
|
-
pmcur_id: int | None = None
|
|
66
|
-
pmcur: Pmcur | None = None
|
|
67
|
-
detail: str
|
|
68
|
-
name: str = ""
|
|
69
|
-
|
|
70
|
-
class Config:
|
|
71
|
-
arbitrary_types_allowed = True
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
@model_validator(mode="before")
|
|
75
|
-
def check_at_least_one_field(cls, values):
|
|
76
|
-
if (values.get("ex") or values.get("ex_id")) and (values.get("pmcur") or values.get("pmcur_id")):
|
|
77
|
-
return values
|
|
78
|
-
raise ValueError("ex(_id) and pmcur(_id) is required")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class FiatPydIn(BaseModel):
|
|
82
|
-
# unq
|
|
83
|
-
id: int = None
|
|
84
|
-
cred_id: int | None = None
|
|
85
|
-
cred: Cred | None = None
|
|
86
|
-
# df
|
|
87
|
-
amount: float
|
|
88
|
-
target: float | None = None
|
|
89
|
-
|
|
90
|
-
banks: list[str] = []
|
|
91
|
-
|
|
92
|
-
class Config:
|
|
93
|
-
arbitrary_types_allowed = True
|
|
94
|
-
|
|
95
|
-
@classmethod
|
|
96
|
-
@model_validator(mode="before")
|
|
97
|
-
def check_at_least_one_field(cls, values):
|
|
98
|
-
if values.get("cred") or values.get("cred_id"):
|
|
99
|
-
return values
|
|
100
|
-
raise ValueError("cred(_id) is required")
|
|
101
|
-
|
|
102
|
-
def args(self) -> tuple[dict, dict]:
|
|
103
|
-
unq: tuple[str, ...] = "id", "cred_id", "cred"
|
|
104
|
-
df: tuple[str, ...] = "amount", "target"
|
|
105
|
-
d = self.model_dump()
|
|
106
|
-
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class BaseAd(BaseModel):
|
|
110
|
-
id: int | None = None
|
|
111
|
-
price: float
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class AdPydIn(BaseAd):
|
|
115
|
-
min_fiat: float
|
|
116
|
-
max_fiat: float | None = None
|
|
117
|
-
detail: str | None = None
|
|
118
|
-
auto_msg: str | None = None
|
|
119
|
-
status: AdStatus = AdStatus.active
|
|
120
|
-
maker_id: int | None = None
|
|
121
|
-
maker: Contragent | None = None
|
|
122
|
-
direction_id: int | None = None
|
|
123
|
-
direction: Direction | None = None
|
|
124
|
-
pms_: list | None = None
|
|
125
|
-
fiats_: list | None = None
|
|
126
|
-
|
|
127
|
-
class Config:
|
|
128
|
-
arbitrary_types_allowed = True
|
|
129
|
-
|
|
130
|
-
@classmethod
|
|
131
|
-
@model_validator(mode="before")
|
|
132
|
-
def check_at_least_one_field(cls, values):
|
|
133
|
-
maker = values.get("maker") or values.get("maker_id")
|
|
134
|
-
direction = values.get("direction") or values.get("direction_id")
|
|
135
|
-
pms_or_fiats = values.get("pms_") or values.get("fiats_")
|
|
136
|
-
if maker and direction and pms_or_fiats:
|
|
137
|
-
return values
|
|
138
|
-
raise ValueError("(pms or fiats) and maker(_id) and direction(_id) is required")
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
class OrderPyd(BaseModel):
|
|
142
|
-
id: int
|
|
143
|
-
amount: float
|
|
144
|
-
status: str
|
|
145
|
-
actions: dict | None = {}
|
|
146
|
-
cred: Cred.pyd()
|
|
147
|
-
is_sell: bool
|
|
148
|
-
contragent: int | None = None
|
|
149
|
-
created_at: datetime
|
|
150
|
-
payed_at: datetime | None = None
|
|
151
|
-
appealed_at: datetime | None = None
|
|
152
|
-
confirmed_at: datetime | None = None
|
|
153
|
-
msgs: int = 0
|
|
154
|
-
topic: int
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
class UreadMsgs(BaseModel):
|
|
158
|
-
order_id: int
|
|
159
|
-
unread_cnt: int
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|