xync-db 0.5.5.dev23__tar.gz → 0.5.5.dev25__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.dev23 → xync_db-0.5.5.dev25}/PKG-INFO +1 -1
  2. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/models/__init__.py +27 -3
  3. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/.gitignore +0 -0
  4. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/README.md +0 -0
  5. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/pyproject.toml +0 -0
  6. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/__init__.py +0 -0
  7. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/config.py +0 -0
  8. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/enums.py +0 -0
  9. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/exceptions.py +0 -0
  10. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/graph.py +0 -0
  11. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/i18n.py +0 -0
  12. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/login_store.py +0 -0
  13. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/logo.png +0 -0
  14. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/CLAUDE.md +0 -0
  15. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/__init__.py +0 -0
  16. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/0001_initial.py +0 -0
  17. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/0002_triggers.py +0 -0
  18. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/0003_seed.py +0 -0
  19. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/__init__.py +0 -0
  20. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/__init__.py +0 -0
  21. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/a_actor_seed.py +0 -0
  22. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/a_bin_seed.py +0 -0
  23. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/a_country_seed.py +0 -0
  24. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/a_tg_seed.py +0 -0
  25. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/b_htx_seed.py +0 -0
  26. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/c_net_seed.py +0 -0
  27. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/countries.json +0 -0
  28. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/ranges.csv +0 -0
  29. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/migrations/models/seed/xync_files.sql +0 -0
  30. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/models/CLAUDE.md +0 -0
  31. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/py.typed +0 -0
  32. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/shared.py +0 -0
  33. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/__init__.py +0 -0
  34. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/__init__.py +0 -0
  35. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/actor.py +0 -0
  36. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/ad.py +0 -0
  37. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/common.py +0 -0
  38. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/cred.py +0 -0
  39. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/src/xync_db/typs/db/order.py +0 -0
  40. {xync_db-0.5.5.dev23 → xync_db-0.5.5.dev25}/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.dev23
3
+ Version: 0.5.5.dev25
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
@@ -1245,9 +1245,24 @@ class Agent(Model, TsTrait):
1245
1245
 
1246
1246
  @classmethod
1247
1247
  async def upsert(
1248
- cls, exid: int, host: str, auth: dict, exp: int | None, rname: str, nick: str, email: str | None = None
1248
+ cls,
1249
+ exid: int,
1250
+ host: str,
1251
+ auth: dict,
1252
+ exp: int | None,
1253
+ rname: str,
1254
+ nick: str,
1255
+ email: str | None = None,
1256
+ user: User | None = None,
1249
1257
  ) -> tuple[int, Agent, bool]:
1250
- """Единый писатель агента (за `/public/set-agent`). Bootstrap-персону нового актора резолвим
1258
+ """Единый писатель агента (за `/public/set-agent` и OAuth «Connect Bybit»). `exp=None` — срок
1259
+ web-сессии неизвестен (Htx/Mexc, голые API-ключи из OAuth) → `expire_at` не трогаем.
1260
+
1261
+ `user` — владелец УЖЕ известен (OAuth из приложения залогиненного юзера): актор сразу
1262
+ привязывается к нему `Actor.set_user` (тот же мердж персон, что по ответу админа), без
1263
+ USER_DEF-вопроса «чей это агент?». Актор чужого юзера → PermissionError, агента не трогаем.
1264
+
1265
+ Bootstrap-персону нового актора резолвим
1251
1266
  ПО `note` (`"{ex_id}:{exid}"`, уникальному по актору) — тем же ключом, что клиентский
1252
1267
  `Ex.person_save`, чтобы у Person был ОДИН путь создания (D-035). По НЕуникальному `name` НЕ
1253
1268
  ищем: именно `get_or_none(name=rname)` ронял прод `MultipleObjectsReturned` на тёзках без юзера.
@@ -1265,6 +1280,8 @@ class Agent(Model, TsTrait):
1265
1280
  note = f"{ex.id}:{exid}" # ключ bootstrap-персоны актора (как в Ex.person_save)
1266
1281
  if person := await Person.get_or_none(note=note):
1267
1282
  pass # актор уже знаком — берём его bootstrap-персону
1283
+ elif user: # владелец известен — персона без USER_DEF (админа не зовём), к юзеру ниже set_user'ом
1284
+ person = await Person.create(name=rname, note=note)
1268
1285
  else:
1269
1286
  # gmail-автолинк: замаскированная биржей почта, однозначно (ровно 1 gmail по LIKE,
1270
1287
  # где `*`→`_`) указывающая на юзера, сразу привязывает актора к его персоне — без
@@ -1286,9 +1303,16 @@ class Agent(Model, TsTrait):
1286
1303
  person = await Person.create(name=rname, note=note, status=PersonStatus.USER_DEF)
1287
1304
  err = 1 # ждём привязки к юзеру через def_user
1288
1305
  actor = await Actor.create(ex=ex, exid=exid, name=nick, person=person)
1306
+ if user:
1307
+ await actor.fetch_related("person")
1308
+ if actor.person.user_id not in (None, user.id):
1309
+ raise PermissionError(f"Actor#{actor.id} ({ex.name}:{exid}) belongs to user#{actor.person.user_id}")
1310
+ if not actor.person.user_id:
1311
+ await actor.set_user(user.username_id)
1289
1312
  if ag := await Agent.get_or_none(actor=actor):
1290
1313
  ag.auth |= auth
1291
- ag.expire_at = exp
1314
+ if exp is not None:
1315
+ ag.expire_at = exp
1292
1316
  await ag.save(update_fields=["auth", "expire_at"])
1293
1317
  created = False
1294
1318
  else:
File without changes
File without changes