xync-db 0.5.5.dev25__tar.gz → 0.5.5.dev30__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 (40) hide show
  1. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/PKG-INFO +1 -1
  2. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/login_store.py +1 -1
  3. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/a_actor_seed.py +1 -1
  4. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/c_net_seed.py +1 -1
  5. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/models/__init__.py +16 -11
  6. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/.gitignore +0 -0
  7. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/README.md +0 -0
  8. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/pyproject.toml +0 -0
  9. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/__init__.py +0 -0
  10. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/config.py +0 -0
  11. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/enums.py +0 -0
  12. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/exceptions.py +0 -0
  13. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/graph.py +0 -0
  14. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/i18n.py +0 -0
  15. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/logo.png +0 -0
  16. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/CLAUDE.md +0 -0
  17. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/__init__.py +0 -0
  18. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/0001_initial.py +0 -0
  19. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/0002_triggers.py +0 -0
  20. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/0003_seed.py +0 -0
  21. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/__init__.py +0 -0
  22. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/__init__.py +0 -0
  23. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/a_bin_seed.py +0 -0
  24. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/a_country_seed.py +0 -0
  25. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/a_tg_seed.py +0 -0
  26. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/b_htx_seed.py +0 -0
  27. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/countries.json +0 -0
  28. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/ranges.csv +0 -0
  29. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/migrations/models/seed/xync_files.sql +0 -0
  30. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/models/CLAUDE.md +0 -0
  31. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/py.typed +0 -0
  32. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/shared.py +0 -0
  33. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/__init__.py +0 -0
  34. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/__init__.py +0 -0
  35. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/actor.py +0 -0
  36. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/ad.py +0 -0
  37. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/common.py +0 -0
  38. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/cred.py +0 -0
  39. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/order.py +0 -0
  40. {xync_db-0.5.5.dev25 → xync_db-0.5.5.dev30}/src/xync_db/typs/db/pm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: xync-db
3
- Version: 0.5.5.dev25
3
+ Version: 0.5.5.dev30
4
4
  Summary: Xync DB schema: Tortoise ORM models, enums, pydantic DTOs.
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: LicenseRef-EULA
@@ -88,7 +88,7 @@ async def login_fulfil(token: str, payload: dict[str, Any]) -> bool:
88
88
  return True
89
89
 
90
90
 
91
- async def login_take(token: str) -> dict[str, Any] | None | object:
91
+ async def login_take(token: str) -> dict[str, Any] | object | None:
92
92
  """Poll a token. Returns `MISSING` if it never existed / expired, `None` if it exists but
93
93
  Start wasn't tapped yet, or the payload dict once ready (consumed: the token is deleted)."""
94
94
  if _redis is not None:
@@ -266,7 +266,7 @@ async def actor_seed(db: BaseDBAsyncClient) -> str:
266
266
  btc, _ = await Coin.update_or_create(dict(scale=8), id=2, ticker="BTC")
267
267
  eth, _ = await Coin.update_or_create(dict(scale=8), id=3, ticker="ETH")
268
268
  usdc, _ = await Coin.update_or_create(dict(scale=4), id=4, ticker="USDC")
269
- ton, _ = await Coin.update_or_create(dict(scale=4), id=5, ticker="TON")
269
+ gram, _ = await Coin.update_or_create(dict(scale=4), id=5, ticker="GRAM")
270
270
  sol, _ = await Coin.update_or_create(dict(scale=8), id=6, ticker="SOL")
271
271
  bnb, _ = await Coin.update_or_create(dict(scale=8), id=7, ticker="BNB")
272
272
  xrp, _ = await Coin.update_or_create(dict(scale=8), id=8, ticker="XRP")
