xync-schema 0.6.73.dev6__tar.gz → 0.6.73.dev8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {xync_schema-0.6.73.dev6/xync_schema.egg-info → xync_schema-0.6.73.dev8}/PKG-INFO +1 -1
  2. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/tests/test_db.py +3 -3
  3. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema/models.py +39 -20
  4. xync_schema-0.6.73.dev8/xync_schema/types.py +133 -0
  5. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8/xync_schema.egg-info}/PKG-INFO +1 -1
  6. xync_schema-0.6.73.dev6/xync_schema/types.py +0 -181
  7. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/.env.sample +0 -0
  8. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/.gitignore +0 -0
  9. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/.pre-commit-config.yaml +0 -0
  10. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/README.md +0 -0
  11. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/makefile +0 -0
  12. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/pyproject.toml +0 -0
  13. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/setup.cfg +0 -0
  14. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/tests/__init__.py +0 -0
  15. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema/__init__.py +0 -0
  16. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema/enums.py +0 -0
  17. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema.egg-info/SOURCES.txt +0 -0
  18. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema.egg-info/dependency_links.txt +0 -0
  19. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema.egg-info/requires.txt +0 -0
  20. {xync_schema-0.6.73.dev6 → xync_schema-0.6.73.dev8}/xync_schema.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-schema
3
- Version: 0.6.73.dev6
3
+ Version: 0.6.73.dev8
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -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"
@@ -8,7 +8,17 @@ from tortoise.signals import pre_save
8
8
  from x_auth.models import Model, UserTg
9
9
  from x_model.models import TsTrait, DatetimeSecField
10
10
 
11
- from xync_schema.enums import ExType, AdStatus, AssetType, OrderStatus, ExAction, ExStatus, PersonStatus, UserStatus
11
+ from xync_schema.enums import (
12
+ ExType,
13
+ AdStatus,
14
+ AssetType,
15
+ OrderStatus,
16
+ ExAction,
17
+ ExStatus,
18
+ PersonStatus,
19
+ UserStatus,
20
+ PmType,
21
+ )
12
22
 
13
23
 
14
24
  class Country(Model):
@@ -24,6 +34,7 @@ class Country(Model):
24
34
  class Cur(Model):
25
35
  id = fields.SmallIntField(True)
26
36
  ticker: str = fields.CharField(3, unique=True)
37
+ scale: int = fields.SmallIntField(default=0)
27
38
  rate: float | None = fields.FloatField(default=0, null=True)
28
39
 
29
40
  pms: fields.ManyToManyRelation["Pm"] = fields.ManyToManyField("models.Pm", through="pmcur")
@@ -40,6 +51,7 @@ class Cur(Model):
40
51
  class Coin(Model):
41
52
  id: int = fields.SmallIntField(True)
42
53
  ticker: str = fields.CharField(15, unique=True)
54
+ scale: int = fields.SmallIntField(default=0)
43
55
  rate: float | None = fields.FloatField(default=0)
44
56
  is_fiat: bool = fields.BooleanField(default=False)
45
57
  exs: fields.ManyToManyRelation["Ex"] = fields.ManyToManyField("models.Ex", through="coinex")
@@ -160,7 +172,7 @@ class Direction(Model):
160
172
 
161
173
  class Person(Model, TsTrait):
162
174
  status: PersonStatus = fields.IntEnumField(PersonStatus, default=PersonStatus.DEFAULT)
163
- name: str | None = fields.CharField(127)
175
+ name: str | None = fields.CharField(127, null=True)
164
176
 
165
177
  user: fields.BackwardOneToOneRelation["User"]
166
178
  creds: fields.BackwardFKRelation["Cred"]
@@ -274,10 +286,10 @@ class Agent(Model, TsTrait):
274
286
  client = sys.modules[module_name].AssetClient
275
287
  return client(self)
276
288
 
277
- class PydanticMeta(Model.PydanticMeta):
278
- # max_recursion = 3
279
- include = "id", "actor__ex", "auth", "updated_at"
280
- # computed = ["balance"]
289
+ # class PydanticMeta(Model.PydanticMeta):
290
+ # max_recursion = 3
291
+ # include = "id", "actor__ex", "auth", "updated_at"
292
+ # computed = ["balance"]
281
293
 
282
294
 
283
295
  # class Adpm(Model):
@@ -304,8 +316,8 @@ class Ad(Model, TsTrait):
304
316
  exid: int = fields.BigIntField()
