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.
Files changed (20) hide show
  1. {xync_schema-0.6.72/xync_schema.egg-info → xync_schema-0.6.73.dev3}/PKG-INFO +1 -1
  2. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/enums.py +4 -2
  3. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/models.py +69 -43
  4. xync_schema-0.6.73.dev3/xync_schema/pydantic.py +180 -0
  5. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3/xync_schema.egg-info}/PKG-INFO +1 -1
  6. xync_schema-0.6.72/xync_schema/pydantic.py +0 -159
  7. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.env.sample +0 -0
  8. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.gitignore +0 -0
  9. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/.pre-commit-config.yaml +0 -0
  10. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/README.md +0 -0
  11. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/makefile +0 -0
  12. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/pyproject.toml +0 -0
  13. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/setup.cfg +0 -0
  14. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/tests/__init__.py +0 -0
  15. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/tests/test_db.py +0 -0
  16. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema/__init__.py +0 -0
  17. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/SOURCES.txt +0 -0
  18. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/dependency_links.txt +0 -0
  19. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/requires.txt +0 -0
  20. {xync_schema-0.6.72 → xync_schema-0.6.73.dev3}/xync_schema.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-schema
3
- Version: 0.6.72
3
+ Version: 0.6.73.dev3
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -57,11 +57,13 @@ class TradeType(IntEnum):
57
57
 
58
58
  class PmType(IntEnum):
59
59
  bank = 0
60
- web_wallet = 1
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):
@@ -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
- contragents: fields.ReverseRelation["Contragent"]
72
+ actors: fields.ReverseRelation["Actor"]
73
73
  pmexs: fields.ReverseRelation["Pmex"]
74
- pairs: fields.ReverseRelation["Pair"]
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, agent: "Agent" = None):
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, agent)
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, TsTrait):
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 = {"coin__ticker", "cur__ticker"}
140
+ _name = {"pair__coin__ticker", "pair__cur__ticker", "ex__name"}
129
141
 
130
142
  class Meta:
131
- table_description = "Coin/Currency pairs"
132
- unique_together = (("coin", "cur", "ex"),)
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
- pair: fields.ForeignKeyRelation[Pair] = fields.ForeignKeyField("models.Pair", related_name="directions")
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 = {"pair__coin__ticker", "pair__cur__ticker", "sell"}
155
+ _name = {"pairex__coin__ticker", "pairex__cur__ticker", "sell"}
143
156
 
144
157
  class Meta:
145
158
  table_description = "Trade directions"
146
- unique_together = (("pair", "sell"),)
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
- class User(Model, TsTrait, UserInfoTrait):
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 Contragent(Model):
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="contragents")
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 = "Agents"
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
- contragent: fields.OneToOneRelation[Contragent] = fields.OneToOneField("models.Contragent", "agent")
211
- contragent_id: int
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 = {"contragent__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 = (("contragent", "user"),)
245
+ unique_together = (("actor", "user"),)
224
246
 
225
247
  class PydanticMeta(Model.PydanticMeta):
226
248
  # max_recursion = 3
227
- include = "id", "contragent__ex", "assets", "auth", "updated_at"
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.contragent.ex.name}.agent"
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.contragent.ex.name}.asset"
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
- id: int = fields.BigIntField(True)
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[Contragent] = fields.ForeignKeyField("models.Contragent", "my_ads")
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 = {"direction__pair__coin__ticker", "direction__pair__cur__ticker", "direction__sell", "price"}
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
- pmexbank: fields.ForeignKeyRelation[PmexBank] = fields.ForeignKeyField("models.PmexBank", "credbanks")
379
- pmexbank_id: int
380
- cred: fields.ForeignKeyRelation["Cred"] = fields.ForeignKeyField("models.Cred", "credbanks")
381
- cred_id: int
382
-
383
- class Meta:
384
- unique_together = (("cred_id", "pmexbank_id"),)
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
- contragent: fields.ForeignKeyRelation[Contragent] = fields.ForeignKeyField("models.Contragent", "creds")
407
- contragent_id: int
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.BackwardFKRelation[Ad]
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 = (("pmcur_id", "detail"), ("contragent", "exid"))
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.contragent.agent.user_id
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
- id: int = fields.BigIntField(True)
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[Contragent] = fields.ForeignKeyField("models.Contragent", "taken_orders")
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,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-schema
3
- Version: 0.6.72
3
+ Version: 0.6.73.dev3
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -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