xync-schema 0.6.71__py3-none-any.whl → 0.6.73__py3-none-any.whl
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/enums.py +36 -20
- xync_schema/models.py +176 -123
- xync_schema/types.py +85 -0
- {xync_schema-0.6.71.dist-info → xync_schema-0.6.73.dist-info}/METADATA +5 -3
- xync_schema-0.6.73.dist-info/RECORD +8 -0
- {xync_schema-0.6.71.dist-info → xync_schema-0.6.73.dist-info}/WHEEL +1 -1
- xync_schema/pydantic.py +0 -162
- xync_schema-0.6.71.dist-info/RECORD +0 -8
- {xync_schema-0.6.71.dist-info → xync_schema-0.6.73.dist-info}/top_level.txt +0 -0
xync_schema/enums.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
303
|
+
"AgACAgIAAxkBAAIEHWfeXy5a7fM9D5ys8ReQrDIRpwAB0wAC8_MxG1198Eo01GgWSVjQ3wEAAwIAA3gAAzYE",
|
|
288
304
|
"",
|
|
289
305
|
"",
|
|
290
306
|
"",
|
xync_schema/models.py
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
+
actors: fields.ReverseRelation["Actor"]
|
|
73
83
|
pmexs: fields.ReverseRelation["Pmex"]
|
|
74
|
-
|
|
84
|
+
pairexs: fields.ReverseRelation["PairEx"]
|
|
75
85
|
# deps: fields.ReverseRelation["Dep"]
|
|
76
|
-
|
|
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
|
|
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
|
|
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(
|
|
96
|
-
minimum:
|
|
105
|
+
exid: str = fields.CharField(32)
|
|
106
|
+
minimum: int = fields.SmallIntField(null=True)
|
|
97
107
|
rounding_scale: int = fields.SmallIntField(null=True)
|
|
98
|
-
|
|
99
|
-
|
|
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(
|
|
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
|
|
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 = {"
|
|
150
|
+
_name = {"pair__coin__ticker", "pair__cur__ticker", "ex__name"}
|
|
129
151
|
|
|
130
152
|
class Meta:
|
|
131
|
-
table_description = "
|
|
132
|
-
unique_together = (("
|
|
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
|
-
|
|
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 = {"
|
|
165
|
+
_name = {"pairex__coin__ticker", "pairex__cur__ticker", "sell"}
|
|
143
166
|
|
|
144
167
|
class Meta:
|
|
145
168
|
table_description = "Trade directions"
|
|
146
|
-
unique_together = (("
|
|
169
|
+
unique_together = (("pairex", "sell"),)
|
|
147
170
|
|
|
148
171
|
|
|
149
|
-
class
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
162
|
-
|
|
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(
|
|
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(
|
|
177
|
-
return sum(fiat["amount"] * fiat["
|
|
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
|
|
183
|
-
return
|
|
217
|
+
def name(self):
|
|
218
|
+
return f"{self.first_name} {self.last_name}".rstrip()
|
|
184
219
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
220
|
+
class PydanticMeta(Model.PydanticMeta):
|
|
221
|
+
max_recursion = 0
|
|
222
|
+
include = "role", "status"
|
|
223
|
+
# computed = ["balance"]
|
|
189
224
|
|
|
190
225
|
|
|
191
|
-
class
|
|
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="
|
|
237
|
+
ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", related_name="actors")
|
|
195
238
|
ex_id: int
|
|
196
|
-
|
|
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 = "
|
|
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(
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
256
|
+
assets: fields.ReverseRelation["Asset"]
|
|
216
257
|
|
|
217
|
-
|
|
218
|
-
return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
|
|
258
|
+
_name = {"actor__name"}
|
|
219
259
|
|
|
220
|
-
|
|
221
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
257
|
-
|
|
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
|
-
|
|
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,
|
|
317
|
+
status: AdStatus = fields.IntEnumField(AdStatus, default=AdStatus.active)
|
|
279
318
|
|
|
280
|
-
maker: fields.ForeignKeyRelation[
|
|
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 = {"
|
|
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
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (("
|
|
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
|
-
|
|
406
|
-
|
|
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.
|
|
450
|
+
ads: fields.ManyToManyRelation[Ad]
|
|
410
451
|
orders: fields.BackwardFKRelation["Order"]
|
|
411
452
|
|
|
412
|
-
_name = {"
|
|
453
|
+
_name = {"detail"}
|
|
413
454
|
|
|
414
455
|
class Meta:
|
|
415
456
|
table_description = "Currency accounts"
|
|
416
|
-
unique_together = (("
|
|
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
|
|
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
|
-
|
|
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[
|
|
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", "
|
|
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[
|
|
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):
|
xync_schema/types.py
ADDED
|
@@ -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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: xync-schema
|
|
3
|
-
Version: 0.6.
|
|
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:
|
|
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
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
xync_schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
xync_schema/enums.py,sha256=yNXG1ZMWKSrjS7kFMVUHpbruws5c_xO_UxswmQJPNOE,12547
|
|
3
|
+
xync_schema/models.py,sha256=eTntoo8t94H0OZyhaGczy2SffnUwdmqHtemrMv1M0_4,26870
|
|
4
|
+
xync_schema/types.py,sha256=jubMlsGkaLpv1QZrInP0sEKW8SgWa6TyHENDz8OEvDM,1737
|
|
5
|
+
xync_schema-0.6.73.dist-info/METADATA,sha256=Z2SYahYfz6A1BM48-lqNc3lmVVFlvG8p-qKy1HvlpE0,4055
|
|
6
|
+
xync_schema-0.6.73.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
7
|
+
xync_schema-0.6.73.dist-info/top_level.txt,sha256=jN8IBDfVY8b85Byyk8v0Gyj_0yLB8FO56WV4EvcXWY4,12
|
|
8
|
+
xync_schema-0.6.73.dist-info/RECORD,,
|
xync_schema/pydantic.py
DELETED
|
@@ -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
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
xync_schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
xync_schema/enums.py,sha256=zPdnf6J--qaBoyin_qXO3z_UnfpiHGXVHKs9v3ug1Qk,12428
|
|
3
|
-
xync_schema/models.py,sha256=w3TOlAK9ESN0tOMb7Zbb6XK1PpsxT2j5Ck0qAY-ig3s,25512
|
|
4
|
-
xync_schema/pydantic.py,sha256=2Gupluj7SfQs276mWH1SDzkxyOcst3naxlB4sULeU7U,4046
|
|
5
|
-
xync_schema-0.6.71.dist-info/METADATA,sha256=xM-nC9Wbz15BWmejIJqIDrSQFLVNYwzNjAQlXBAiXhQ,3985
|
|
6
|
-
xync_schema-0.6.71.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
7
|
-
xync_schema-0.6.71.dist-info/top_level.txt,sha256=jN8IBDfVY8b85Byyk8v0Gyj_0yLB8FO56WV4EvcXWY4,12
|
|
8
|
-
xync_schema-0.6.71.dist-info/RECORD,,
|
|
File without changes
|