305
317
  direction: fields.ForeignKeyRelation[Direction] = fields.ForeignKeyField("models.Direction", related_name="ads")
306
318
  price: float = fields.FloatField()
307
- max_fiat: float = fields.FloatField()
308
319
  min_fiat: float = fields.FloatField()
320
+ max_fiat: float = fields.FloatField()
309
321
  detail: str | None = fields.CharField(4095, null=True)
310
322
  auto_msg: str | None = fields.CharField(255, null=True)
311
323
  status: AdStatus = fields.IntEnumField(AdStatus, defaut=AdStatus.active)
@@ -337,15 +349,17 @@ class Ad(Model, TsTrait):
337
349
 
338
350
 
339
351
  class Pm(Model):
340
- name: str = fields.CharField(63, unique=True)
341
- identifier: str | None = fields.CharField(63, unique=True, null=True)
342
- alias: str | None = fields.CharField(63, unique=True, null=True)
343
- country: fields.ForeignKeyRelation[Country] = fields.ForeignKeyField(
344
- "models.Country", related_name="pms", null=True
345
- )
346
- # type_: PmType | None = fields.IntEnumField(PmType, null=True) # todo: get back
347
- type_: int | None = fields.SmallIntField(null=True)
348
- logo: str | None = fields.CharField(127, null=True)
352
+ # name: str = fields.CharField(63) # mv to pmex cause it diffs on each ex
353
+ norm: str | None = fields.CharField(63)
354
+ acronym: str | None = fields.CharField(7, unique=True, null=True)
355
+ country: fields.ForeignKeyRelation[Country] = fields.ForeignKeyField("models.Country", "pms", null=True)
356
+ alias: str | None = fields.CharField(63, null=True)
357
+ extra: str | None = fields.CharField(63, null=True)
358
+ ok: bool = fields.BooleanField(default=True)
359
+ bank: bool = fields.BooleanField(null=True)
360
+
361
+ type_: PmType | None = fields.IntEnumField(PmType, null=True)
362
+ logo: str | None = fields.CharField(119, null=True)
349
363
 
350
364
  ads: fields.ManyToManyRelation[Ad]
351
365
  curs: fields.ManyToManyRelation[Cur]
@@ -356,6 +370,7 @@ class Pm(Model):
356
370
 
357
371
  class Meta:
358
372
  table_description = "Payment methods"
373
+ unique_together = (("norm", "country"), ("alias", "country"))
359
374
 
360
375
  # class PydanticMeta(Model.PydanticMeta):
361
376
  # max_recursion = 3
@@ -387,17 +402,21 @@ class Pmcur(Model): # for fiat with no exs tie
387
402
 
388
403
 
389
404
  class Pmex(BaseModel): # existence pm in ex with no cur tie
390
- pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
391
- pm_id: int
392
405
  ex: fields.ForeignKeyRelation[Ex] = fields.ForeignKeyField("models.Ex", "pmexs")
393
406
  ex_id: int
407
+ pm: fields.ForeignKeyRelation[Pm] = fields.ForeignKeyField("models.Pm", "pmexs")
408
+ pm_id: int
394
409
  exid: str = fields.CharField(63)
395
410
  name: str = fields.CharField(63)
411
+ name_: str = fields.CharField(63, null=True)
396
412
 
397
413
  banks: fields.BackwardFKRelation["PmexBank"]
398
414
 
399
415
  class Meta:
400
- unique_together = (("ex_id", "exid"),)
416
+ unique_together = (
417
+ ("ex", "exid"),
418
+ ("ex", "name_"),
419
+ ) # , ("ex", "pm"), ("ex", "name") # todo: tmp removed for HTX duplicates
401
420
 
402
421
 
403
422
  class PmexBank(BaseModel): # banks for SBP
@@ -462,7 +481,7 @@ class Fiat(Model):
462
481
  cred: fields.OneToOneRelation[Cred] = fields.OneToOneField("models.Cred", "fiat")
463
482
  cred_id: int
464
483
  amount: float | None = fields.FloatField(default=0)
465
- target: float | None = fields.FloatField(default=None, null=True)
484
+ target: float = fields.FloatField(default=0)
466
485
 
467
486
  class Meta:
468
487
  table_description = "Currency balances"
