xync-schema 0.6.72__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.
- {xync_schema-0.6.72/xync_schema.egg-info → xync_schema-0.6.73}/PKG-INFO +5 -3
- {xync_schema-0.6.72 → xync_schema-0.6.73}/pyproject.toml +2 -1
- {xync_schema-0.6.72 → xync_schema-0.6.73}/tests/test_db.py +3 -3
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema/enums.py +34 -17
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema/models.py +173 -121
- xync_schema-0.6.73/xync_schema/types.py +85 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73/xync_schema.egg-info}/PKG-INFO +5 -3
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema.egg-info/SOURCES.txt +1 -1
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema.egg-info/requires.txt +3 -1
- xync_schema-0.6.72/xync_schema/pydantic.py +0 -159
- {xync_schema-0.6.72 → xync_schema-0.6.73}/.env.sample +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/.gitignore +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/.pre-commit-config.yaml +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/README.md +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/makefile +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/setup.cfg +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/tests/__init__.py +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema/__init__.py +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema.egg-info/dependency_links.txt +0 -0
- {xync_schema-0.6.72 → xync_schema-0.6.73}/xync_schema.egg-info/top_level.txt +0 -0
|
@@ -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
|
|
|
@@ -9,11 +9,12 @@ readme = "README.md"
|
|
|
9
9
|
license = {text = "EULA"}
|
|
10
10
|
dynamic = ["version"]
|
|
11
11
|
|
|
12
|
-
dependencies = ["
|
|
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
|
|
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
|
|
29
|
-
assert isinstance(c,
|
|
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
|
-
|
|
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,6 +126,9 @@ class ExAction(IntEnum):
|
|
|
112
126
|
coins = 22 # Список торгуемых монет (с ограничениям по валютам, если есть)
|
|
113
127
|
pairs = 23 # Список пар валюта/монет
|
|
114
128
|
ads = 24 # Список объяв по покупке/продаже, валюте, монете, платежному методу (buy/sell, cur, coin, pm)
|
|
129
|
+
set_coins = 44 # обновление монет биржи в бд
|
|
130
|
+
set_pmcurs = 45 # обновление валют и платежек биржи в бд
|
|
131
|
+
set_pairs = 46 # обновление пар биржи в бд
|
|
115
132
|
ad = 42 # Чужая объява по id
|
|
116
133
|
""" Agent: Fiat """
|
|
117
134
|
my_fiats = 25 # Список реквизитов моих платежных методов
|
|
@@ -147,7 +164,7 @@ class ExAction(IntEnum):
|
|
|
147
164
|
exs = {
|
|
148
165
|
"Beribit": (
|
|
149
166
|
ExType.p2p,
|
|
150
|
-
"
|
|
167
|
+
"AgACAgIAAxkBAAIEY2ferEZ38wZbpG9kmfFPjsSGC3CmAAIo8DEbF_j4StC_ac-XA5fbAQADAgADeAADNgQ",
|
|
151
168
|
"beribit.app",
|
|
152
169
|
"beribit.app",
|
|
153
170
|
"beribit.app/login",
|
|
@@ -155,7 +172,7 @@ exs = {
|
|
|
155
172
|
),
|
|
156
173
|
"Binance": (
|
|
157
174
|
ExType.main,
|
|
158
|
-
"
|
|
175
|
+
"AgACAgIAAxkBAAIEYGfeq1hpcgu2el0ROqFvWtWNHrtWAAIQ8DEbF_j4Sq7oecXCtoONAQADAgADbQADNgQ",
|
|
159
176
|
"binance.com",
|
|
160
177
|
"p2p.binance.com",
|
|
161
178
|
"accounts.binance.com/login",
|
|
@@ -163,7 +180,7 @@ exs = {
|
|
|
163
180
|
),
|
|
164
181
|
"BingX": (
|
|
165
182
|
ExType.p2p,
|
|
166
|
-
"
|
|
183
|
+
"AgACAgIAAxkBAAIEZWferWiY5ZCV2SAWgSnUan76cl-TAAIy8DEbF_j4Sq1aMXmyATzQAQADAgADbQADNgQ",
|
|
167
184
|
"bingx.com",
|
|
168
185
|
"api-app.we-api.com",
|
|
169
186
|
"bingx.com/login",
|
|
@@ -173,7 +190,7 @@ exs = {
|
|
|
173
190
|
"BitcoinGlobal": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
174
191
|
"BitGet": (
|
|
175
192
|
ExType.p2p,
|
|
176
|
-
"
|
|
193
|
+
"AgACAgIAAxkBAAIEZ2ferYwPfGrx1PX-C7SBToZG-h-iAAI08DEbF_j4StxKwJlnBT3XAQADAgADbQADNgQ",
|
|
177
194
|
"www.bitget.com",
|
|
178
195
|
"www.bitget.com",
|
|
179
196
|
"www.bitget.com/login",
|
|
@@ -181,7 +198,7 @@ exs = {
|
|
|
181
198
|
),
|
|
182
199
|
"BitPapa": (
|
|
183
200
|
ExType.p2p,
|
|
184
|
-
"
|
|
201
|
+
"AgACAgIAAxkBAAIEaWferbY69OMAASKXObrcYYLciuWVswACPPAxGxf4-EqNHJqqRTQmMgEAAwIAA3kAAzYE",
|
|
185
202
|
"bitpapa.com",
|
|
186
203
|
"bitpapa.com",
|
|
187
204
|
"bitpapa.com/log-in",
|
|
@@ -190,7 +207,7 @@ exs = {
|
|
|
190
207
|
"Bitvalve ": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
191
208
|
"Bybit": (
|
|
192
209
|
ExType.main,
|
|
193
|
-
"
|
|
210
|
+
"AgACAgIAAxkBAAIENGfeY4AfRquwTL2LpDrzqvFMVNt_AAIG9DEbXX3wSq3oI7t_PqQGAQADAgADbQADNgQ",
|
|
194
211
|
"bybit.com",
|
|
195
212
|
"api2.bybit.com",
|
|
196
213
|
"bybit.com/login",
|
|
@@ -201,7 +218,7 @@ exs = {
|
|
|
201
218
|
"Garantex": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
202
219
|
"Gate": (
|
|
203
220
|
ExType.p2p,
|
|
204
|
-
"
|
|
221
|
+
"AgACAgIAAxkBAAIEMmfeY2WPV9axwELiZp9JsG1qVVSDAAIF9DEbXX3wSmqKNrQMcr0GAQADAgADbQADNgQ",
|
|
205
222
|
"gate.io",
|
|
206
223
|
"gate.io",
|
|
207
224
|
"www.gate.io/login",
|
|
@@ -210,7 +227,7 @@ exs = {
|
|
|
210
227
|
"HodlHodl": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
211
228
|
"Htx": (
|
|
212
229
|
ExType.main,
|
|
213
|
-
"
|
|
230
|
+
"CAACAgIAAxkBAAIEQWfeZKFue_EuEx4aCWQuUUiBUFUWAAJcbQACXX3wSgpUwu_LgrVCNgQ",
|
|
214
231
|
"www.htx.com",
|
|
215
232
|
"www.htx.com",
|
|
216
233
|
"htx.com/login",
|
|
@@ -219,7 +236,7 @@ exs = {
|
|
|
219
236
|
"Koshelek": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
220
237
|
"KuCoin": (
|
|
221
238
|
ExType.main,
|
|
222
|
-
"
|
|
239
|
+
"AgACAgIAAxkBAAIELWfeYuCy-IaY2x4WDEFV30eDAlrLAAIC9DEbXX3wSskAAdr5c_L0LQEAAwIAA20AAzYE",
|
|
223
240
|
"kucoin.com",
|
|
224
241
|
"kucoin.com",
|
|
225
242
|
"www.kucoin.com/ucenter/signin",
|
|
@@ -229,7 +246,7 @@ exs = {
|
|
|
229
246
|
"LocalMonero": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
230
247
|
"Mexc": (
|
|
231
248
|
ExType.main,
|
|
232
|
-
"
|
|
249
|
+
"AgACAgIAAxkBAAIEJ2feYl-98-SXYJQAARlswmCK7ihM-gAD9DEbXX3wSheqy--NeUvRAQADAgADbQADNgQ",
|
|
233
250
|
"www.mexc.com",
|
|
234
251
|
"www.mexc.com",
|
|
235
252
|
"www.mexc.com/login",
|
|
@@ -238,7 +255,7 @@ exs = {
|
|
|
238
255
|
"Noones ": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
239
256
|
"Okx": (
|
|
240
257
|
ExType.main,
|
|
241
|
-
"
|
|
258
|
+
"AgACAgIAAxkBAAIEJWfeYkG29cU8Nt1oaiskDutGInGvAAL_8zEbXX3wSrPVVMfw6kI5AQADAgADeQADNgQ",
|
|
242
259
|
"www.okx.cab",
|
|
243
260
|
"www.okx.cab",
|
|
244
261
|
"www.okx.cab/account/login",
|
|
@@ -253,7 +270,7 @@ exs = {
|
|
|
253
270
|
"RoboSats": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
254
271
|
"Sigen": (
|
|
255
272
|
ExType.p2p,
|
|
256
|
-
"
|
|
273
|
+
"AgACAgIAAxkBAAIEIWfeYbAYWyMCtPtZ6q233_7VoQ87AAL-8zEbXX3wSqgLi3m0_G7AAQADAgADbQADNgQ",
|
|
257
274
|
"sigen.pro",
|
|
258
275
|
"sigen.pro",
|
|
259
276
|
"sigen.pro/p2p",
|
|
@@ -264,7 +281,7 @@ exs = {
|
|
|
264
281
|
"Solid": (ExType.main, "", "", "", "", ExStatus.plan),
|
|
265
282
|
"TgWallet": (
|
|
266
283
|
ExType.tg,
|
|
267
|
-
"
|
|
284
|
+
"AgACAgIAAxkBAAIEEGfd3oDil7jFpVEZh_ek2RlmDSrpAALA6jEb7cjwSo3tCIf7UsVoAQADAgADbQADNgQ",
|
|
268
285
|
"walletbot.me",
|
|
269
286
|
"p2p.walletbot.me",
|
|
270
287
|
"walletbot.me",
|
|
@@ -274,7 +291,7 @@ exs = {
|
|
|
274
291
|
"WazirX": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
275
292
|
"WebMoney": (
|
|
276
293
|
ExType.p2p,
|
|
277
|
-
"
|
|
294
|
+
"AgACAgIAAxkBAAIEb2ferkkq2wWB-aJwIY6I2VZxSK4CAAJM8DEbF_j4SlHZDVKCzkUxAQADAgADeQADNgQ",
|
|
278
295
|
"exchanger.money",
|
|
279
296
|
"exchanger.money",
|
|
280
297
|
"exchanger.money",
|
|
@@ -283,7 +300,7 @@ exs = {
|
|
|
283
300
|
"WhiteBIT": (ExType.p2p, "", "", "", "", ExStatus.plan),
|
|
284
301
|
"xRocket": (
|
|
285
302
|
ExType.p2p,
|
|
286
|
-
"
|
|
303
|
+
"AgACAgIAAxkBAAIEHWfeXy5a7fM9D5ys8ReQrDIRpwAB0wAC8_MxG1198Eo01GgWSVjQ3wEAAwIAA3gAAzYE",
|
|
287
304
|
"",
|
|
288
305
|
"",
|
|
289
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.
|
|
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
|
-
|
|
194
|
+
creds: fields.BackwardFKRelation["Cred"]
|
|
195
|
+
actors: fields.BackwardFKRelation["Actor"]
|
|
162
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,66 +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()
|
|
219
|
+
|
|
220
|
+
class PydanticMeta(Model.PydanticMeta):
|
|
221
|
+
max_recursion = 0
|
|
222
|
+
include = "role", "status"
|
|
223
|
+
# computed = ["balance"]
|
|
184
224
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
225
|
+
|
|
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")
|
|
189
232
|
|
|
190
233
|
|
|
191
|
-
class
|
|
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"]
|
|
199
|
-
|
|
200
|
-
my_ads: fields.BackwardFKRelation["Ad"]
|
|
243
|
+
ads: fields.BackwardFKRelation["Ad"]
|
|
201
244
|
taken_orders: fields.BackwardFKRelation["Order"]
|
|
202
245
|
|
|
203
246
|
class Meta:
|
|
204
|
-
table_description = "
|
|
205
|
-
unique_together = (("ex", "exid"),)
|
|
247
|
+
table_description = "Actors"
|
|
248
|
+
unique_together = (("ex", "exid"), ("ex", "person"))
|
|
206
249
|
|
|
207
250
|
|
|
208
251
|
class Agent(Model, TsTrait):
|
|
209
|
-
auth: dict[str, str] = fields.JSONField(
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="agents")
|
|
213
|
-
user_id: int
|
|
214
|
-
assets: fields.ReverseRelation["Asset"]
|
|
252
|
+
auth: dict[str, str] = fields.JSONField(default={})
|
|
253
|
+
actor: fields.OneToOneRelation[Actor] = fields.OneToOneField("models.Actor", "agent")
|
|
254
|
+
actor_id: int
|
|
215
255
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def balance(self) -> int:
|
|
219
|
-
return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
|
|
256
|
+
assets: fields.ReverseRelation["Asset"]
|
|
220
257
|
|
|
221
|
-
|
|
222
|
-
table_description = "Agents"
|
|
223
|
-
unique_together = (("contragent", "user"),)
|
|
258
|
+
_name = {"actor__name"}
|
|
224
259
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
include = "id", "contragent__ex", "assets", "auth", "updated_at"
|
|
228
|
-
computed = ["balance"]
|
|
260
|
+
# def balance(self) -> int:
|
|
261
|
+
# return sum(asset.free * (asset.coin.rate or 0) for asset in self.assets)
|
|
229
262
|
|
|
230
263
|
def client(self):
|
|
231
|
-
module_name = f"xync_client.{self.
|
|
264
|
+
module_name = f"xync_client.{self.actor.ex.name}.agent"
|
|
232
265
|
__import__(module_name)
|
|
233
266
|
client = sys.modules[module_name].AgentClient
|
|
234
267
|
return client(self)
|
|
@@ -242,20 +275,25 @@ class Agent(Model, TsTrait):
|
|
|
242
275
|
# return client(self)
|
|
243
276
|
|
|
244
277
|
def asset_client(self):
|
|
245
|
-
module_name = f"xync_client.{self.
|
|
278
|
+
module_name = f"xync_client.{self.actor.ex.name}.asset"
|
|
246
279
|
__import__(module_name)
|
|
247
280
|
client = sys.modules[module_name].AssetClient
|
|
248
281
|
return client(self)
|
|
249
282
|
|
|
283
|
+
# class PydanticMeta(Model.PydanticMeta):
|
|
284
|
+
# max_recursion = 3
|
|
285
|
+
# include = "id", "actor__ex", "auth", "updated_at"
|
|
286
|
+
# computed = ["balance"]
|
|
250
287
|
|
|
251
|
-
class Adpm(Model):
|
|
252
|
-
ad: fields.ForeignKeyRelation["Ad"] = fields.ForeignKeyField("models.Ad")
|
|
253
|
-
pm: fields.ForeignKeyRelation["Pm"] = fields.ForeignKeyField("models.Pm")
|
|
254
|
-
|
|
255
|
-
_name = {"ad__id", "pm__name"}
|
|
256
288
|
|
|
257
|
-
|
|
258
|
-
|
|
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"
|
|
259
297
|
|
|
260
298
|
|
|
261
299
|
# class AdCred(Model):
|
|
@@ -269,16 +307,16 @@ class Adpm(Model):
|
|
|
269
307
|
|
|
270
308
|
|
|
271
309
|
class Ad(Model, TsTrait):
|
|
272
|
-
|
|
310
|
+
exid: int = fields.BigIntField()
|
|
273
311
|
direction: fields.ForeignKeyRelation[Direction] = fields.ForeignKeyField("models.Direction", related_name="ads")
|
|
274
312
|
price: float = fields.FloatField()
|
|
275
|
-
max_fiat: float = fields.FloatField()
|
|
276
313
|
min_fiat: float = fields.FloatField()
|
|
314
|
+
max_fiat: float = fields.FloatField()
|
|
277
315
|
detail: str | None = fields.CharField(4095, null=True)
|
|
278
316
|
auto_msg: str | None = fields.CharField(255, null=True)
|
|
279
|
-
status: AdStatus = fields.IntEnumField(AdStatus,
|
|
317
|
+
status: AdStatus = fields.IntEnumField(AdStatus, default=AdStatus.active)
|
|
280
318
|
|
|
281
|
-
maker: fields.ForeignKeyRelation[
|
|
319
|
+
maker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "my_ads")
|
|
282
320
|
maker_id: int
|
|
283
321
|
|
|
284
322
|
pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="adpm") # only root pms
|
|
@@ -286,7 +324,7 @@ class Ad(Model, TsTrait):
|
|
|
286
324
|
orders: fields.ReverseRelation["Order"]
|
|
287
325
|
|
|
288
326
|
_icon = "ad"
|
|
289
|
-
_name = {"
|
|
327
|
+
_name = {"direction__pairex__coin__ticker", "direction__pairex__cur__ticker", "direction__sell", "price"}
|
|
290
328
|
|
|
291
329
|
class Meta:
|
|
292
330
|
table_description = "P2P Advertisements"
|
|
@@ -305,11 +343,17 @@ class Ad(Model, TsTrait):
|
|
|
305
343
|
|
|
306
344
|
|
|
307
345
|
class Pm(Model):
|
|
308
|
-
name: str = fields.CharField(63
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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)
|
|
313
357
|
|
|
314
358
|
ads: fields.ManyToManyRelation[Ad]
|
|
315
359
|
curs: fields.ManyToManyRelation[Cur]
|
|
@@ -320,6 +364,7 @@ class Pm(Model):
|
|
|
320
364
|
|
|
321
365
|
class Meta:
|
|
322
366
|
table_description = "Payment methods"
|
|
367
|
+
unique_together = (("norm", "country_id"), ("alias", "country_id"))
|
|
323
368
|
|
|
324
369
|
# class PydanticMeta(Model.PydanticMeta):
|
|
325
370
|
# max_recursion = 3
|
|
@@ -351,17 +396,21 @@ class Pmcur(Model): # for fiat with no exs tie
|
|
|
351
396
|
|
|
352
397
|
|
|
353
398
|
class Pmex(BaseModel): # existence pm in ex with no cur tie
|
|
354
|
-
pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
|
|
355
|
-
pm_id: int
|
|
356
399
|
ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", "pmexs")
|
|
357
400
|
ex_id: int
|
|
401
|
+
pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
|
|
402
|
+
pm_id: int
|
|
358
403
|
exid: str = fields.CharField(63)
|
|
359
404
|
name: str = fields.CharField(63)
|
|
405
|
+
name_: str = fields.CharField(63, null=True)
|
|
360
406
|
|
|
361
407
|
banks: fields.BackwardFKRelation["PmexBank"]
|
|
362
408
|
|
|
363
409
|
class Meta:
|
|
364
|
-
unique_together = (
|
|
410
|
+
unique_together = (
|
|
411
|
+
("ex", "exid"),
|
|
412
|
+
("ex", "name_"),
|
|
413
|
+
) # , ("ex", "pm"), ("ex", "name") # todo: tmp removed for HTX duplicates
|
|
365
414
|
|
|
366
415
|
|
|
367
416
|
class PmexBank(BaseModel): # banks for SBP
|
|
@@ -370,18 +419,10 @@ class PmexBank(BaseModel): # banks for SBP
|
|
|
370
419
|
exid: str = fields.CharField(63)
|
|
371
420
|
name: str = fields.CharField(63)
|
|
372
421
|
|
|
373
|
-
|
|
374
|
-
unique_together = (("pmex", "exid"),)
|
|
375
|
-
|
|
376
|
-
|
|
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
|
|
422
|
+
creds: fields.ManyToManyRelation["Cred"]
|
|
382
423
|
|
|
383
424
|
class Meta:
|
|
384
|
-
unique_together = (("
|
|
425
|
+
unique_together = (("pmex", "exid"),)
|
|
385
426
|
|
|
386
427
|
|
|
387
428
|
# class Pmcurex(BaseModel): # existence pm in ex for exact cur, with "blocked" flag
|
|
@@ -396,34 +437,45 @@ class CredBank(BaseModel): # banks for SBP
|
|
|
396
437
|
|
|
397
438
|
|
|
398
439
|
class Cred(Model):
|
|
399
|
-
exid: int = fields.BigIntField()
|
|
400
440
|
pmcur: fields.ForeignKeyRelation[Pmcur] = fields.ForeignKeyField("models.Pmcur")
|
|
401
441
|
pmcur_id: int
|
|
402
|
-
# country: fields.ForeignKeyRelation[Country] = fields.ForeignKeyField("models.Country", related_name="fiats")
|
|
403
|
-
# country_id: int
|
|
404
442
|
detail: str = fields.CharField(127)
|
|
405
443
|
name: str | None = fields.CharField(127, null=True)
|
|
406
|
-
|
|
407
|
-
|
|
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")
|
|
408
448
|
|
|
409
449
|
fiat: fields.BackwardOneToOneRelation["Fiat"]
|
|
410
|
-
ads: fields.
|
|
450
|
+
ads: fields.ManyToManyRelation[Ad]
|
|
411
451
|
orders: fields.BackwardFKRelation["Order"]
|
|
412
452
|
|
|
413
|
-
_name = {"
|
|
453
|
+
_name = {"detail"}
|
|
414
454
|
|
|
415
455
|
class Meta:
|
|
416
456
|
table_description = "Currency accounts"
|
|
417
|
-
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"),)
|
|
418
472
|
|
|
419
473
|
|
|
420
474
|
class Fiat(Model):
|
|
421
475
|
cred: fields.OneToOneRelation[Cred] = fields.OneToOneField("models.Cred", "fiat")
|
|
422
476
|
cred_id: int
|
|
423
|
-
# user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", "fiats")
|
|
424
|
-
# user_id: int # cred.contragent.agent.user_id
|
|
425
477
|
amount: float | None = fields.FloatField(default=0)
|
|
426
|
-
target: float
|
|
478
|
+
target: float = fields.FloatField(default=0)
|
|
427
479
|
|
|
428
480
|
class Meta:
|
|
429
481
|
table_description = "Currency balances"
|
|
@@ -485,16 +537,16 @@ class Asset(Model):
|
|
|
485
537
|
|
|
486
538
|
|
|
487
539
|
class Order(Model):
|
|
488
|
-
|
|
540
|
+
exid: int = fields.BigIntField()
|
|
489
541
|
ad: fields.ForeignKeyRelation[Ad] = fields.ForeignKeyField("models.Ad", related_name="ads")
|
|
490
542
|
ad_id: int
|
|
491
543
|
amount: float = fields.FloatField()
|
|
492
544
|
cred: fields.ForeignKeyRelation[Cred] = fields.ForeignKeyField("models.Cred", related_name="orders", null=True)
|
|
493
545
|
cred_id: int | None
|
|
494
|
-
taker: fields.ForeignKeyRelation[
|
|
546
|
+
taker: fields.ForeignKeyRelation[Actor] = fields.ForeignKeyField("models.Actor", "taken_orders")
|
|
495
547
|
taker_id: int
|
|
496
|
-
maker_topic: int = fields.IntField()
|
|
497
|
-
taker_topic: int = fields.IntField()
|
|
548
|
+
maker_topic: int = fields.IntField(null=True) # todo: remove nullability
|
|
549
|
+
taker_topic: int = fields.IntField(null=True)
|
|
498
550
|
status: OrderStatus = fields.IntEnumField(OrderStatus)
|
|
499
551
|
created_at: datetime | None = DatetimeSecField(auto_now_add=True)
|
|
500
552
|
payed_at: datetime | None = DatetimeSecField(null=True)
|
|
@@ -537,7 +589,7 @@ class Msg(Model):
|
|
|
537
589
|
txt: str = fields.CharField(255)
|
|
538
590
|
read: bool = fields.BooleanField(default=False)
|
|
539
591
|
media: str | None = fields.CharField(255, null=True)
|
|
540
|
-
receiver: fields.ForeignKeyRelation[
|
|
592
|
+
receiver: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("models.User", related_name="msgs")
|
|
541
593
|
order: fields.ForeignKeyRelation[Order] = fields.ForeignKeyField("models.Order", related_name="msgs")
|
|
542
594
|
|
|
543
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.
|
|
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
|
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
from pydantic import BaseModel, model_validator
|
|
3
|
-
|
|
4
|
-
from xync_schema.enums import AdStatus, PmType
|
|
5
|
-
from xync_schema.models import Direction, Pmcur, Ex, Cred, Contragent
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class _CurCoin(BaseModel):
|
|
9
|
-
exid: int | str
|
|
10
|
-
ticker: str
|
|
11
|
-
rate: float | None = None
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class CoinEpyd(_CurCoin):
|
|
15
|
-
p2p: bool = True
|
|
16
|
-
minimum: float | None = None
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class CurEpyd(_CurCoin):
|
|
20
|
-
rounding_scale: int | None = None
|
|
21
|
-
minimum: int | None = None
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class PmexBankPyd(BaseModel):
|
|
25
|
-
id: int | None = None
|
|
26
|
-
exid: str
|
|
27
|
-
name: str
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class PmPyd(BaseModel):
|
|
31
|
-
id: int | None = None
|
|
32
|
-
name: str
|
|
33
|
-
identifier: str | None = None
|
|
34
|
-
type_: PmType | None = None
|
|
35
|
-
logo: str | None = None
|
|
36
|
-
banks: list[PmexBankPyd] | None = None
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
# class PmcurPyd(BaseModel):
|
|
40
|
-
# id: int | None = None
|
|
41
|
-
# pm_id: int
|
|
42
|
-
# cur_id: int
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class FiatUpd(BaseModel):
|
|
46
|
-
detail: str | None = None
|
|
47
|
-
name: str | None = None
|
|
48
|
-
amount: float | None = None
|
|
49
|
-
target: int | None = None
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class FiatNew(FiatUpd):
|
|
53
|
-
cur_id: int
|
|
54
|
-
pm_id: int
|
|
55
|
-
detail: str
|
|
56
|
-
amount: float = 0
|
|
57
|
-
target: int | None = None
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class CredPydIn(BaseModel):
|
|
61
|
-
id: int | None = None
|
|
62
|
-
exid: str
|
|
63
|
-
ex: Ex | None = None
|
|
64
|
-
ex_id: int | None = None
|
|
65
|
-
pmcur_id: int | None = None
|
|
66
|
-
pmcur: Pmcur | None = None
|
|
67
|
-
detail: str
|
|
68
|
-
name: str = ""
|
|
69
|
-
|
|
70
|
-
class Config:
|
|
71
|
-
arbitrary_types_allowed = True
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
@model_validator(mode="before")
|
|
75
|
-
def check_at_least_one_field(cls, values):
|
|
76
|
-
if (values.get("ex") or values.get("ex_id")) and (values.get("pmcur") or values.get("pmcur_id")):
|
|
77
|
-
return values
|
|
78
|
-
raise ValueError("ex(_id) and pmcur(_id) is required")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class FiatPydIn(BaseModel):
|
|
82
|
-
# unq
|
|
83
|
-
id: int = None
|
|
84
|
-
cred_id: int | None = None
|
|
85
|
-
cred: Cred | None = None
|
|
86
|
-
# df
|
|
87
|
-
amount: float
|
|
88
|
-
target: float | None = None
|
|
89
|
-
|
|
90
|
-
banks: list[str] = []
|
|
91
|
-
|
|
92
|
-
class Config:
|
|
93
|
-
arbitrary_types_allowed = True
|
|
94
|
-
|
|
95
|
-
@classmethod
|
|
96
|
-
@model_validator(mode="before")
|
|
97
|
-
def check_at_least_one_field(cls, values):
|
|
98
|
-
if values.get("cred") or values.get("cred_id"):
|
|
99
|
-
return values
|
|
100
|
-
raise ValueError("cred(_id) is required")
|
|
101
|
-
|
|
102
|
-
def args(self) -> tuple[dict, dict]:
|
|
103
|
-
unq: tuple[str, ...] = "id", "cred_id", "cred"
|
|
104
|
-
df: tuple[str, ...] = "amount", "target"
|
|
105
|
-
d = self.model_dump()
|
|
106
|
-
return {k: getattr(self, k) for k in df if d.get(k)}, {k: getattr(self, k) for k in unq if d.get(k)}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class BaseAd(BaseModel):
|
|
110
|
-
id: int | None = None
|
|
111
|
-
price: float
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class AdPydIn(BaseAd):
|
|
115
|
-
min_fiat: float
|
|
116
|
-
max_fiat: float | None = None
|
|
117
|
-
detail: str | None = None
|
|
118
|
-
auto_msg: str | None = None
|
|
119
|
-
status: AdStatus = AdStatus.active
|
|
120
|
-
maker_id: int | None = None
|
|
121
|
-
maker: Contragent | None = None
|
|
122
|
-
direction_id: int | None = None
|
|
123
|
-
direction: Direction | None = None
|
|
124
|
-
pms_: list | None = None
|
|
125
|
-
fiats_: list | None = None
|
|
126
|
-
|
|
127
|
-
class Config:
|
|
128
|
-
arbitrary_types_allowed = True
|
|
129
|
-
|
|
130
|
-
@classmethod
|
|
131
|
-
@model_validator(mode="before")
|
|
132
|
-
def check_at_least_one_field(cls, values):
|
|
133
|
-
maker = values.get("maker") or values.get("maker_id")
|
|
134
|
-
direction = values.get("direction") or values.get("direction_id")
|
|
135
|
-
pms_or_fiats = values.get("pms_") or values.get("fiats_")
|
|
136
|
-
if maker and direction and pms_or_fiats:
|
|
137
|
-
return values
|
|
138
|
-
raise ValueError("(pms or fiats) and maker(_id) and direction(_id) is required")
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
class OrderPyd(BaseModel):
|
|
142
|
-
id: int
|
|
143
|
-
amount: float
|
|
144
|
-
status: str
|
|
145
|
-
actions: dict | None = {}
|
|
146
|
-
cred: Cred.pyd()
|
|
147
|
-
is_sell: bool
|
|
148
|
-
contragent: int | None = None
|
|
149
|
-
created_at: datetime
|
|
150
|
-
payed_at: datetime | None = None
|
|
151
|
-
appealed_at: datetime | None = None
|
|
152
|
-
confirmed_at: datetime | None = None
|
|
153
|
-
msgs: int = 0
|
|
154
|
-
topic: int
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
class UreadMsgs(BaseModel):
|
|
158
|
-
order_id: int
|
|
159
|
-
unread_cnt: int
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|