xync-schema 0.6.71__tar.gz → 0.6.73__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.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: xync-schema
3
- Version: 0.6.71
3
+ Version: 0.6.73
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -8,9 +8,11 @@ Project-URL: Homepage, https://gitlab.com/xync/back/schema
8
8
  Project-URL: Repository, https://gitlab.com/xync/back/schema
9
9
  Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
- Requires-Dist: xtg-auth
11
+ Requires-Dist: xn-auth
12
+ Requires-Dist: python-dotenv
12
13
  Provides-Extra: dev
13
14
  Requires-Dist: build; extra == "dev"
15
+ Requires-Dist: pre-commit; extra == "dev"
14
16
  Requires-Dist: pytest-asyncio; extra == "dev"
15
17
  Requires-Dist: twine; extra == "dev"
16
18
 
@@ -9,11 +9,12 @@ readme = "README.md"
9
9
  license = {text = "EULA"}
10
10
  dynamic = ["version"]
11
11
 
12
- dependencies = ["xtg-auth"]
12
+ dependencies = ["xn-auth", "python-dotenv"]
13
13
 
14
14
  [project.optional-dependencies]
15
15
  dev = [
16
16
  "build",
17
+ "pre-commit",
17
18
  "pytest-asyncio",
18
19
  "twine",
19
20
  ]
@@ -7,7 +7,7 @@ from tortoise.backends.asyncpg import AsyncpgDBClient
7
7
  from x_model import init_db
8
8
 
9
9
  from xync_schema import models
10
- from xync_schema.models import Cur
10
+ from xync_schema.models import Ex
11
11
 
12
12
  load_dotenv()
13
13
 
@@ -25,5 +25,5 @@ async def test_init_db(dbc):
25
25
 
26
26
 
27
27
  async def test_models(dbc):
28
- c = await Cur.all()
29
- assert isinstance(c, list), "No currencies"
28
+ c = await Ex.first()
29
+ assert isinstance(c, Ex), "No exs"
@@ -1,6 +1,18 @@
1
1
  from enum import IntEnum
2
2
 
3
3
 
4
+ class PersonStatus(IntEnum):
5
+ VIP = 2
6
+ DEFAULT = 1
7
+ BLOCKED = 0
8
+
9
+
10
+ class UserStatus(IntEnum):
11
+ SLEEP = 0
12
+ PAY = 1
13
+ ACTIVE = 2
14
+
15
+
4
16
  class AdStatus(IntEnum):
5
17
  defActive = 0
6
18
  active = 1
@@ -57,11 +69,13 @@ class TradeType(IntEnum):
57
69
 
58
70
  class PmType(IntEnum):
59
71
  bank = 0
60
- web_wallet = 1
72
+ emoney = 1
61
73
  cash = 2
74
+ card = 4
62
75
  gift_card = 3
63
- credit_card = 4
64
76
  IFSC = 5
77
+ SBP = 6
78
+ phone = 7
65
79
 
66
80
 
67
81
  class TaskType(IntEnum):
@@ -112,9 +126,10 @@ class ExAction(IntEnum):
112
126
  coins = 22 # Список торгуемых монет (с ограничениям по валютам, если есть)
113
127
  pairs = 23 # Список пар валюта/монет
114
128
  ads = 24 # Список объяв по покупке/продаже, валюте, монете, платежному методу (buy/sell, cur, coin, pm)
115
- ad = 42 # Объява по id
116
- cur_mins = 43 # Минимальные объемы валют в объявлении
117
- coin_mins = 44 # Минимальные объемы монет в объявлении
129
+ set_coins = 44 # обновление монет биржи в бд
130
+ set_pmcurs = 45 # обновление валют и платежек биржи в бд
131
+ set_pairs = 46 # обновление пар биржи в бд
132
+ ad = 42 # Чужая объява по id
118
133
  """ Agent: Fiat """
119
134
  my_fiats = 25 # Список реквизитов моих платежных методов
120
135
  fiat_new = 26 # Создание реквизита моего платежного метода
@@ -122,6 +137,7 @@ class ExAction(IntEnum):
122
137
  fiat_del = 28 # Удаление реквизита моего платежного метода
123
138
  """ Agent: Ad """
124
139
  my_ads = 29 # Список моих объявлений
140
+ my_ad = 43 # Моя объява по id
125
141
  ad_new = 30 # Создание объявления
126
142
  ad_upd = 31 # Редактирование объявления
127
143
  ad_del = 32 # Удаление объявления
