xync-db 0.5.5.dev21__tar.gz → 0.5.5.dev23__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.dev21 → xync_db-0.5.5.dev23}/PKG-INFO +1 -1
  2. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/0001_initial.py +1 -0
  3. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/models/__init__.py +27 -2
  4. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/__init__.py +3 -0
  5. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/.gitignore +0 -0
  6. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/README.md +0 -0
  7. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/pyproject.toml +0 -0
  8. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/__init__.py +0 -0
  9. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/config.py +0 -0
  10. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/enums.py +0 -0
  11. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/exceptions.py +0 -0
  12. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/graph.py +0 -0
  13. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/i18n.py +0 -0
  14. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/login_store.py +0 -0
  15. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/logo.png +0 -0
  16. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/CLAUDE.md +0 -0
  17. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/__init__.py +0 -0
  18. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/0002_triggers.py +0 -0
  19. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/0003_seed.py +0 -0
  20. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/__init__.py +0 -0
  21. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/__init__.py +0 -0
  22. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/a_actor_seed.py +0 -0
  23. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/a_bin_seed.py +0 -0
  24. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/a_country_seed.py +0 -0
  25. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/a_tg_seed.py +0 -0
  26. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/b_htx_seed.py +0 -0
  27. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/c_net_seed.py +0 -0
  28. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/countries.json +0 -0
  29. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/ranges.csv +0 -0
  30. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/migrations/models/seed/xync_files.sql +0 -0
  31. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/models/CLAUDE.md +0 -0
  32. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/py.typed +0 -0
  33. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/shared.py +0 -0
  34. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/__init__.py +0 -0
  35. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/actor.py +0 -0
  36. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/ad.py +0 -0
  37. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/common.py +0 -0
  38. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/cred.py +0 -0
  39. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/src/xync_db/typs/db/order.py +0 -0
  40. {xync_db-0.5.5.dev21 → xync_db-0.5.5.dev23}/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.dev21
3
+ Version: 0.5.5.dev23
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
@@ -1069,6 +1069,7 @@ class Migration(migrations.Migration):
1069
1069
  ("tz", fields.SmallIntField(db_default=3)),
1070
1070
  ("prv", UniqBinaryField(null=True, unique=True)),
1071
1071
  ("pub", UniqBinaryField(null=True, unique=True)),
1072
+ ("review_anon", fields.BooleanField(db_default=True)),
1072
1073
  ],
1073
1074
  options={"table": "user", "app": "models", "pk_attr": "id"},
1074
1075
  bases=["User", "TsTrait"],
@@ -107,6 +107,11 @@ from xync_db.typs import HotAd, HotAds, OrderResult
107
107
  # место смены — на случай добавления других share-бирж.
108
108
  SHARE_HEX_EX_IDS = [4]
109
109
 
110
+ # ex_id бирж, где по ПРОДАЖНОЙ hot-объяве монету отпускаем сразу по факту внутренней транзакции оплаты
111
+ # (XyncPay-перевод прошёл), НЕ дожидаясь, пока покупатель отметит оплату на бирже (status→paid).
112
+ # На остальных биржах действует общее правило: релиз только после paid (см. Order.hot_process).
113
+ INSTANT_RELEASE_EX_IDS = [4] # Bybit
114
+
110
115
 
111
116
  class Country(BaseCountry):
112
117
  ccn3: int | None = UInt2Field(null=True) # числовой ISO 3166-1 (базовый `code` — телефонный)
@@ -453,6 +458,9 @@ class User(TgUser, TsTrait):
453
458
  # (api get_chat_member) и live — ботом-админом через chat_member-апдейты. None = не состоит / неизвестно.
454
459
  in_channel_at: datetime | None = DatetimeSecField(null=True)
455
460
  in_chat_at: datetime | None = DatetimeSecField(null=True)
461
+ # взаимный отзыв, который наш мейкер зеркалит контрагенту по hot-ордеру этого юзера, оставлять
462
+ # анонимно (чекбокс под списком hot-объяв в боте и вебе; по умолчанию включён)
463
+ review_anon: bool = BooleanField(db_default=True)
456
464
 
457
465
  # actors: BackwardFKRelation[Actor]
458
466
  # borrows: BackwardFKRelation[Credit]
@@ -498,6 +506,15 @@ class User(TgUser, TsTrait):
498
506
  if fields:
499
507
  await cls.filter(username_id=username_id).update(**fields)
500
508
 
509
+ async def set_review_anon(self, anon: bool) -> bool:
510
+ """ЕДИНСТВЕННЫЙ writer User.review_anon (чекбокс «Взаимный отзыв анонимно» под списком
511
+ hot-объяв): пишут и веб (HotCtr.review_anon), и бот (routers.hot.filter_toggle, dim="r").
512
+ Возвращает записанное значение."""
513
+ if self.review_anon != anon:
514
+ self.review_anon = anon
515
+ await self.save(update_fields=["review_anon"])
516
+ return self.review_anon
517
+
501
518
  async def free_assets(self):
502
519
  assets = await Asset.filter(addr__actor__person__user__id=self.id).values("free", "addr__coin__rate")
503
520
  return sum(asset["free"] * asset["addr__coin__rate"] for asset in assets)
@@ -1020,7 +1037,13 @@ class User(TgUser, TsTrait):
1020
1037
  shared_at=sell_ad.shared_at,
1021
1038
  )
1022
1039
  )
1023
- return HotAds(sells=take_sales, buys=take_buys, balance=balances, coin_balance=coin_balances)
1040
+ return HotAds(
1041
+ sells=take_sales,
1042
+ buys=take_buys,
1043
+ balance=balances,
1044
+ coin_balance=coin_balances,
1045
+ review_anon=self.review_anon,
1046
+ )
1024
1047
 
1025
1048
  async def get_last_hot(self, force_create: bool = False) -> Hot:
1026
1049
  if not force_create and (
@@ -2404,7 +2427,9 @@ class Order(Model, TsTrait):
2404
2427
  # продажная объява: монету отпускаем только ПОСЛЕ того, как покупатель отметит оплату на # noqa: RUF003
2405
2428
  # бирже (status→paid). Пока ордер created — не рассчитываемся (XyncPay) и не релизим, чтобы
2406
2429
  # не отдать монету за неоплаченный ордер; релиз дожмёт hot_order_upd на переходе в paid.
2407
- if self.ad.pair_side.is_sell:
2430
+ # Исключение — INSTANT_RELEASE_EX_IDS (Bybit): там отпускаем прямо на created, как только
2431
+ # прошла внутренняя транзакция оплаты (pay() ниже), не дожидаясь paid от покупателя.
2432
+ if self.ad.pair_side.is_sell and self.ad.maker.ex_id not in INSTANT_RELEASE_EX_IDS:
2408
2433
  res.err = OrderErr.i_wait_for_payment
2409
2434
  res.data = OrderResult.Order.load(self)
2410
2435
  return res
@@ -50,3 +50,6 @@ class HotAds(Xs):
50
50
  balance: dict[int, float] # остаток по каждой валюте (cur_id → сумма)
51
51
  # остаток монет у акторов персон юзера: ex_id → coin_id → сумма asset.free
52
52
  coin_balance: dict[int, dict[int, int]]
53
+ # состояние чекбокса «Взаимный отзыв анонимно» под списком объяв (User.review_anon) — его
54
+ # рисуют оба клиента (бот hot_kb, web HotPage), поэтому едет тем же payload'ом, что и объявы
55
+ review_anon: bool = True
File without changes
File without changes