xync-schema 0.6.71__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.71/xync_schema.egg-info → xync_schema-0.6.73.dev3}/PKG-INFO +1 -1
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema/enums.py +6 -5
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema/models.py +74 -47
- xync_schema-0.6.73.dev3/xync_schema/pydantic.py +180 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3/xync_schema.egg-info}/PKG-INFO +1 -1
- xync_schema-0.6.71/xync_schema/pydantic.py +0 -162
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/.env.sample +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/.gitignore +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/.pre-commit-config.yaml +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/README.md +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/makefile +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/pyproject.toml +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/setup.cfg +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/tests/__init__.py +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/tests/test_db.py +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema/__init__.py +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/SOURCES.txt +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/dependency_links.txt +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/requires.txt +0 -0
- {xync_schema-0.6.71 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/top_level.txt +0 -0
|
@@ -57,11 +57,13 @@ class TradeType(IntEnum):
|
|
|
57
57
|
|
|
58
58
|
class PmType(IntEnum):
|
|
59
59
|
bank = 0
|
|
60
|
-
|
|
60
|
+
emoney = 1
|
|
61
61
|
cash = 2
|
|
62
|
+
card = 4
|
|
62
63
|
gift_card = 3
|
|
63
|
-
credit_card = 4
|
|
64
64
|
IFSC = 5
|
|
65
|
+
SBP = 6
|
|
66
|
+
phone = 7
|
|
65
67
|
|
|
66
68
|
|
|
67
69
|
class TaskType(IntEnum):
|
|
@@ -112,9 +114,7 @@ class ExAction(IntEnum):
|
|
|
112
114
|
coins = 22 # Список торгуемых монет (с ограничениям по валютам, если есть)
|
|
113
115
|
pairs = 23 # Список пар валюта/монет
|
|
114
116
|
ads = 24 # Список объяв по покупке/продаже, валюте, монете, платежному методу (buy/sell, cur, coin, pm)
|
|
115
|
-
ad = 42 #
|
|
116
|
-
cur_mins = 43 # Минимальные объемы валют в объявлении
|
|
117
|
-
coin_mins = 44 # Минимальные объемы монет в объявлении
|
|
117
|
+
ad = 42 # Чужая объява по id
|
|
118
118
|
""" Agent: Fiat """
|
|
119
119
|
my_fiats = 25 # Список реквизитов моих платежных методов
|
|
120
120
|
fiat_new = 26 # Создание реквизита моего платежного метода
|
|
@@ -122,6 +122,7 @@ class ExAction(IntEnum):
|
|
|
122
122
|
fiat_del = 28 # Удаление реквизита моего платежного метода
|
|
123
123
|
""" Agent: Ad """
|
|
124
124
|
my_ads = 29 # Список моих объявлений
|
|
125
|
+
my_ad = 43 # Моя объява по id
|
|
125
126
|
ad_new = 30 # Создание объявления
|
|
126
127
|
ad_upd = 31 # Редактирование объявления
|
|
127
128
|
ad_del = 32 # Удаление объявления
|
|
@@ -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)
|
|
@@ -159,7 +179,7 @@ class User(Model, TsTrait, UserInfoTrait):
|
|
|
159
179
|
|
|
160
180
|
proteges: fields.BackwardFKRelation["User"]
|
|
161
181
|
agents: fields.BackwardFKRelation["Agent"]
|
|
162
|
-
fiats: fields.BackwardFKRelation["Fiat"]
|
|
182
|
+
# fiats: fields.BackwardFKRelation["Fiat"]
|
|
163
183
|
limits: fields.BackwardFKRelation["Limit"]
|
|
164
184
|
# vpn: fields.BackwardOneToOneRelation["Vpn"]
|
|
165
185
|
# invite_requests: fields.BackwardFKRelation["Invite"]
|
|
@@ -188,46 +208,49 @@ 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"]
|
|
199
|
-
|
|
221
|
+
creds: fields.BackwardFKRelation["Cred"]
|
|
200
222
|
my_ads: fields.BackwardFKRelation["Ad"]
|
|
223
|
+
taken_orders: fields.BackwardFKRelation["Order"]
|
|
201
224
|
|
|
202
225
|
class Meta:
|
|
203
|
-
table_description = "
|
|
226
|
+
table_description = "Actors"
|
|
204
227
|
unique_together = (("ex", "exid"),)
|
|
205
228
|
|
|
206
229
|
|
|
207
|
-
class Agent(Model):
|
|
230
|
+
class Agent(Model, TsTrait):
|
|
208
231
|
auth: dict[str, str] = fields.JSONField(null=True)
|
|
209
|
-
|
|
210
|
-
|
|
232
|
+
actor: fields.OneToOneRelation[Actor] = fields.OneToOneField("models.Actor", "agent")
|
|
233
|
+
actor_id: int
|
|
211
234
|
user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="agents")
|
|
212
235
|
user_id: int
|
|
213
236
|
assets: fields.ReverseRelation["Asset"]
|
|
214
237
|
|
|
215
|
-
_name = {"
|
|
238
|
+
_name = {"actor__name"}
|
|
216
239
|
|
|
217
240
|
def balance(self) -> int:
|
|
218
241
|
return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
|
|
219
242
|
|
|
220
243
|
class Meta:
|
|
221
244
|
table_description = "Agents"
|
|
222
|
-
unique_together = (("
|
|
245
|
+
unique_together = (("actor", "user"),)
|
|
223
246
|
|
|
224
247
|
class PydanticMeta(Model.PydanticMeta):
|
|
225
248
|
# max_recursion = 3
|
|
226
|
-
include = "id", "
|
|
249
|
+
include = "id", "actor__ex", "assets", "auth", "updated_at"
|
|
227
250
|
computed = ["balance"]
|
|
228
251
|
|
|
229
252
|
def client(self):
|
|
230
|
-
module_name = f"xync_client.{self.
|
|
253
|
+
module_name = f"xync_client.{self.actor.ex.name}.agent"
|
|
231
254
|
__import__(module_name)
|
|
232
255
|
client = sys.modules[module_name].AgentClient
|
|
233
256
|
return client(self)
|
|
@@ -241,7 +264,7 @@ class Agent(Model):
|
|
|
241
264
|
# return client(self)
|
|
242
265
|
|
|
243
266
|
def asset_client(self):
|
|
244
|
-
module_name = f"xync_client.{self.
|
|
267
|
+
module_name = f"xync_client.{self.actor.ex.name}.asset"
|
|
245
268
|
__import__(module_name)
|
|
246
269
|
client = sys.modules[module_name].AssetClient
|
|
247
270
|
return client(self)
|
|
@@ -268,7 +291,7 @@ class Adpm(Model):
|
|
|
268
291
|
|
|
269
292
|
|
|
270
293
|
class Ad(Model, TsTrait):
|
|
271
|
-
|
|
294
|
+
exid: int = fields.BigIntField()
|
|
272
295
|
direction: fields.ForeignKeyRelation[Direction] = fields.ForeignKeyField("models.Direction", related_name="ads")
|
|
273
296
|
price: float = fields.FloatField()
|
|
274
297
|
max_fiat: float = fields.FloatField()
|
|
@@ -277,7 +300,7 @@ class Ad(Model, TsTrait):
|
|
|
277
300
|
auto_msg: str | None = fields.CharField(255, null=True)
|
|
278
301
|
status: AdStatus = fields.IntEnumField(AdStatus, defaut=AdStatus.active)
|
|
279
302
|
|
|
280
|
-
maker: fields.ForeignKeyRelation[
|
|
303
|
+
maker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "my_ads")
|
|
281
304
|
maker_id: int
|
|
282
305
|
|
|
283
306
|
pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="adpm") # only root pms
|
|
@@ -285,7 +308,7 @@ class Ad(Model, TsTrait):
|
|
|
285
308
|
orders: fields.ReverseRelation["Order"]
|
|
286
309
|
|
|
287
310
|
_icon = "ad"
|
|
288
|
-
_name = {"
|
|
311
|
+
_name = {"direction__pairex__coin__ticker", "direction__pairex__cur__ticker", "direction__sell", "price"}
|
|
289
312
|
|
|
290
313
|
class Meta:
|
|
291
314
|
table_description = "P2P Advertisements"
|
|
@@ -369,18 +392,20 @@ class PmexBank(BaseModel): # banks for SBP
|
|
|
369
392
|
exid: str = fields.CharField(63)
|
|
370
393
|
name: str = fields.CharField(63)
|
|
371
394
|
|
|
395
|
+
creds: fields.ManyToManyRelation["Cred"]
|
|
396
|
+
|
|
372
397
|
class Meta:
|
|
373
398
|
unique_together = (("pmex", "exid"),)
|
|
374
399
|
|
|
375
400
|
|
|
376
|
-
class
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
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"),)
|
|
384
409
|
|
|
385
410
|
|
|
386
411
|
# class Pmcurex(BaseModel): # existence pm in ex for exact cur, with "blocked" flag
|
|
@@ -402,25 +427,27 @@ class Cred(Model):
|
|
|
402
427
|
# country_id: int
|
|
403
428
|
detail: str = fields.CharField(127)
|
|
404
429
|
name: str | None = fields.CharField(127, null=True)
|
|
405
|
-
|
|
406
|
-
|
|
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")
|
|
407
434
|
|
|
408
435
|
fiat: fields.BackwardOneToOneRelation["Fiat"]
|
|
409
|
-
ads: fields.
|
|
436
|
+
ads: fields.ManyToManyRelation[Ad]
|
|
410
437
|
orders: fields.BackwardFKRelation["Order"]
|
|
411
438
|
|
|
412
439
|
_name = {"exid"}
|
|
413
440
|
|
|
414
441
|
class Meta:
|
|
415
442
|
table_description = "Currency accounts"
|
|
416
|
-
unique_together = (("
|
|
443
|
+
# unique_together = (("actor", "exid"), ("actor_id", "pmcur_id", "detail"))
|
|
417
444
|
|
|
418
445
|
|
|
419
446
|
class Fiat(Model):
|
|
420
447
|
cred: fields.OneToOneRelation[Cred] = fields.OneToOneField("models.Cred", "fiat")
|
|
421
448
|
cred_id: int
|
|
422
449
|
# user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", "fiats")
|
|
423
|
-
# user_id: int # cred.
|
|
450
|
+
# user_id: int # cred.actor.agent.user_id
|
|
424
451
|
amount: float | None = fields.FloatField(default=0)
|
|
425
452
|
target: float | None = fields.FloatField(default=None, null=True)
|
|
426
453
|
|
|
@@ -484,16 +511,16 @@ class Asset(Model):
|
|
|
484
511
|
|
|
485
512
|
|
|
486
513
|
class Order(Model):
|
|
487
|
-
|
|
514
|
+
exid: int = fields.BigIntField()
|
|
488
515
|
ad: fields.ForeignKeyRelation[Ad] = fields.ForeignKeyField("models.Ad", related_name="ads")
|
|
489
516
|
ad_id: int
|
|
490
517
|
amount: float = fields.FloatField()
|
|
491
518
|
cred: fields.ForeignKeyRelation[Cred] = fields.ForeignKeyField("models.Cred", related_name="orders", null=True)
|
|
492
519
|
cred_id: int | None
|
|
493
|
-
taker: fields.ForeignKeyRelation[
|
|
520
|
+
taker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "taken_orders")
|
|
494
521
|
taker_id: int
|
|
495
|
-
maker_topic: int = fields.IntField()
|
|
496
|
-
taker_topic: int = fields.IntField()
|
|
522
|
+
maker_topic: int = fields.IntField(null=True) # todo: remove nullability
|
|
523
|
+
taker_topic: int = fields.IntField(null=True)
|
|
497
524
|
status: OrderStatus = fields.IntEnumField(OrderStatus)
|
|
498
525
|
created_at: datetime | None = DatetimeSecField(auto_now_add=True)
|
|
499
526
|
payed_at: datetime | None = DatetimeSecField(null=True)
|
|
@@ -528,7 +555,7 @@ class Order(Model):
|
|
|
528
555
|
class PydanticMeta(Model.PydanticMeta):
|
|
529
556
|
max_recursion: int = 0
|
|
530
557
|
exclude_raw_fields: bool = False
|
|
531
|
-
exclude = ("taker", "ad", "
|
|
558
|
+
exclude = ("taker", "ad", "cred", "msgs")
|
|
532
559
|
|
|
533
560
|
|
|
534
561
|
class Msg(Model):
|
|
@@ -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,162 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, model_validator
|
|
4
|
-
|
|
5
|
-
from xync_schema.enums import AdStatus, PmType
|
|
6
|
-
from xync_schema.models import Fiat, Agent, Direction, Pmcur, User, Ex
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class _CurCoin(BaseModel):
|
|
10
|
-
exid: int | str
|
|
11
|
-
ticker: str
|
|
12
|
-
rate: float | None = None
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class CoinEpyd(_CurCoin):
|
|
16
|
-
p2p: bool = True
|
|
17
|
-
minimum: float | None = None
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class CurEpyd(_CurCoin):
|
|
21
|
-
rounding_scale: int | None = None
|
|
22
|
-
minimum: int | None = None
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class PmexBankPyd(BaseModel):
|
|
26
|
-
id: int | None = None
|
|
27
|
-
exid: str
|
|
28
|
-
name: str
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class PmPyd(BaseModel):
|
|
32
|
-
id: int | None = None
|
|
33
|
-
name: str
|
|
34
|
-
identifier: str | None = None
|
|
35
|
-
type_: PmType | None = None
|
|
36
|
-
logo: str | None = None
|
|
37
|
-
banks: list[PmexBankPyd] | None = None
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# class PmcurPyd(BaseModel):
|
|
41
|
-
# id: int | None = None
|
|
42
|
-
# pm_id: int
|
|
43
|
-
# cur_id: int
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class FiatUpd(BaseModel):
|
|
47
|
-
detail: str | None = None
|
|
48
|
-
name: str | None = None
|
|
49
|
-
amount: float | None = None
|
|
50
|
-
target: int | None = None
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class FiatNew(FiatUpd):
|
|
54
|
-
cur_id: int
|
|
55
|
-
pm_id: int
|
|
56
|
-
detail: str
|
|
57
|
-
amount: float = 0
|
|
58
|
-
target: int | None = None
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class FiatPydIn(BaseModel):
|
|
62
|
-
# unq
|
|
63
|
-
id: int = None
|
|
64
|
-
user_id: int | None = None
|
|
65
|
-
user: User | None = None
|
|
66
|
-
pmcur_id: int | None = None
|
|
67
|
-
pmcur: Pmcur | None = None
|
|
68
|
-
# df
|
|
69
|
-
detail: str
|
|
70
|
-
name: str = ""
|
|
71
|
-
amount: float
|
|
72
|
-
target: float | None = None
|
|
73
|
-
|
|
74
|
-
banks: list[str] = []
|
|
75
|
-
|
|
76
|
-
class Config:
|
|
77
|
-
arbitrary_types_allowed = True
|
|
78
|
-
|
|
79
|
-
@classmethod
|
|
80
|
-
@model_validator(mode="before")
|
|
81
|
-
def check_at_least_one_field(cls, values):
|
|
82
|
-
if (values.get("pmcur") or values.get("pmcur_id")) and (values.get("user") or values.get("user_id")):
|
|
83
|
-
return values
|
|
84
|
-
raise ValueError("pmcur(_id) and user(_id) is required")
|
|
85
|
-
|
|
86
|
-
def args(self) -> tuple[dict, dict]:
|
|
87
|
-
unq: tuple[str, ...] = "id", "user_id", "user", "pmcur_id", "pmcur"
|
|
88
|
-
df: tuple[str, ...] = "detail", "name", "amount", "target"
|
|
89
|
-
d = self.model_dump()
|
|
90
|
-
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)}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class FiatexPydIn(BaseModel):
|
|
94
|
-
id: int | None = None
|
|
95
|
-
exid: str
|
|
96
|
-
ex: Ex | None = None
|
|
97
|
-
ex_id: int | None = None
|
|
98
|
-
fiat: Fiat | None = None
|
|
99
|
-
fiat_id: int | None = None
|
|
100
|
-
|
|
101
|
-
class Config:
|
|
102
|
-
arbitrary_types_allowed = True
|
|
103
|
-
|
|
104
|
-
@classmethod
|
|
105
|
-
@model_validator(mode="before")
|
|
106
|
-
def check_at_least_one_field(cls, values):
|
|
107
|
-
if (values.get("ex") or values.get("ex_id")) and (values.get("fiat") or values.get("fiat_id")):
|
|
108
|
-
return values
|
|
109
|
-
raise ValueError("ex(_id) and fiat(_id) is required")
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
class BaseAd(BaseModel):
|
|
113
|
-
id: int | None = None
|
|
114
|
-
price: float
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
class AdPydIn(BaseAd):
|
|
118
|
-
min_fiat: float
|
|
119
|
-
max_fiat: float | None = None
|
|
120
|
-
detail: str | None = None
|
|
121
|
-
auto_msg: str | None = None
|
|
122
|
-
status: AdStatus = AdStatus.active
|
|
123
|
-
agent_id: int | None = None
|
|
124
|
-
direction_id: int | None = None
|
|
125
|
-
agent: Agent | None = None
|
|
126
|
-
direction: Direction | None = None
|
|
127
|
-
pms_: list | None = None
|
|
128
|
-
fiats_: list | None = None
|
|
129
|
-
|
|
130
|
-
class Config:
|
|
131
|
-
arbitrary_types_allowed = True
|
|
132
|
-
|
|
133
|
-
@classmethod
|
|
134
|
-
@model_validator(mode="before")
|
|
135
|
-
def check_at_least_one_field(cls, values):
|
|
136
|
-
agent = values.get("agent") or values.get("agent_id")
|
|
137
|
-
direction = values.get("direction") or values.get("direction_id")
|
|
138
|
-
pms_or_fiats = values.get("pms_") or values.get("fiats_")
|
|
139
|
-
if agent and direction and pms_or_fiats:
|
|
140
|
-
return values
|
|
141
|
-
raise ValueError("(pms or fiats) and agent(_id) and direction(_id) is required")
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
class OrderPyd(BaseModel):
|
|
145
|
-
id: int
|
|
146
|
-
amount: float
|
|
147
|
-
status: str
|
|
148
|
-
actions: dict | None = {}
|
|
149
|
-
fiat: Fiat.pyd()
|
|
150
|
-
is_sell: bool
|
|
151
|
-
contragent: int | None = None
|
|
152
|
-
created_at: datetime
|
|
153
|
-
payed_at: datetime | None = None
|
|
154
|
-
appealed_at: datetime | None = None
|
|
155
|
-
confirmed_at: datetime | None = None
|
|
156
|
-
msgs: int = 0
|
|
157
|
-
topic: int
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
class UreadMsgs(BaseModel):
|
|
161
|
-
order_id: int
|
|
162
|
-
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
|