@@ -0,0 +1,133 @@
1
+ from datetime import datetime
2
+ from pydantic import BaseModel
3
+ from x_model.types import New
4
+
5
+ from xync_schema.enums import AdStatus, OrderStatus
6
+ from xync_schema import models
7
+
8
+
9
+ class UnitEx(BaseModel):
10
+ exid: int | str
11
+ ticker: str
12
+ scale: int = None
13
+ rate: float | None = None
14
+
15
+
16
+ class CoinEx(UnitEx):
17
+ p2p: bool = None
18
+ minimum: float | None = None
19
+
20
+
21
+ class CurEx(UnitEx):
22
+ rounding_scale: int | None = None
23
+ minimum: int | None = None
24
+
25
+
26
+ class PmexBank(BaseModel):
27
+ # id: int | None = None
28
+ exid: str
29
+ name: str
30
+
31
+
32
+ # class Pmcur(Struct):
33
+ # id: int | None = None
34
+ # pm_id: int
35
+ # cur_id: int
36
+
37
+
38
+ class CredIn(New):
39
+ exid: int
40
+ pmcur: models.Pmcur
41
+ actor: models.Actor
42
+ detail: str = ""
43
+ name: str = ""
44
+ id: int | None = None
45
+ banks: list[str] | None = None
46
+ _unq = "id", "exid", "ch", "pmcur"
47
+
48
+ class Config:
49
+ arbitrary_types_allowed = True
50
+
51
+
52
+ class FiatIn(New):
53
+ cred: models.Cred
54
+ amount: float
55
+ id: int = None
56
+ target: float | None = None
57
+ _unq = "id", "cred"
58
+
59
+ class Config:
60
+ arbitrary_types_allowed = True
61
+
62
+
63
+ class BaseAd(BaseModel):
64
+ price: float
65
+ id: int | None = None
66
+
67
+
68
+ class BaseAdIn(New):
69
+ exid: int
70
+ min_fiat: float
71
+ max_fiat: float
72
+ direction: models.Direction
73
+ detail: str | None = None
74
+ auto_msg: str | None = None
75
+ status: AdStatus = AdStatus.active
76
+ maker: models.Actor = None
77
+ _unq = "id", "exid", "maker", "direction"
78
+
79
+ class Config:
80
+ arbitrary_types_allowed = True
81
+
82
+
83
+ class AdBuyIn(BaseAdIn):
84
+ pms_: list[models.Pm]
85
+
86
+
87
+ class AdSaleIn(BaseAdIn):
88
+ creds_: list[models.Cred]
89
+
90
+
91
+ class BaseOrder(BaseModel):
92
+ id: int | None = None
93
+
94
+
95
+ class Order(BaseModel):
96
+ id: int
97
+ amount: float
98
+ status: str
99
+ cred: models.Cred.out_type()
100
+ is_sell: bool
101
+ created_at: datetime
102
+ topic: int
103
+ actions: dict | None = {}
104
+ actor: int | None = None
105
+ payed_at: datetime | None = None
106
+ appealed_at: datetime | None = None
107
+ confirmed_at: datetime | None = None
108
+ msgs: int = 0
109
+
110
+
111
+ class OrderIn(BaseModel):
112
+ exid: int
113
+ amount: float
114
+ created_at: datetime
115
+ ad: models.Ad
116
+ cred: models.Cred
117
+ taker: models.Actor
118
+ id: int = None
119
+ maker_topic: int | None = None
120
+ taker_topic: int | None = None
121
+ status: OrderStatus = OrderStatus.created
122
+ payed_at: datetime | None = None
123
+ confirmed_at: datetime | None = None
124
+ appealed_at: datetime | None = None
125
+ _unq = "id", "exid", "amount", "maker_topic", "taker_topic", "ad", "cred", "taker"
126
+
127
+ class Config:
128
+ arbitrary_types_allowed = True
129
+
130
+
131
+ class UreadMsgs(BaseModel):
132
+ order_id: int
133
+ unread_cnt: int
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-schema
3
- Version: 0.6.73.dev6
3
+ Version: 0.6.73.dev8
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -1,181 +0,0 @@
1
- from datetime import datetime
2
-
3
- from pydantic import BaseModel
4
-
5
- from xync_schema.enums import AdStatus, OrderStatus, PmType
6
- from xync_schema import models
7
-
8
-
9
- class _CurCoin(BaseModel):
10
- exid: int | str
11
- ticker: str
12
- rate: float | None = None
13
-
14
-
15
- class CoinE(_CurCoin):
16
- p2p: bool = True
17
- minimum: float | None = None
18
-
19
-
20
- class CurE(_CurCoin):
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 Pm(BaseModel):
32
- id: int = None
33
- name: str
34
- identifier: str | None = None
35
- type_: PmType | None = None
36
- logo: str | None = None
37
- banks: list[PmexBank] | None = None
38
-
39
-
40
- # class Pmcur(BaseModel):
41
- # id: int | None = None
42
- # pm_id: int
43
- # cur_id: int
44
-
45
-
46
- class FFiat(BaseModel):
47
- detail: str
48
- name: str | None = None
49
- amount: float = 0
50
- target: int | None = None
51
- banks: list[str] = []
52
-
53
-
54
- class FiatNew(FFiat):
55
- cur_id: int
56
- pm_id: int
57
-
58
-
59
- class FiatUpd(FFiat):
60
- id: int
61
- exid: int
62
-
63
-
64
- class CredIn(BaseModel):
65
- id: int | None = None
66
- exid: int
67
- pmcur: models.Pmcur
68
- actor: models.Actor
69
- detail: str = ""
70
- name: str = ""
71
- banks: list[str] | None = None
72
-
73
- class Config:
74
- arbitrary_types_allowed = True
75
-
76
- def args(self) -> tuple[dict, dict]:
77
- unq: tuple[str, ...] = "id", "exid", "ch", "pmcur"
78
- df: tuple[str, ...] = "detail", "name"
79
- d = self.model_dump()
80
- 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)}
81
-
82
-
83
- class FiatIn(BaseModel):
84
- # unq
85
- id: int = None
86
- cred: models.Cred
87
- # df
88
- amount: float
89
- target: float | None = None
90
-
91
- class Config:
92
- arbitrary_types_allowed = True
93
-
94
- def args(self) -> tuple[dict, dict]:
95
- unq: tuple[str, ...] = "id", "cred"
96
- df: tuple[str, ...] = "amount", "target"
97
- d = self.model_dump()
98
- 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)}
99
-
100
-
101
- class BaseAd(BaseModel):
102
- id: int | None = None
103
- price: float
104
-
105
-
106
- class BaseAdIn(BaseAd):
107
- exid: int
108
- min_fiat: float
109
- max_fiat: float | None = None
110
- detail: str | None = None
111
- auto_msg: str | None = None
112
- status: AdStatus = AdStatus.active
113
- maker: models.Actor = None
114
- direction: models.Direction
115
-
116
- class Config:
117
- arbitrary_types_allowed = True
118
-
119
- def args(self) -> tuple[dict, dict]:
120
- unq: tuple[str, ...] = "id", "exid", "maker", "direction"
121
- df: tuple[str, ...] = "price", "price", "min_fiat", "max_fiat", "detail", "auto_msg", "status"
122
- d = self.model_dump(exclude_none=True)
123
- 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)}
124
-
125
-
126
- class AdBuyIn(BaseAdIn):
127
- pms_: list[Pm]
128
-
129
-
130
- class AdSaleIn(BaseAdIn):
131
- creds_: list[models.Cred]
132
-
133
-
134
- class BaseOrder(BaseModel):
135
- id: int | None = None
136
-
137
-
138
- class Order(BaseModel):
139
- id: int
140
- amount: float
141
- status: str
142
- actions: dict | None = {}
143
- cred: models.Cred.pyd()
144
- is_sell: bool
145
- actor: int | None = None
146
- created_at: datetime
147
- payed_at: datetime | None = None
148
- appealed_at: datetime | None = None
149
- confirmed_at: datetime | None = None
150
- msgs: int = 0
151
- topic: int
152
-
153
-
154
- class OrderIn(BaseModel):
155
- id: int = None
156
- exid: int
157
- amount: float
158
- maker_topic: int | None = None
159
- taker_topic: int | None = None
160
- status: OrderStatus = OrderStatus.created
161
- created_at: datetime
162
- payed_at: datetime | None = None
163
- confirmed_at: datetime | None = None
164
- appealed_at: datetime | None = None
165
- ad: models.Ad
166
- cred: models.Cred
167
- taker: models.Actor
168
-
169
- class Config:
170
- arbitrary_types_allowed = True
171
-
172
- def args(self) -> tuple[dict, dict]:
173
- unq: tuple[str, ...] = "id", "exid", "amount", "maker_topic", "taker_topic", "ad", "cred", "taker"
174
- df: tuple[str, ...] = "status", "created_at", "payed_at", "confirmed_at", "appealed_at"
175
- d = self.model_dump(exclude_none=True)
176
- 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)}
177
-
178
-
179
- class UreadMsgs(BaseModel):
180
- order_id: int
181
- unread_cnt: int