@@ -148,7 +164,7 @@ class ExAction(IntEnum):
148
164
  exs = {
149
165
  "Beribit": (
150
166
  ExType.p2p,
151
- "https://sun9-41.userapi.com/impg/cZCGFTXH5-11_HjiWw9aWr3__SlbmMIiXSc-ig/YtOHJpjuVW0.jpg?size=604x604&quality=95&sign=def93bbe4283c563eb2d75a5968350f2",
167
+ "AgACAgIAAxkBAAIEY2ferEZ38wZbpG9kmfFPjsSGC3CmAAIo8DEbF_j4StC_ac-XA5fbAQADAgADeAADNgQ",
152
168
  "beribit.app",
153
169
  "beribit.app",
154
170
  "beribit.app/login",
@@ -156,7 +172,7 @@ exs = {
156
172
  ),
157
173
  "Binance": (
158
174
  ExType.main,
159
- "https://assets.coingecko.com/markets/images/52/large/binance.jpg",
175
+ "AgACAgIAAxkBAAIEYGfeq1hpcgu2el0ROqFvWtWNHrtWAAIQ8DEbF_j4Sq7oecXCtoONAQADAgADbQADNgQ",
160
176
  "binance.com",
161
177
  "p2p.binance.com",
162
178
  "accounts.binance.com/login",
@@ -164,7 +180,7 @@ exs = {
164
180
  ),
165
181
  "BingX": (
166
182
  ExType.p2p,
167
- "https://assets.coingecko.com/markets/images/812/large/YtFwQwJr_400x400.jpg",
183
+ "AgACAgIAAxkBAAIEZWferWiY5ZCV2SAWgSnUan76cl-TAAIy8DEbF_j4Sq1aMXmyATzQAQADAgADbQADNgQ",
168
184
  "bingx.com",
169
185
  "api-app.we-api.com",
170
186
  "bingx.com/login",
@@ -174,7 +190,7 @@ exs = {
174
190
  "BitcoinGlobal": (ExType.p2p, "", "", "", "", ExStatus.plan),
175
191
  "BitGet": (
176
192
  ExType.p2p,
177
- "https://assets.coingecko.com/markets/images/591/large/2023-07-25_21.47.43.jpg",
193
+ "AgACAgIAAxkBAAIEZ2ferYwPfGrx1PX-C7SBToZG-h-iAAI08DEbF_j4StxKwJlnBT3XAQADAgADbQADNgQ",
178
194
  "www.bitget.com",
179
195
  "www.bitget.com",
180
196
  "www.bitget.com/login",
@@ -182,7 +198,7 @@ exs = {
182
198
  ),
183
199
  "BitPapa": (
184
200
  ExType.p2p,
185
- "https://avatars.mds.yandex.net/i?id=130c32d9900d514d738ef89b9c61bcd3_l-4767909-images-thumbs&n=13",
201
+ "AgACAgIAAxkBAAIEaWferbY69OMAASKXObrcYYLciuWVswACPPAxGxf4-EqNHJqqRTQmMgEAAwIAA3kAAzYE",
186
202
  "bitpapa.com",
187
203
  "bitpapa.com",
188
204
  "bitpapa.com/log-in",
@@ -191,7 +207,7 @@ exs = {
191
207
  "Bitvalve ": (ExType.p2p, "", "", "", "", ExStatus.plan),
192
208
  "Bybit": (
193
209
  ExType.main,
194
- "https://assets.coingecko.com/markets/images/698/large/bybit_spot.png",
210
+ "AgACAgIAAxkBAAIENGfeY4AfRquwTL2LpDrzqvFMVNt_AAIG9DEbXX3wSq3oI7t_PqQGAQADAgADbQADNgQ",
195
211
  "bybit.com",
196
212
  "api2.bybit.com",
197
213
  "bybit.com/login",
@@ -202,7 +218,7 @@ exs = {
202
218
  "Garantex": (ExType.p2p, "", "", "", "", ExStatus.plan),
203
219
  "Gate": (
204
220
  ExType.p2p,
205
- "https://assets.coingecko.com/markets/images/403/large/gate_io_logo.jpg",
221
+ "AgACAgIAAxkBAAIEMmfeY2WPV9axwELiZp9JsG1qVVSDAAIF9DEbXX3wSmqKNrQMcr0GAQADAgADbQADNgQ",
206
222
  "gate.io",
207
223
  "gate.io",
208
224
  "www.gate.io/login",
@@ -211,7 +227,7 @@ exs = {
211
227
  "HodlHodl": (ExType.p2p, "", "", "", "", ExStatus.plan),
212
228
  "Htx": (
213
229
  ExType.main,
214
- "https://assets.coingecko.com/markets/images/25/large/logo_V_colour_black.png",
230
+ "CAACAgIAAxkBAAIEQWfeZKFue_EuEx4aCWQuUUiBUFUWAAJcbQACXX3wSgpUwu_LgrVCNgQ",
215
231
  "www.htx.com",
216
232
  "www.htx.com",
217
233
  "htx.com/login",
@@ -220,7 +236,7 @@ exs = {
220
236
  "Koshelek": (ExType.p2p, "", "", "", "", ExStatus.plan),
221
237
  "KuCoin": (
222
238
  ExType.main,
223
- "https://assets.coingecko.com/markets/images/61/large/kucoin.png",
239
+ "AgACAgIAAxkBAAIELWfeYuCy-IaY2x4WDEFV30eDAlrLAAIC9DEbXX3wSskAAdr5c_L0LQEAAwIAA20AAzYE",
224
240
  "kucoin.com",
225
241
  "kucoin.com",
226
242
  "www.kucoin.com/ucenter/signin",
@@ -230,7 +246,7 @@ exs = {
230
246
  "LocalMonero": (ExType.p2p, "", "", "", "", ExStatus.plan),
231
247
  "Mexc": (
232
248
  ExType.main,
233
- "https://assets.coingecko.com/markets/images/409/large/MEXC_logo_square.jpeg",
249
+ "AgACAgIAAxkBAAIEJ2feYl-98-SXYJQAARlswmCK7ihM-gAD9DEbXX3wSheqy--NeUvRAQADAgADbQADNgQ",
234
250
  "www.mexc.com",
235
251
  "www.mexc.com",
236
252
  "www.mexc.com/login",
@@ -239,7 +255,7 @@ exs = {
239
255
  "Noones ": (ExType.p2p, "", "", "", "", ExStatus.plan),
240
256
  "Okx": (
241
257
  ExType.main,
242
- "https://assets.coingecko.com/markets/images/379/large/WeChat_Image_20220117220452.png",
258
+ "AgACAgIAAxkBAAIEJWfeYkG29cU8Nt1oaiskDutGInGvAAL_8zEbXX3wSrPVVMfw6kI5AQADAgADeQADNgQ",
243
259
  "www.okx.cab",
244
260
  "www.okx.cab",
245
261
  "www.okx.cab/account/login",
@@ -254,7 +270,7 @@ exs = {
254
270
  "RoboSats": (ExType.p2p, "", "", "", "", ExStatus.plan),
255
271
  "Sigen": (
256
272
  ExType.p2p,
257
- "https://yastatic.net/naydex/yandex-search/neZ1W6346/a21f02dA/2SvJ6dTLJwRiz_lTFP-fhywHqi1fxPNRcIxuKzcpwJ0DGlJzbzdT8ARet86SrINoGNj87R9U-t8HLZcrrBASQf0_6OkAL7cgl6uc0gCrHxI9Y369emE2MJF5yotCyODdZ5iXljtkQJMXTMV9VXsEL68seaiqQF578wnB3V",
273
+ "AgACAgIAAxkBAAIEIWfeYbAYWyMCtPtZ6q233_7VoQ87AAL-8zEbXX3wSqgLi3m0_G7AAQADAgADbQADNgQ",
258
274
  "sigen.pro",
259
275
  "sigen.pro",
260
276
  "sigen.pro/p2p",
@@ -265,7 +281,7 @@ exs = {
265
281
  "Solid": (ExType.main, "", "", "", "", ExStatus.plan),
266
282
  "TgWallet": (
267
283
  ExType.tg,
268
- "https://telerock.ru/uploads/posts/2024-03/f658443d9e_c9d505bbf856e2360ba6812079ba02d0.webp",
284
+ "AgACAgIAAxkBAAIEEGfd3oDil7jFpVEZh_ek2RlmDSrpAALA6jEb7cjwSo3tCIf7UsVoAQADAgADbQADNgQ",
269
285
  "walletbot.me",
270
286
  "p2p.walletbot.me",
271
287
  "walletbot.me",
@@ -275,7 +291,7 @@ exs = {
275
291
  "WazirX": (ExType.p2p, "", "", "", "", ExStatus.plan),
276
292
  "WebMoney": (
277
293
  ExType.p2p,
278
- "https://vectorseek.com/wp-content/uploads/2023/08/Webmoney-Icon-Logo-Vector.svg-.png",
294
+ "AgACAgIAAxkBAAIEb2ferkkq2wWB-aJwIY6I2VZxSK4CAAJM8DEbF_j4SlHZDVKCzkUxAQADAgADeQADNgQ",
279
295
  "exchanger.money",
280
296
  "exchanger.money",
281
297
  "exchanger.money",
@@ -284,7 +300,7 @@ exs = {
284
300
  "WhiteBIT": (ExType.p2p, "", "", "", "", ExStatus.plan),
285
301
  "xRocket": (
286
302
  ExType.p2p,
287
- "https://cdn.allmylinks.com/prod/Upload/file/R/L/6/8G0TaGNtUV8C1V7VQsivDtJcpEz2z7Lc.jpg",
303
+ "AgACAgIAAxkBAAIEHWfeXy5a7fM9D5ys8ReQrDIRpwAB0wAC8_MxG1198Eo01GgWSVjQ3wEAAwIAA3gAAzYE",
288
304
  "",
289
305
  "",
290
306
  "",
@@ -1,36 +1,45 @@
1
1
  import sys
2
2
  from datetime import datetime
3
+
3
4
  from tortoise import fields
4
5
  from tortoise.queryset import QuerySet
5
6
  from tortoise import Model as BaseModel
6
- from x_auth.enums import Role
7
- from x_auth.models import Model
7
+ from x_auth.models import Model, UserTg
8
8
  from x_model.models import TsTrait, DatetimeSecField
9
- from tg_auth.models import UserStatus, AuthUser, UserInfoTrait
10
9
 
11
- from xync_schema.enums import ExType, AdStatus, AssetType, OrderStatus, ExAction, ExStatus
10
+ from xync_schema.enums import (
11
+ ExType,
12
+ AdStatus,
13
+ AssetType,
14
+ OrderStatus,
15
+ ExAction,
16
+ ExStatus,
17
+ PersonStatus,
18
+ UserStatus,
19
+ PmType,
20
+ )
12
21
 
13
22
 
14
- # class Country(Model):
15
- # id = fields.SmallIntField(True)
16
- # code: int | None = fields.IntField(null=True)
17
- # short: str | None = fields.CharField(3, unique=True, null=True)
18
- # name: str | None = fields.CharField(63, unique=True, null=True)
19
- # cur: fields.ForeignKeyRelation["Cur"] = fields.ForeignKeyField("models.Cur", related_name="countries")
20
- # curexs: fields.ManyToManyRelation["Curex"]
21
- # fiats: fields.BackwardFKRelation["Fiat"]
23
+ class Country(Model):
24
+ id = fields.SmallIntField(True)
25
+ code: int | None = fields.IntField(null=True)
26
+ short: str | None = fields.CharField(3, null=True)
27
+ name: str | None = fields.CharField(63, unique=True, null=True)
28
+ cur: fields.ForeignKeyRelation["Cur"] = fields.ForeignKeyField("models.Cur", related_name="countries")
29
+ curexs: fields.ManyToManyRelation["Curex"]
30
+ fiats: fields.BackwardFKRelation["Fiat"]
22
31
 
23
32
 
24
33
  class Cur(Model):
25
34
  id = fields.SmallIntField(True)
26
35
  ticker: str = fields.CharField(3, unique=True)
36
+ scale: int = fields.SmallIntField(default=0)
27
37
  rate: float | None = fields.FloatField(default=0, null=True)
28
- # country: str | None = fields.CharField(63, null=True)
29
38
 
30
39
  pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="pmcur")
31
40
  exs: fields.ManyToManyRelation["Ex"] = fields.ManyToManyField("models.Ex", through="curex")
32
41
  pairs: fields.ReverseRelation["Pair"]
33
- # countries: fields.ReverseRelation[Country]
42
+ countries: fields.ReverseRelation[Country]
34
43
 
35
44
  _name = {"ticker"}
36
45
 
@@ -41,6 +50,7 @@ class Cur(Model):
41
50
  class Coin(Model):
42
51
  id: int = fields.SmallIntField(True)
43
52
  ticker: str = fields.CharField(15, unique=True)
53
+ scale: int = fields.SmallIntField(default=0)
44
54
  rate: float | None = fields.FloatField(default=0)
45
55
  is_fiat: bool = fields.BooleanField(default=False)
46
56
  exs: fields.ManyToManyRelation["Ex"] = fields.ManyToManyField("models.Ex", through="coinex")
@@ -66,14 +76,14 @@ class Ex(Model):
66
76
 
67
77
  pms: fields.ManyToManyRelation["Pm"]
68
78
  curs: fields.ManyToManyRelation[Cur]
69
- pmcurs: fields.ManyToManyRelation["Pmcur"] = fields.ManyToManyField("models.Pmcur", through="pmcurex")
79
+ # pmcurs: fields.ManyToManyRelation["Pmcur"] = fields.ManyToManyField("models.Pmcur", through="pmcurex")
70
80
  coins: fields.ManyToManyRelation[Coin]
71
81
 
72
- agents: fields.ReverseRelation["Agent"]
82
+ actors: fields.ReverseRelation["Actor"]
73
83
  pmexs: fields.ReverseRelation["Pmex"]
74
- pairs: fields.ReverseRelation["Pair"]
84
+ pairexs: fields.ReverseRelation["PairEx"]
75
85
  # deps: fields.ReverseRelation["Dep"]
76
- # tests: fields.ReverseRelation["TestEx"]
86
+ tests: fields.ReverseRelation["TestEx"]
77
87
 
78
88
  class Meta:
79
89
  table_description = "Exchanges"
@@ -82,22 +92,22 @@ class Ex(Model):
82
92
  class PydanticMeta(Model.PydanticMeta):
83
93
  include = "name", "logo"
84
94
 
85
- def client(self, agent: "Agent" = None):
95
+ def client(self):
86
96
  module_name = f"xync_client.{self.name}.ex"
87
97
  __import__(module_name)
88
98
  client = sys.modules[module_name].ExClient
89
- return client(self, agent)
99
+ return client(self)
90
100
 
91
101
 
92
102
  class Curex(BaseModel):
93
103
  cur: fields.ForeignKeyRelation[Cur] = fields.ForeignKeyField("models.Cur")
94
104
  ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex")
95
- exid: str = fields.CharField(31)
96
- minimum: float = fields.FloatField(null=True)
105
+ exid: str = fields.CharField(32)
106
+ minimum: int = fields.SmallIntField(null=True)
97
107
  rounding_scale: int = fields.SmallIntField(null=True)
98
- # countries: fields.ManyToManyRelation[Country] = fields.ManyToManyField(
99
- # "models.Country", through="curexcountry", backward_key="curexs"
100
- # )
108
+ countries: fields.ManyToManyRelation[Country] = fields.ManyToManyField(
109
+ "models.Country", through="curexcountry", backward_key="curexs"
110
+ )
101
111
 
102
112
  class Meta:
103
113
  table_description = "Currency in Exchange"
@@ -109,7 +119,7 @@ class Coinex(BaseModel):
109
119
  ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex")
110
120
  minimum: float = fields.FloatField(null=True)
111
121
 
112
- exid: str = fields.CharField(31)
122
+ exid: str = fields.CharField(32)
113
123
  p2p: bool = fields.BooleanField(default=True)
114
124
 
115
125
  class Meta:
@@ -117,50 +127,75 @@ class Coinex(BaseModel):
117
127
  unique_together = (("ex_id", "coin_id"), ("ex_id", "exid"))
118
128
 
119
129
 
120
- class Pair(Model, TsTrait):
130
+ class Pair(Model):
121
131
  id = fields.SmallIntField(True)
122
132
  coin: fields.ForeignKeyRelation[Coin] = fields.ForeignKeyField("models.Coin", related_name="pairs")
123
133
  cur: fields.ForeignKeyRelation[Cur] = fields.ForeignKeyField("models.Cur", related_name="pairs")
134
+
135
+ _name = {"coin__ticker", "cur__ticker"}
136
+
137
+ class Meta:
138
+ table_description = "Coin/Currency pairs"
139
+ unique_together = (("coin", "cur"),)
140
+
141
+
142
+ class PairEx(Model, TsTrait):
143
+ pair: fields.ForeignKeyRelation[Pair] = fields.ForeignKeyField("models.Pair", related_name="pairexs")
144
+ pair_id: int
124
145
  fee: float = fields.FloatField(default=0)
125
146
  ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="pairs")
147
+ ex_id: int
126
148
  directions: fields.ReverseRelation["Direction"]
127
149
 
128
- _name = {"coin__ticker", "cur__ticker"}
150
+ _name = {"pair__coin__ticker", "pair__cur__ticker", "ex__name"}
129
151
 
130
152
  class Meta:
131
- table_description = "Coin/Currency pairs"
132
- unique_together = (("coin", "cur", "ex"),)
153
+ table_description = "Pairs on Exs"
154
+ unique_together = (("pair", "ex"),)
133
155
 
134
156
 
135
157
  class Direction(Model):
136
158
  id = fields.SmallIntField(True)
137
- pair: fields.ForeignKeyRelation[Pair] = fields.ForeignKeyField("models.Pair", related_name="directions")
159
+ pairex: fields.ForeignKeyRelation[PairEx] = fields.ForeignKeyField("models.PairEx", related_name="directions")
160
+ pairex_id: int
138
161
  sell: bool = fields.BooleanField()
139
162
  total: int = fields.IntField(null=True)
140
163
  ads: fields.ReverseRelation["Ad"]
141
164
 
142
- _name = {"pair__coin__ticker", "pair__cur__ticker", "sell"}
165
+ _name = {"pairex__coin__ticker", "pairex__cur__ticker", "sell"}
143
166
 
144
167
  class Meta:
145
168
  table_description = "Trade directions"
146
- unique_together = (("pair", "sell"),)
169
+ unique_together = (("pairex", "sell"),)
147
170
 
148
171
 
149
- class User(Model, TsTrait, UserInfoTrait):
150
- id: int = fields.BigIntField(True)
151
- forum: int = fields.BigIntField()
152
- role: Role = fields.IntEnumField(Role, default=Role.READER)
153
- status: UserStatus = fields.IntEnumField(UserStatus, default=UserStatus.RESTRICTED)
154
- username: str | None = fields.CharField(95, unique=True, null=True)
172
+ class Person(Model, TsTrait):
173
+ status: PersonStatus = fields.IntEnumField(PersonStatus, default=PersonStatus.DEFAULT)
174
+ name: str | None = fields.CharField(127, null=True)
175
+
176
+ user: fields.BackwardOneToOneRelation["User"]
177
+ creds: fields.BackwardFKRelation["Cred"]
178
+ actors: fields.BackwardFKRelation["Actor"]
179
+
180
+
181
+ class User(UserTg, TsTrait):
182
+ status: UserStatus = fields.IntEnumField(UserStatus, default=UserStatus.SLEEP)
183
+
184
+ person: fields.OneToOneRelation[Person] = fields.OneToOneField("models.Person", related_name="user")
185
+ person_id: int
155
186
  ref: fields.ForeignKeyNullableRelation["User"] = fields.ForeignKeyField(
156
187
  "models.User", related_name="proteges", null=True
157
188
  )
158
189
  ref_id: int | None
159
190
 
191
+ forum: fields.BackwardOneToOneRelation["Forum"]
192
+ created_forums: fields.BackwardFKRelation["Forum"]
160
193
  proteges: fields.BackwardFKRelation["User"]
161
- agents: fields.BackwardFKRelation["Agent"]
162
- fiats: fields.BackwardFKRelation["Fiat"]
194
+ creds: fields.BackwardFKRelation["Cred"]
195
+ actors: fields.BackwardFKRelation["Actor"]
196
+ # fiats: fields.BackwardFKRelation["Fiat"]
163
197
  limits: fields.BackwardFKRelation["Limit"]
198
+ msgs: fields.BackwardFKRelation["Msg"]
164
199
  # vpn: fields.BackwardOneToOneRelation["Vpn"]
165
200
  # invite_requests: fields.BackwardFKRelation["Invite"]
166
201
  # invite_approvals: fields.BackwardFKRelation["Invite"]
@@ -169,65 +204,64 @@ class User(Model, TsTrait, UserInfoTrait):
169
204
  # investments: fields.BackwardFKRelation["Investment"]
170
205
 
171
206
  async def free_assets(self):
172
- assets = await Asset.filter(agent__user_id=self.id).values("free", "coin__rate")
207
+ assets = await Asset.filter(agent__actor__person__user__id=self.id).values("free", "coin__rate")
173
208
  return sum(asset["free"] * asset["coin__rate"] for asset in assets)
174
209
 
175
210
  async def fiats_sum(self):
176
- fiats = await Fiat.filter(user=self).values("amount", "pmcur__cur__rate")
177
- return sum(fiat["amount"] * fiat["pmcur__cur__rate"] for fiat in fiats)
211
+ fiats = await Fiat.filter(cred__person__user__id=self.id).values("amount", "cred__pmcur__cur__rate")
212
+ return sum(fiat["amount"] * fiat["cred__pmcur__cur__rate"] for fiat in fiats)
178
213
 
179
214
  async def balance(self) -> float:
180
215
  return await self.free_assets() + await self.fiats_sum()
181
216
 
182
- def get_auth(self) -> AuthUser:
183
- return AuthUser.model_validate(self, from_attributes=True)
217
+ def name(self):
218
+ return f"{self.first_name} {self.last_name}".rstrip()
184
219
 
185
- # class PydanticMeta(Model.PydanticMeta):
186
- # max_recursion = 0
187
- # include = "role", "status"
188
- # computed = ["balance"]
220
+ class PydanticMeta(Model.PydanticMeta):
221
+ max_recursion = 0
222
+ include = "role", "status"
223
+ # computed = ["balance"]
189
224
 
190
225
 
191
- class Contragent(Model):
226
+ class Forum(Model, TsTrait):
227
+ id: int = fields.BigIntField(True)
228
+ joined: bool = fields.BooleanField(default=False)
229
+ user: fields.OneToOneRelation[User] = fields.OneToOneField("models.User", "forum")
230
+ user_id: int
231
+ # created_by: fields.BackwardFKRelation[User] = fields.ForeignKeyField("models.User", "created_forums")
232
+
233
+
234
+ class Actor(Model):
192
235
  exid: int = fields.BigIntField()
193
236
  name: int = fields.CharField(63)
194
- ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="contragents")
237
+ ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="actors")
195
238
  ex_id: int
196
- updated_at: datetime | None = DatetimeSecField(auto_now=True)
239
+ person: fields.ForeignKeyRelation[Person] = fields.ForeignKeyField("models.Person", related_name="actors")
240
+ person_id: int
197
241
 
198
242
  agent: fields.BackwardOneToOneRelation["Agent"]
243
+ ads: fields.BackwardFKRelation["Ad"]
199
244
  taken_orders: fields.BackwardFKRelation["Order"]
200
- my_ads: fields.BackwardFKRelation["Ad"]
201
245
 
202
246
  class Meta:
203
- table_description = "Agents"
204
- unique_together = (("ex", "exid"),)
247
+ table_description = "Actors"
248
+ unique_together = (("ex", "exid"), ("ex", "person"))
205
249
 
206
250
 
207
- class Agent(Model):
208
- auth: dict[str, str] = fields.JSONField(null=True)
209
- contragent: fields.OneToOneRelation[Contragent] = fields.OneToOneField("models.Contragent", "agent")
210
- contragent_id: int
211
- user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="agents")
212
- user_id: int
213
- assets: fields.ReverseRelation["Asset"]
251
+ class Agent(Model, TsTrait):
252
+ auth: dict[str, str] = fields.JSONField(default={})
253
+ actor: fields.OneToOneRelation[Actor] = fields.OneToOneField("models.Actor", "agent")
254
+ actor_id: int
214
255
 
215
- _name = {"contragent__name"}
256
+ assets: fields.ReverseRelation["Asset"]
216
257
 
217
- def balance(self) -> int:
218
- return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
258
+ _name = {"actor__name"}
219
259
 
220
- class Meta:
221
- table_description = "Agents"
222
- unique_together = (("contragent", "user"),)
223
-
224
- class PydanticMeta(Model.PydanticMeta):
225
- # max_recursion = 3
226
- include = "id", "contragent__ex", "assets", "auth", "updated_at"
227
- computed = ["balance"]
260
+ # def balance(self) -> int:
261
+ # return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
228
262
 
229
263
  def client(self):
230
- module_name = f"xync_client.{self.contragent.ex.name}.agent"
264
+ module_name = f"xync_client.{self.actor.ex.name}.agent"
231
265
  __import__(module_name)
232
266
  client = sys.modules[module_name].AgentClient
233
267
  return client(self)
@@ -241,20 +275,25 @@ class Agent(Model):
241
275
  # return client(self)
242
276
 
243
277
  def asset_client(self):
244
- module_name = f"xync_client.{self.contragent.ex.name}.asset"
278
+ module_name = f"xync_client.{self.actor.ex.name}.asset"
245
279
  __import__(module_name)
246
280
  client = sys.modules[module_name].AssetClient
247
281
  return client(self)
248
282
 
283
+ # class PydanticMeta(Model.PydanticMeta):
284
+ # max_recursion = 3
285
+ # include = "id", "actor__ex", "auth", "updated_at"
286
+ # computed = ["balance"]
249
287
 
250
- class Adpm(Model):
251
- ad: fields.ForeignKeyRelation["Ad"] = fields.ForeignKeyField("models.Ad")
252
- pm: fields.ForeignKeyRelation["Pm"] = fields.ForeignKeyField("models.Pm")
253
-
254
- _name = {"ad__id", "pm__name"}
255
288
 
256
- class Meta:
257
- table_description = "P2P Advertisements - Payment methods"
289
+ # class Adpm(Model):
290
+ # ad: fields.ForeignKeyRelation["Ad"] = fields.ForeignKeyField("models.Ad")
291
+ # pm: fields.ForeignKeyRelation["Pm"] = fields.ForeignKeyField("models.Pm")
292
+ #
293
+ # _name = {"ad__id", "pm__name"}
294
+ #
295
+ # class Meta:
296
+ # table_description = "P2P Advertisements - Payment methods"
258
297
 
259
298
 
260
299
  # class AdCred(Model):
@@ -268,16 +307,16 @@ class Adpm(Model):
268
307
 
269
308
 
270
309
  class Ad(Model, TsTrait):
271
- id: int = fields.BigIntField(True)
310
+ exid: int = fields.BigIntField()
272
311
  direction: fields.ForeignKeyRelation[Direction] = fields.ForeignKeyField("models.Direction", related_name="ads")
273
312
  price: float = fields.FloatField()
274
- max_fiat: float = fields.FloatField()
275
313
  min_fiat: float = fields.FloatField()
314
+ max_fiat: float = fields.FloatField()
276
315
  detail: str | None = fields.CharField(4095, null=True)
277
316
  auto_msg: str | None = fields.CharField(255, null=True)
278
- status: AdStatus = fields.IntEnumField(AdStatus, defaut=AdStatus.active)
317
+ status: AdStatus = fields.IntEnumField(AdStatus, default=AdStatus.active)
279
318
 
280
- maker: fields.ForeignKeyRelation[Contragent] = fields.ForeignKeyField("models.Contragent", "my_ads")
319
+ maker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "my_ads")
281
320
  maker_id: int
282
321
 
283
322
  pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="adpm") # only root pms
@@ -285,7 +324,7 @@ class Ad(Model, TsTrait):
285
324
  orders: fields.ReverseRelation["Order"]
286
325
 
287
326
  _icon = "ad"
288
- _name = {"direction__pair__coin__ticker", "direction__pair__cur__ticker", "direction__sell", "price"}
327
+ _name = {"direction__pairex__coin__ticker", "direction__pairex__cur__ticker", "direction__sell", "price"}
289
328
 
290
329
  class Meta:
291
330
  table_description = "P2P Advertisements"
@@ -304,11 +343,17 @@ class Ad(Model, TsTrait):
304
343
 
305
344
 
306
345
  class Pm(Model):
307
- name: str = fields.CharField(63, unique=True)
308
- identifier: str | None = fields.CharField(63, unique=True, null=True)
309
- # type_: PmType | None = fields.IntEnumField(PmType, null=True)
310
- type_: int | None = fields.SmallIntField(null=True)
311
- logo: str | None = fields.CharField(127, null=True)
346
+ # name: str = fields.CharField(63) # mv to pmex cause it diffs on each ex
347
+ norm: str | None = fields.CharField(63)
348
+ acronym: str | None = fields.CharField(7, null=True)
349
+ country: fields.ForeignKeyRelation[Country] = fields.ForeignKeyField("models.Country", "pms", null=True)
350
+ alias: str | None = fields.CharField(63, null=True)
351
+ extra: str | None = fields.CharField(63, null=True)
352
+ ok: bool = fields.BooleanField(default=True)
353
+ bank: bool | None = fields.BooleanField(null=True)
354
+
355
+ typ: PmType | None = fields.IntEnumField(PmType, null=True)
356
+ logo: str | None = fields.CharField(119, null=True)
312
357
 
313
358
  ads: fields.ManyToManyRelation[Ad]
314
359
  curs: fields.ManyToManyRelation[Cur]
@@ -319,6 +364,7 @@ class Pm(Model):
319
364
 
320
365
  class Meta:
321
366
  table_description = "Payment methods"
367
+ unique_together = (("norm", "country_id"), ("alias", "country_id"))
322
368
 
323
369
  # class PydanticMeta(Model.PydanticMeta):
324
370
  # max_recursion = 3
@@ -350,17 +396,21 @@ class Pmcur(Model): # for fiat with no exs tie
350
396
 
351
397
 
352
398
  class Pmex(BaseModel): # existence pm in ex with no cur tie
353
- pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
354
- pm_id: int
355
399
  ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", "pmexs")
356
400
  ex_id: int
401
+ pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
402
+ pm_id: int
357
403
  exid: str = fields.CharField(63)
358
404
  name: str = fields.CharField(63)
405
+ name_: str = fields.CharField(63, null=True)
359
406
 
360
407
  banks: fields.BackwardFKRelation["PmexBank"]
361
408
 
362
409
  class Meta:
363
- unique_together = (("ex_id", "exid"),)
410
+ unique_together = (
411
+ ("ex", "exid"),
412
+ ("ex", "name_"),
413
+ ) # , ("ex", "pm"), ("ex", "name") # todo: tmp removed for HTX duplicates
364
414
 
365
415
 
366
416
  class PmexBank(BaseModel): # banks for SBP
@@ -369,18 +419,10 @@ class PmexBank(BaseModel): # banks for SBP
369
419
  exid: str = fields.CharField(63)
370
420
  name: str = fields.CharField(63)
371
421
 
372
- class Meta:
373
- unique_together = (("pmex", "exid"),)
374
-
375
-
376
- class FiatBank(BaseModel): # banks for SBP
377
- pmexbank: fields.ForeignKeyRelation[PmexBank] = fields.ForeignKeyField("models.PmexBank", "fiatbanks")
378
- pmexbank_id: int
379
- cred: fields.ForeignKeyRelation["Cred"] = fields.ForeignKeyField("models.Cred", "credbanks")
380
- cred_id: int
422
+ creds: fields.ManyToManyRelation["Cred"]
381
423
 
382
424
  class Meta:
383
- unique_together = (("cred_id", "pmexbank_id"),)
425
+ unique_together = (("pmex", "exid"),)
384
426
 
385
427
 
386
428
  # class Pmcurex(BaseModel): # existence pm in ex for exact cur, with "blocked" flag
@@ -395,34 +437,45 @@ class FiatBank(BaseModel): # banks for SBP
395
437
 
396
438
 
397
439
  class Cred(Model):
398
- exid: int = fields.BigIntField()
399
440
  pmcur: fields.ForeignKeyRelation[Pmcur] = fields.ForeignKeyField("models.Pmcur")
400
441
  pmcur_id: int
401
- # country: fields.ForeignKeyRelation[Country] = fields.ForeignKeyField("models.Country", related_name="fiats")
402
- # country_id: int
403
442
  detail: str = fields.CharField(127)
404
443
  name: str | None = fields.CharField(127, null=True)
405
- contragent: fields.ForeignKeyRelation[Contragent] = fields.ForeignKeyField("models.Contragent", "creds")
406
- contragent_id: int
444
+ person: fields.ForeignKeyRelation[Person] = fields.ForeignKeyField("models.Person", "creds")
445
+ person_id: int
446
+
447
+ banks: fields.ManyToManyRelation[PmexBank] = fields.ManyToManyField("models.PmexBank", related_name="creds")
407
448
 
408
449
  fiat: fields.BackwardOneToOneRelation["Fiat"]
409
- ads: fields.BackwardFKRelation[Ad]
450
+ ads: fields.ManyToManyRelation[Ad]
410
451
  orders: fields.BackwardFKRelation["Order"]
411
452
 
412
- _name = {"exid"}
453
+ _name = {"detail"}
413
454
 
414
455
  class Meta:
415
456
  table_description = "Currency accounts"
416
- unique_together = (("pmcur_id", "detail"), ("contragent", "exid"))
457
+ unique_together = (("person_id", "pmcur_id", "detail"),)
458
+
459
+
460
+ class CredEx(Model):
461
+ exid: int = fields.BigIntField()
462
+ cred: fields.ForeignKeyRelation[Cred] = fields.ForeignKeyField("models.Cred", "credexs")
463
+ cred_id: int
464
+ ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", "credexs")
465
+ ex_id: int
466
+
467
+ _name = {"exid"}
468
+
469
+ class Meta:
470
+ table_description = "Credential on Exchange"
471
+ unique_together = (("ex", "exid"),)
417
472
 
418
473
 
419
474
  class Fiat(Model):
420
475
  cred: fields.OneToOneRelation[Cred] = fields.OneToOneField("models.Cred", "fiat")
421
476
  cred_id: int
422
- # user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", "fiats")
423
- # user_id: int # cred.contragent.agent.user_id
424
477
  amount: float | None = fields.FloatField(default=0)
425
- target: float | None = fields.FloatField(default=None, null=True)
478
+ target: float = fields.FloatField(default=0)
426
479
 
427
480
  class Meta:
428
481
  table_description = "Currency balances"
@@ -484,16 +537,16 @@ class Asset(Model):
484
537
 
485
538
 
486
539
  class Order(Model):
487
- id: int = fields.BigIntField(True)
540
+ exid: int = fields.BigIntField()
488
541
  ad: fields.ForeignKeyRelation[Ad] = fields.ForeignKeyField("models.Ad", related_name="ads")
489
542
  ad_id: int
490
543
  amount: float = fields.FloatField()
491
544
  cred: fields.ForeignKeyRelation[Cred] = fields.ForeignKeyField("models.Cred", related_name="orders", null=True)
492
545
  cred_id: int | None
493
- taker: fields.ForeignKeyRelation[Contragent] = fields.ForeignKeyField("models.Contragent", "taken_orders")
546
+ taker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "taken_orders")
494
547
  taker_id: int
495
- maker_topic: int = fields.IntField()
496
- taker_topic: int = fields.IntField()
548
+ maker_topic: int = fields.IntField(null=True) # todo: remove nullability
549
+ taker_topic: int = fields.IntField(null=True)
497
550
  status: OrderStatus = fields.IntEnumField(OrderStatus)
498
551
  created_at: datetime | None = DatetimeSecField(auto_now_add=True)
499
552
  payed_at: datetime | None = DatetimeSecField(null=True)
@@ -528,7 +581,7 @@ class Order(Model):
528
581
  class PydanticMeta(Model.PydanticMeta):
529
582
  max_recursion: int = 0
530
583
  exclude_raw_fields: bool = False
531
- exclude = ("taker", "ad", "fiat", "msgs")
584
+ exclude = ("taker", "ad", "cred", "msgs")
532
585
 
533
586
 
534
587
  class Msg(Model):
@@ -536,7 +589,7 @@ class Msg(Model):
536
589
  txt: str = fields.CharField(255)
537
590
  read: bool = fields.BooleanField(default=False)
538
591
  media: str | None = fields.CharField(255, null=True)
539
- receiver: fields.ForeignKeyRelation[Agent] = fields.ForeignKeyField("models.Agent", related_name="msgs")
592
+ receiver: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="msgs")
540
593
  order: fields.ForeignKeyRelation[Order] = fields.ForeignKeyField("models.Order", related_name="msgs")
541
594
 
542
595
  class PydanticMeta(Model.PydanticMeta):
@@ -0,0 +1,85 @@
1
+ from datetime import datetime
2
+ from pydantic import BaseModel, Field
3
+
4
+ from xync_schema.enums import AdStatus, OrderStatus
5
+ from xync_schema import models
6
+
7
+
8
+ class UnitEx(BaseModel):
9
+ exid: int | str
10
+ ticker: str
11
+ scale: int = None
12
+ rate: float | None = None
13
+
14
+
15
+ class CoinEx(UnitEx):
16
+ p2p: bool = None
17
+ minimum: float | None = None
18
+
19
+
20
+ class CurEx(UnitEx):
21
+ rounding_scale: int | None = None
22
+ minimum: int | None = None
23
+
24
+
25
+ class PmexBank(BaseModel):
26
+ # id: int | None = None
27
+ exid: str
28
+ name: str
29
+
30
+
31
+ # class Pmcur(Struct):
32
+ # id: int | None = None
33
+ # pm_id: int
34
+ # cur_id: int
35
+
36
+
37
+ class BaseAd(BaseModel):
38
+ price: float
39
+ exid: int | None = Field(alias="id")
40
+
41
+
42
+ class BaseAdIn(BaseAd):
43
+ min_fiat: float
44
+ max_fiat: float
45
+ direction: models.Direction
46
+ detail: str | None = None
47
+ auto_msg: str | None = None
48
+ status: AdStatus = AdStatus.active
49
+ maker: models.Actor = None
50
+ _unq = "exid", "maker", "direction"
51
+
52
+ class Config:
53
+ arbitrary_types_allowed = True
54
+
55
+
56
+ class AdBuyIn(BaseAdIn):
57
+ pms_: list[models.Pm]
58
+
59
+
60
+ class AdSaleIn(BaseAdIn):
61
+ creds_: list[models.Cred]
62
+
63
+
64
+ class BaseOrder(BaseModel):
65
+ id: int | None = None
66
+
67
+
68
+ class OrderIn(BaseModel):
69
+ exid: int
70
+ amount: float
71
+ created_at: datetime
72
+ ad: models.Ad
73
+ cred: models.Cred
74
+ taker: models.Actor
75
+ id: int = None
76
+ maker_topic: int | None = None
77
+ taker_topic: int | None = None
78
+ status: OrderStatus = OrderStatus.created
79
+ payed_at: datetime | None = None
80
+ confirmed_at: datetime | None = None
81
+ appealed_at: datetime | None = None
82
+ _unq = "id", "exid", "amount", "maker_topic", "taker_topic", "ad", "cred", "taker"
83
+
84
+ class Config:
85
+ arbitrary_types_allowed = True
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: xync-schema
3
- Version: 0.6.71
3
+ Version: 0.6.73
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -8,9 +8,11 @@ Project-URL: Homepage, https://gitlab.com/xync/back/schema
8
8
  Project-URL: Repository, https://gitlab.com/xync/back/schema
9
9
  Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
- Requires-Dist: xtg-auth
11
+ Requires-Dist: xn-auth
12
+ Requires-Dist: python-dotenv
12
13
  Provides-Extra: dev
13
14
  Requires-Dist: build; extra == "dev"
15
+ Requires-Dist: pre-commit; extra == "dev"
14
16
  Requires-Dist: pytest-asyncio; extra == "dev"
15
17
  Requires-Dist: twine; extra == "dev"
16
18
 
@@ -9,7 +9,7 @@ tests/test_db.py
9
9
  xync_schema/__init__.py
10
10
  xync_schema/enums.py
11
11
  xync_schema/models.py
12
- xync_schema/pydantic.py
12
+ xync_schema/types.py
13
13
  xync_schema.egg-info/PKG-INFO
14
14
  xync_schema.egg-info/SOURCES.txt
15
15
  xync_schema.egg-info/dependency_links.txt
@@ -1,6 +1,8 @@
1
- xtg-auth
1
+ xn-auth
2
+ python-dotenv
2
3
 
3
4
  [dev]
4
5
  build
6
+ pre-commit
5
7
  pytest-asyncio
6
8
  twine
@@ -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