@@ -7,7 +7,7 @@ from xync_db.models import Coin, Net
7
7
  NETS: list[tuple[int, str, str]] = [
8
8
  (0, "xync", "XYNC"),
9
9
  (1, "eth", "ETH"),
10
- (2, "ton", "TON"),
10
+ (2, "gram", "GRAM"),
11
11
  (3, "trx", "TRX"),
12
12
  (4, "bsc", "BNB"),
13
13
  (5, "arbitrum", "ARB"),
@@ -179,7 +179,7 @@ class Net(Model):
179
179
 
180
180
  class CoinNet(Model):
181
181
  """В каких сетях живёт кастодиальная монета и по какому контракту (web3.md → GET /public/coin-nets).
182
- contract=None → монета нативна для сети (ETH в eth, TON в ton…). decimals — on-chain decimals токена
182
+ contract=None → монета нативна для сети (ETH в eth, GRAM в ton…). decimals — on-chain decimals токена
183
183
  в ЭТОЙ сети (у USDT 6 в trx/eth, 9 в ton), не путать с кастодиальным Coin.scale."""
184
184
 
185
185
  coin: ForeignKeyRelation[Coin] = ForeignKeyField("models.Coin", "coin_nets", on_update=CASCADE)
@@ -490,6 +490,16 @@ class User(TgUser, TsTrait):
490
490
  # self.pm_clients = {pma.pm_id: pma.client() for pma in self.pm_agents}
491
491
  # self.agent_clients = {a.id: a.client() for a in self.person.actor.agents}
492
492
 
493
+ @property
494
+ def handle(self) -> str | None:
495
+ """«@username» из Telegram либо None (ждёт prefetched `username`)."""
496
+ return self.username.username and "@" + self.username.username
497
+
498
+ @property
499
+ def title(self) -> str:
500
+ """Отображаемое имя: first_name → @handle → id:N (ждёт prefetched `username`)."""
501
+ return self.first_name or self.handle or f"id:{self.id}"
502
+
493
503
  @classmethod
494
504
  async def mark_membership(
495
505
  cls, username_id: int, *, in_channel: bool | None = None, in_chat: bool | None = None
@@ -687,13 +697,7 @@ class User(TgUser, TsTrait):
687
697
  )
688
698
  c["amount"] += a["free"] / 10**scale
689
699
  users = await cls.filter(id__in=[uid for uid in ss if uid]).prefetch_related("username")
690
- names = {
691
- u.id: (
692
- u.first_name or (u.username and u.username.username and "@" + u.username.username) or f"id:{u.id}",
693
- u.username and u.username.username and "@" + u.username.username,
694
- )
695
- for u in users
696
- }
700
+ names = {u.id: (u.title, u.handle) for u in users}
697
701
  return cls._assemble_rich(ss, cur_meta, usdt_rate, coins_by_user, names)
698
702
 
699
703
  async def balance(self, cur_id: int, ts: int | None = None) -> int:
@@ -1177,7 +1181,7 @@ class Agent(Model, TsTrait):
1177
1181
  status: AgentStatus = IntEnumField(AgentStatus, db_default=AgentStatus.off)
1178
1182
  same_dir_ad: int = SmallIntField(db_default=0)
1179
1183
  # индивидуальный прокси агента: если задан, ВСЕ сессии его клиентов (Agent/Order/InAgent —
1180
- # aiohttp, pybit/bybit_p2p, приватный WS) ходят на биржу с этого IP, чтобы запросы одного
1184
+ # aiohttp, pybit, приватный WS) ходят на биржу с этого IP, чтобы запросы одного
1181
1185
  # пользователя биржи всегда шли с одного его IP. Пусто → общий прокси-фолбэк (settings.prx).
1182
1186
  proxy: ForeignKeyNullableRelation[Proxy] = ForeignKeyField("models.Proxy", "agents", null=True, on_update=CASCADE)
1183
1187
  proxy_id: str | None
@@ -1250,13 +1254,14 @@ class Agent(Model, TsTrait):
1250
1254
  host: str,
1251
1255
  auth: dict,
1252
1256
  exp: int | None,
1253
- rname: str,
1257
+ rname: str | None,
1254
1258
  nick: str,
1255
1259
  email: str | None = None,
1256
1260
  user: User | None = None,
1257
1261
  ) -> tuple[int, Agent, bool]:
1258
1262
  """Единый писатель агента (за `/public/set-agent` и OAuth «Connect Bybit»). `exp=None` — срок
1259
- web-сессии неизвестен (Htx/Mexc, голые API-ключи из OAuth) → `expire_at` не трогаем.
1263
+ web-сессии неизвестен (Htx/Mexc, голые API-ключи из OAuth) → `expire_at` не трогаем. У OAuth-ключей
1264
+ и имени нет (`rname=None`, `nick=""`) — их дозаполнит `Ex.person_save`/`actor_save` по данным биржи.
1260
1265
 
1261
1266
  `user` — владелец УЖЕ известен (OAuth из приложения залогиненного юзера): актор сразу
1262
1267
  привязывается к нему `Actor.set_user` (тот же мердж персон, что по ответу админа), без
File without changes
File without changes