aa-ledger 1.0.4__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (280) hide show
  1. {aa_ledger-1.0.4.dist-info → aa_ledger-2.0.0.dist-info}/METADATA +5 -6
  2. aa_ledger-2.0.0.dist-info/RECORD +267 -0
  3. ledger/__init__.py +2 -2
  4. ledger/admin.py +23 -18
  5. ledger/api/__init__.py +23 -7
  6. ledger/api/{ledger/admin.py → admin.py} +25 -31
  7. ledger/api/alliance.py +755 -0
  8. ledger/api/character.py +786 -0
  9. ledger/api/corporation.py +1141 -0
  10. ledger/api/{helpers.py → helpers/core.py} +33 -33
  11. ledger/api/helpers/icons.py +372 -0
  12. ledger/api/helpers/planetary_helper.py +354 -0
  13. ledger/api/planetary.py +354 -0
  14. ledger/api/schema.py +240 -15
  15. ledger/app_settings.py +11 -27
  16. ledger/auth_hooks.py +2 -2
  17. ledger/constants.py +50 -177
  18. ledger/decorators.py +2 -46
  19. ledger/forms.py +133 -39
  20. ledger/helpers/billboard.py +194 -144
  21. ledger/helpers/cache.py +105 -0
  22. ledger/helpers/discord.py +2 -4
  23. ledger/helpers/eveonline.py +160 -0
  24. ledger/helpers/ledger_data.py +23 -0
  25. ledger/helpers/ref_type.py +53 -78
  26. ledger/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  27. ledger/locale/cs_CZ/LC_MESSAGES/django.po +349 -193
  28. ledger/locale/de/LC_MESSAGES/django.mo +0 -0
  29. ledger/locale/de/LC_MESSAGES/django.po +528 -379
  30. ledger/locale/django.pot +721 -546
  31. ledger/locale/es/LC_MESSAGES/django.mo +0 -0
  32. ledger/locale/es/LC_MESSAGES/django.po +349 -194
  33. ledger/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  34. ledger/locale/fr_FR/LC_MESSAGES/django.po +349 -193
  35. ledger/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  36. ledger/locale/it_IT/LC_MESSAGES/django.po +349 -193
  37. ledger/locale/ja/LC_MESSAGES/django.mo +0 -0
  38. ledger/locale/ja/LC_MESSAGES/django.po +348 -193
  39. ledger/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  40. ledger/locale/ko_KR/LC_MESSAGES/django.po +349 -193
  41. ledger/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  42. ledger/locale/nl_NL/LC_MESSAGES/django.po +349 -193
  43. ledger/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  44. ledger/locale/pl_PL/LC_MESSAGES/django.po +350 -193
  45. ledger/locale/ru/LC_MESSAGES/django.mo +0 -0
  46. ledger/locale/ru/LC_MESSAGES/django.po +348 -193
  47. ledger/locale/sk/LC_MESSAGES/django.mo +0 -0
  48. ledger/locale/sk/LC_MESSAGES/django.po +348 -193
  49. ledger/locale/uk/LC_MESSAGES/django.mo +0 -0
  50. ledger/locale/uk/LC_MESSAGES/django.po +348 -193
  51. ledger/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  52. ledger/locale/zh_Hans/LC_MESSAGES/django.po +348 -193
  53. ledger/managers/character_audit_manager.py +28 -20
  54. ledger/managers/character_journal_manager.py +185 -357
  55. ledger/managers/character_mining_manager.py +52 -26
  56. ledger/managers/character_planetary_manager.py +178 -136
  57. ledger/managers/corporation_audit_manager.py +36 -27
  58. ledger/managers/corporation_journal_manager.py +92 -56
  59. ledger/managers/general_manager.py +8 -7
  60. ledger/migrations/0018_remove_characterplanet_ledger_char_planet__58a5b6_idx_and_more.py +44 -0
  61. ledger/migrations/0019_rename_characteraudit_characterowner_and_more.py +48 -0
  62. ledger/models/__init__.py +5 -11
  63. ledger/models/characteraudit.py +101 -109
  64. ledger/models/corporationaudit.py +94 -49
  65. ledger/models/general.py +105 -211
  66. ledger/models/helpers/update_manager.py +302 -0
  67. ledger/models/planetary.py +60 -205
  68. ledger/providers.py +101 -0
  69. ledger/static/ledger/css/{ledger.css → aa-ledger.css} +54 -28
  70. ledger/static/ledger/js/aa-ledger.js +124 -0
  71. ledger/static/ledger/js/charts.js +25 -1
  72. ledger/static/ledger/js/view-alliance-ledger.js +383 -0
  73. ledger/static/ledger/js/view-character-ledger.js +388 -0
  74. ledger/static/ledger/js/view-corporation-ledger.js +402 -0
  75. ledger/static/ledger/js/view-planetary.js +492 -0
  76. ledger/static/ledger/libs/amCharts/5.14.4/js/flow.js +2 -0
  77. ledger/static/ledger/libs/amCharts/5.14.4/js/index.js +2 -0
  78. ledger/static/ledger/libs/amCharts/5.14.4/js/percent.js +2 -0
  79. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Animated.js +2 -0
  80. ledger/static/ledger/libs/amCharts/5.14.4/js/themes/Dark.js +2 -0
  81. ledger/static/ledger/libs/amCharts/5.14.4/js/xy.js +2 -0
  82. ledger/static/ledger/libs/datatables/2.3.5/css/dataTables.bootstrap5.css +610 -0
  83. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.bootstrap5.js +122 -0
  84. ledger/static/ledger/libs/datatables/2.3.5/js/dataTables.js +14127 -0
  85. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.bootstrap5.css +516 -0
  86. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/css/columnControl.dataTables.css +529 -0
  87. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/columnControl.bootstrap5.js +73 -0
  88. ledger/static/ledger/libs/datatables/Extensions/ColumnControl/1.1.1/js/dataTables.columnControl.js +3090 -0
  89. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/css/fixedHeader.bootstrap5.css +20 -0
  90. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/dataTables.fixedHeader.js +1203 -0
  91. ledger/static/ledger/libs/datatables/Extensions/FixedHeader/4.0.4/js/fixedHeader.bootstrap5.js +59 -0
  92. ledger/tasks.py +157 -141
  93. ledger/templates/ledger/base.html +59 -21
  94. ledger/templates/ledger/bundles/aa-ledger-css.html +3 -0
  95. ledger/templates/ledger/bundles/aa-ledger-js.html +3 -0
  96. ledger/templates/ledger/bundles/view-alliance-ledger-js.html +14 -0
  97. ledger/templates/ledger/bundles/view-character-ledger-js.html +15 -0
  98. ledger/templates/ledger/bundles/view-character-planetary-css.html +3 -0
  99. ledger/templates/ledger/bundles/view-character-planetary-js.html +4 -0
  100. ledger/templates/ledger/bundles/view-corporation-ledger-js.html +15 -0
  101. ledger/templates/ledger/partials/modal/confirm.html +0 -1
  102. ledger/templates/ledger/partials/modal/request-accept-delete-alliance.html +38 -0
  103. ledger/templates/ledger/partials/modal/request-accept-delete-character.html +38 -0
  104. ledger/templates/ledger/partials/modal/request-accept-delete-corporation.html +38 -0
  105. ledger/templates/ledger/partials/modal/request-accept-switch-notification.html +38 -0
  106. ledger/templates/ledger/partials/modal/request-view-alliance-details.html +26 -0
  107. ledger/templates/ledger/partials/modal/request-view-character-details.html +26 -0
  108. ledger/templates/ledger/partials/modal/request-view-corporation-details.html +26 -0
  109. ledger/templates/ledger/partials/modal/request-view-extractor.html +32 -0
  110. ledger/templates/ledger/partials/modal/request-view-factory.html +31 -0
  111. ledger/templates/ledger/partials/{menu → navigation}/administration.html +8 -0
  112. ledger/templates/ledger/partials/{menu → navigation}/navigation.html +2 -2
  113. ledger/templates/ledger/partials/{administration → view-alliance-administration}/alliance_corporations.html +3 -3
  114. ledger/templates/ledger/partials/view-alliance-administration/dashboard.html +81 -0
  115. ledger/templates/ledger/partials/view-alliance-ledger/alliance-billboard.html +25 -0
  116. ledger/templates/ledger/partials/view-alliance-ledger/alliance-ledger-details.html +21 -0
  117. ledger/templates/ledger/partials/view-alliance-ledger/alliance-table.html +24 -0
  118. ledger/templates/ledger/partials/view-alliance-ledger/information/daily.html +18 -0
  119. ledger/templates/ledger/partials/view-alliance-ledger/information/hourly.html +18 -0
  120. ledger/templates/ledger/partials/view-alliance-ledger/information/summary.html +19 -0
  121. ledger/templates/ledger/partials/{administration → view-character-administration}/character.html +1 -9
  122. ledger/templates/ledger/partials/{administration → view-character-administration}/dashboard.html +0 -34
  123. ledger/templates/ledger/partials/view-character-ledger/character-billboard.html +25 -0
  124. ledger/templates/ledger/partials/view-character-ledger/character-ledger-details.html +21 -0
  125. ledger/templates/ledger/partials/view-character-ledger/character-table.html +25 -0
  126. ledger/templates/ledger/partials/view-character-ledger/information/daily.html +18 -0
  127. ledger/templates/ledger/partials/view-character-ledger/information/hourly.html +18 -0
  128. ledger/templates/ledger/partials/view-character-ledger/information/summary.html +19 -0
  129. ledger/templates/ledger/partials/view-character-planetary/extractor-table.html +24 -0
  130. ledger/templates/ledger/partials/view-character-planetary/factory-table.html +24 -0
  131. ledger/templates/ledger/partials/view-character-planetary/planetary-table.html +22 -0
  132. ledger/templates/ledger/partials/view-character-planetary/storage-table.html +23 -0
  133. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation.html +5 -13
  134. ledger/templates/ledger/partials/{administration → view-corporation-administration}/corporation_characters.html +1 -1
  135. ledger/templates/ledger/partials/view-corporation-administration/dashboard.html +81 -0
  136. ledger/templates/ledger/partials/view-corporation-ledger/corporation-billboard.html +25 -0
  137. ledger/templates/ledger/partials/view-corporation-ledger/corporation-ledger-details.html +21 -0
  138. ledger/templates/ledger/partials/view-corporation-ledger/corporation-table.html +26 -0
  139. ledger/templates/ledger/partials/view-corporation-ledger/information/daily.html +18 -0
  140. ledger/templates/ledger/partials/view-corporation-ledger/information/hourly.html +18 -0
  141. ledger/templates/ledger/partials/view-corporation-ledger/information/summary.html +19 -0
  142. ledger/templates/ledger/view-administration.html +62 -0
  143. ledger/templates/ledger/view-alliance-administration.html +49 -0
  144. ledger/templates/ledger/view-alliance-ledger.html +72 -0
  145. ledger/templates/ledger/view-alliance-overview.html +131 -0
  146. ledger/templates/ledger/view-character-administration.html +42 -0
  147. ledger/templates/ledger/view-character-ledger.html +73 -0
  148. ledger/templates/ledger/view-character-overview.html +135 -0
  149. ledger/templates/ledger/view-character-planetary-overview.html +135 -0
  150. ledger/templates/ledger/view-character-planetary.html +73 -0
  151. ledger/templates/ledger/view-corporation-administration.html +42 -0
  152. ledger/templates/ledger/view-corporation-ledger.html +73 -0
  153. ledger/templates/ledger/view-corporation-overview.html +131 -0
  154. ledger/templatetags/ledger.py +3 -5
  155. ledger/tests/__init__.py +187 -0
  156. ledger/tests/test_admin.py +164 -68
  157. ledger/tests/test_auth_hook.py +31 -13
  158. ledger/tests/test_decarators.py +14 -79
  159. ledger/tests/test_discord_installed.py +0 -1
  160. ledger/tests/test_helpers/test_ledger_data.py +19 -0
  161. ledger/tests/test_managers/test_character_audit_manager.py +111 -69
  162. ledger/tests/test_managers/test_character_journal_manager.py +48 -208
  163. ledger/tests/test_managers/test_character_mining_manager.py +37 -16
  164. ledger/tests/test_managers/test_corporation_division_manager.py +66 -28
  165. ledger/tests/test_managers/test_corporation_journal_manager.py +39 -42
  166. ledger/tests/test_managers/test_general_manager.py +78 -18
  167. ledger/tests/test_managers/test_planetary_manager.py +73 -32
  168. ledger/tests/test_models/test_characteraudit.py +58 -74
  169. ledger/tests/test_models/test_characterminingledger.py +20 -26
  170. ledger/tests/test_models/test_characterwalletjournal.py +10 -33
  171. ledger/tests/test_models/test_corporationaudit.py +41 -35
  172. ledger/tests/test_models/test_corporationwalletjournal.py +35 -32
  173. ledger/tests/test_models/test_general.py +44 -11
  174. ledger/tests/test_models/test_planetary.py +14 -80
  175. ledger/tests/test_templatetags.py +2 -7
  176. ledger/tests/test_views/corporation/test_add_corp.py +16 -35
  177. ledger/tests/test_views/corporation/test_delete_corporation.py +66 -42
  178. ledger/tests/test_views/test_access.py +512 -545
  179. ledger/tests/test_views/test_add_ally.py +57 -46
  180. ledger/tests/test_views/test_add_char.py +21 -33
  181. ledger/tests/test_views/test_delete_character.py +24 -21
  182. ledger/tests/testdata/README_ESI_STUB.md +430 -0
  183. ledger/tests/testdata/esi_stub_openapi.py +511 -0
  184. ledger/tests/testdata/integrations/__init__.py +0 -0
  185. ledger/tests/testdata/{load_eveuniverse.py → integrations/eveuniverse.py} +0 -1
  186. ledger/tests/testdata/integrations/planetary.py +13 -0
  187. ledger/tests/testdata/json/factory.json +281 -0
  188. ledger/tests/testdata/json/inactive.json +281 -0
  189. ledger/tests/testdata/json/pins.json +175 -272
  190. ledger/tests/testdata/json/route.json +95 -528
  191. ledger/tests/testdata/test_esi_stub.py +468 -0
  192. ledger/tests/testdata/utils.py +601 -0
  193. ledger/thirdparty/charlink_hook.py +60 -30
  194. ledger/urls.py +0 -135
  195. ledger/views/alliance/add_ally.py +2 -4
  196. ledger/views/alliance/alliance_ledger.py +64 -147
  197. ledger/views/character/add_char.py +8 -10
  198. ledger/views/character/character_ledger.py +60 -126
  199. ledger/views/character/planetary.py +5 -98
  200. ledger/views/corporation/add_corp.py +10 -12
  201. ledger/views/corporation/corporation_ledger.py +65 -327
  202. ledger/views/index.py +92 -30
  203. aa_ledger-1.0.4.dist-info/RECORD +0 -236
  204. ledger/api/api_helper/planetary_helper.py +0 -107
  205. ledger/api/ledger/__init__.py +0 -7
  206. ledger/api/ledger/planetary.py +0 -231
  207. ledger/helpers/alliance.py +0 -317
  208. ledger/helpers/character.py +0 -251
  209. ledger/helpers/core.py +0 -665
  210. ledger/helpers/corporation.py +0 -427
  211. ledger/helpers/data_exporter.py +0 -452
  212. ledger/static/ledger/js/planetary-confirm.js +0 -66
  213. ledger/static/ledger/js/planetary.js +0 -143
  214. ledger/templates/ledger/admin.html +0 -43
  215. ledger/templates/ledger/allyledger/admin/alliance_administration.html +0 -46
  216. ledger/templates/ledger/allyledger/admin/alliance_overview.html +0 -108
  217. ledger/templates/ledger/allyledger/alliance_ledger.html +0 -86
  218. ledger/templates/ledger/bundles/character-ledger-bundles.html +0 -66
  219. ledger/templates/ledger/bundles/corporation-ledger-bundles.html +0 -75
  220. ledger/templates/ledger/bundles/ledger-bundles.html +0 -23
  221. ledger/templates/ledger/bundles/ledger-css.html +0 -3
  222. ledger/templates/ledger/bundles/planetary-bundles.html +0 -50
  223. ledger/templates/ledger/bundles/table-css.html +0 -3
  224. ledger/templates/ledger/charledger/admin/character_administration.html +0 -39
  225. ledger/templates/ledger/charledger/admin/character_overview.html +0 -106
  226. ledger/templates/ledger/charledger/character_ledger.html +0 -94
  227. ledger/templates/ledger/charledger/planetary/admin/planetary_overview.html +0 -123
  228. ledger/templates/ledger/charledger/planetary/planetary_ledger.html +0 -54
  229. ledger/templates/ledger/corpledger/admin/corporation_administration.html +0 -39
  230. ledger/templates/ledger/corpledger/admin/corporation_overview.html +0 -108
  231. ledger/templates/ledger/corpledger/corporation_ledger.html +0 -129
  232. ledger/templates/ledger/data-export.html +0 -78
  233. ledger/templates/ledger/error.html +0 -31
  234. ledger/templates/ledger/partials/form/error-message.html +0 -1
  235. ledger/templates/ledger/partials/information/daily.html +0 -56
  236. ledger/templates/ledger/partials/information/day.html +0 -48
  237. ledger/templates/ledger/partials/information/error.html +0 -8
  238. ledger/templates/ledger/partials/information/hourly.html +0 -53
  239. ledger/templates/ledger/partials/information/summary.html +0 -88
  240. ledger/templates/ledger/partials/information/view_character_content.html +0 -35
  241. ledger/templates/ledger/partials/modal/switchalarm_confirm.html +0 -39
  242. ledger/templates/ledger/partials/modal/view_extractor.html +0 -48
  243. ledger/templates/ledger/partials/modal/view_factory.html +0 -123
  244. ledger/templates/ledger/partials/table/char-ledger.html +0 -85
  245. ledger/templates/ledger/partials/table/corp-ledger.html +0 -66
  246. ledger/templates/ledger/partials/table/planetary.html +0 -18
  247. ledger/templates/ledger/partials/thirdparty/billboard.html +0 -22
  248. ledger/templates/ledger/partials/view/card.html +0 -160
  249. ledger/templates/ledger/permission.html +0 -2
  250. ledger/tests/test_helpers/test_billboard.py +0 -11
  251. ledger/tests/test_helpers/test_data_exporter.py +0 -207
  252. ledger/tests/test_tasks.py +0 -282
  253. ledger/tests/test_view_helpers/test_core.py +0 -47
  254. ledger/tests/test_views/corporation/test_corporation.py +0 -267
  255. ledger/tests/test_views/test_planetary.py +0 -137
  256. ledger/tests/testdata/esi_stub.py +0 -109
  257. ledger/tests/testdata/esi_stub_migration.py +0 -80
  258. ledger/tests/testdata/generate_characteraudit.py +0 -106
  259. ledger/tests/testdata/generate_corporationaudit.py +0 -74
  260. ledger/tests/testdata/generate_events.py +0 -31
  261. ledger/tests/testdata/generate_miningledger.py +0 -13
  262. ledger/tests/testdata/generate_planets.py +0 -48
  263. ledger/tests/testdata/generate_walletjournal.py +0 -42
  264. ledger/tests/testdata/json/czarno-pins.json +0 -240
  265. ledger/tests/testdata/json/czarno-routes.json +0 -165
  266. ledger/tests/testdata/json/pins2.json +0 -538
  267. {aa_ledger-1.0.4.dist-info → aa_ledger-2.0.0.dist-info}/WHEEL +0 -0
  268. {aa_ledger-1.0.4.dist-info → aa_ledger-2.0.0.dist-info}/licenses/LICENSE +0 -0
  269. /ledger/{tests/test_view_helpers → api/helpers}/__init__.py +0 -0
  270. /ledger/templates/ledger/bundles/{ally-administration-bundles.html → view-alliance-administration-js.html} +0 -0
  271. /ledger/templates/ledger/bundles/{char-administration-bundles.html → view-character-administration-js.html} +0 -0
  272. /ledger/templates/ledger/bundles/{corp-administration-bundles.html → view-corporation-administration-js.html} +0 -0
  273. /ledger/templates/ledger/partials/{administration → view-alliance-administration}/alliance.html +0 -0
  274. /ledger/tests/testdata/{esi.json → esi_test_data.json} +0 -0
  275. /ledger/tests/testdata/{allianceauth.json → integrations/allianceauth.json} +0 -0
  276. /ledger/tests/testdata/{load_allianceauth.py → integrations/allianceauth.py} +0 -0
  277. /ledger/tests/testdata/{eveentity.json → integrations/eveentity.json} +0 -0
  278. /ledger/tests/testdata/{load_eveentity.py → integrations/eveentity.py} +0 -0
  279. /ledger/tests/testdata/{eveuniverse.json → integrations/eveuniverse.json} +0 -0
  280. /ledger/tests/testdata/{planetary.json → integrations/planetary.json} +0 -0
@@ -1,21 +1,30 @@
1
+ # Standard Library
2
+ from typing import TYPE_CHECKING
3
+
1
4
  # Django
2
5
  from django.db import models
3
6
  from django.db.models import Case, Count, Q, Value, When
4
7
 
5
8
  # Alliance Auth
9
+ from allianceauth.authentication.models import User
6
10
  from allianceauth.services.hooks import get_extension_logger
7
11
 
8
- # Alliance Auth (External Libs)
9
- from app_utils.logging import LoggerAddTag
10
-
11
12
  # AA Ledger
12
13
  from ledger import __title__
14
+ from ledger.models.helpers.update_manager import CorporationUpdateSection, UpdateStatus
15
+ from ledger.providers import AppLogger
13
16
 
14
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
17
+ logger = AppLogger(get_extension_logger(__name__), __title__)
15
18
 
19
+ if TYPE_CHECKING:
20
+ # AA Ledger
21
+ from ledger.models.corporationaudit import (
22
+ CorporationOwner as CorporationAuditContext,
23
+ )
16
24
 
17
- class CorporationAuditQuerySet(models.QuerySet):
18
- def visible_to(self, user):
25
+
26
+ class CorporationAuditQuerySet(models.QuerySet["CorporationAuditContext"]):
27
+ def visible_to(self, user: User):
19
28
  """Returns a queryset of all corps visible to the user."""
20
29
  if user.is_superuser:
21
30
  logger.debug(
@@ -38,7 +47,7 @@ class CorporationAuditQuerySet(models.QuerySet):
38
47
  corp_ids = char.character_ownership.user.character_ownerships.all().values_list(
39
48
  "character__corporation_id", flat=True
40
49
  )
41
- queries.append(models.Q(corporation__corporation_id__in=corp_ids))
50
+ queries.append(models.Q(eve_corporation__corporation_id__in=corp_ids))
42
51
 
43
52
  logger.debug("%s queries for User %s.", len(queries), user)
44
53
 
@@ -53,7 +62,7 @@ class CorporationAuditQuerySet(models.QuerySet):
53
62
  logger.debug("User %s has no main character. Nothing visible.", user)
54
63
  return self.none()
55
64
 
56
- def manage_to(self, user):
65
+ def manage_to(self, user: User):
57
66
  """Return all corps that the user can manage."""
58
67
  if user.is_superuser:
59
68
  logger.debug(
@@ -76,7 +85,7 @@ class CorporationAuditQuerySet(models.QuerySet):
76
85
  corp_ids = char.character_ownership.user.character_ownerships.all().values_list(
77
86
  "character__corporation_id", flat=True
78
87
  )
79
- queries.append(models.Q(corporation__corporation_id__in=corp_ids))
88
+ queries.append(models.Q(eve_corporation__corporation_id__in=corp_ids))
80
89
 
81
90
  logger.debug("%s queries for User %s.", len(queries), user)
82
91
 
@@ -91,18 +100,14 @@ class CorporationAuditQuerySet(models.QuerySet):
91
100
  logger.debug("User %s has no main character. Nothing visible.", user)
92
101
  return self.none()
93
102
 
94
- def annotate_total_update_status_user(self, user):
103
+ def annotate_total_update_status_user(self, user: User):
95
104
  """Get the total update status for the given user."""
96
105
  # TODO: implement this method if needed
97
106
  return user
98
107
 
99
108
  def annotate_total_update_status(self):
100
109
  """Get the total update status."""
101
- # pylint: disable=import-outside-toplevel
102
- # AA Ledger
103
- from ledger.models.corporationaudit import CorporationAudit
104
-
105
- sections = CorporationAudit.UpdateSection.get_sections()
110
+ sections = CorporationUpdateSection.get_sections()
106
111
  num_sections_total = len(sections)
107
112
  qs = (
108
113
  self.annotate(
@@ -143,25 +148,25 @@ class CorporationAuditQuerySet(models.QuerySet):
143
148
  total_update_status=Case(
144
149
  When(
145
150
  active=False,
146
- then=Value(CorporationAudit.UpdateStatus.DISABLED),
151
+ then=Value(UpdateStatus.DISABLED),
147
152
  ),
148
153
  When(
149
154
  num_sections_token_error=1,
150
- then=Value(CorporationAudit.UpdateStatus.TOKEN_ERROR),
155
+ then=Value(UpdateStatus.TOKEN_ERROR),
151
156
  ),
152
157
  When(
153
158
  num_sections_failed__gt=0,
154
- then=Value(CorporationAudit.UpdateStatus.ERROR),
159
+ then=Value(UpdateStatus.ERROR),
155
160
  ),
156
161
  When(
157
162
  num_sections_ok=num_sections_total,
158
- then=Value(CorporationAudit.UpdateStatus.OK),
163
+ then=Value(UpdateStatus.OK),
159
164
  ),
160
165
  When(
161
166
  num_sections_total__lt=num_sections_total,
162
- then=Value(CorporationAudit.UpdateStatus.INCOMPLETE),
167
+ then=Value(UpdateStatus.INCOMPLETE),
163
168
  ),
164
- default=Value(CorporationAudit.UpdateStatus.IN_PROGRESS),
169
+ default=Value(UpdateStatus.IN_PROGRESS),
165
170
  )
166
171
  )
167
172
  )
@@ -169,14 +174,18 @@ class CorporationAuditQuerySet(models.QuerySet):
169
174
  return qs
170
175
 
171
176
 
172
- class CorporationAuditManagerBase(models.Manager):
177
+ class CorporationAuditManager(models.Manager["CorporationAuditContext"]):
178
+ def get_queryset(self) -> CorporationAuditQuerySet:
179
+ return CorporationAuditQuerySet(self.model, using=self._db)
180
+
181
+ def annotate_total_update_status_user(self, user: User):
182
+ return self.get_queryset().annotate_total_update_status_user(user)
183
+
184
+ def annotate_total_update_status(self):
185
+ return self.get_queryset().annotate_total_update_status()
186
+
173
187
  def visible_to(self, user):
174
188
  return self.get_queryset().visible_to(user)
175
189
 
176
190
  def manage_to(self, user):
177
191
  return self.get_queryset().manage_to(user)
178
-
179
-
180
- CorporationAuditManager = CorporationAuditManagerBase.from_queryset(
181
- CorporationAuditQuerySet
182
- )
@@ -11,9 +11,6 @@ from django.utils.translation import gettext_lazy as _
11
11
  from allianceauth.services.hooks import get_extension_logger
12
12
  from esi.exceptions import HTTPNotModified
13
13
 
14
- # Alliance Auth (External Libs)
15
- from app_utils.logging import LoggerAddTag
16
-
17
14
  # AA Ledger
18
15
  from ledger import __title__
19
16
  from ledger.app_settings import LEDGER_BULK_BATCH_SIZE
@@ -21,22 +18,24 @@ from ledger.decorators import log_timing
21
18
  from ledger.errors import DatabaseError
22
19
  from ledger.helpers.ref_type import RefTypeManager
23
20
  from ledger.models.general import EveEntity
24
- from ledger.providers import esi
21
+ from ledger.models.helpers.update_manager import CorporationUpdateSection
22
+ from ledger.providers import AppLogger, esi
25
23
 
26
24
  if TYPE_CHECKING:
27
25
  # Alliance Auth
28
- from esi.stubs import CorporationsCorporationIdDivisionsGet as DivisionItem
26
+ from esi.stubs import CorporationsCorporationIdDivisionsGet as DivisionsContext
29
27
  from esi.stubs import (
30
- CorporationsCorporationIdWalletsDivisionJournalGetItem as JournalItem,
28
+ CorporationsCorporationIdWalletsDivisionJournalGetItem as DivisionJournalContext,
31
29
  )
30
+ from esi.stubs import CorporationsCorporationIdWalletsGetItem as WalletsGetContext
32
31
 
33
32
  # AA Ledger
34
33
  from ledger.models.corporationaudit import (
35
- CorporationAudit,
34
+ CorporationOwner,
36
35
  CorporationWalletDivision,
37
36
  )
38
37
 
39
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
38
+ logger = AppLogger(get_extension_logger(__name__), __title__)
40
39
 
41
40
 
42
41
  class CorporationWalletQuerySet(models.QuerySet):
@@ -73,7 +72,9 @@ class CorporationWalletQuerySet(models.QuerySet):
73
72
  miscellaneous=Coalesce(
74
73
  Sum(
75
74
  "amount",
76
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__gt=0),
75
+ filter=Q(
76
+ ref_type__in=RefTypeManager.ledger_ref_types(), amount__gt=0
77
+ ),
77
78
  ),
78
79
  Value(0),
79
80
  output_field=DecimalField(),
@@ -85,7 +86,9 @@ class CorporationWalletQuerySet(models.QuerySet):
85
86
  costs=Coalesce(
86
87
  Sum(
87
88
  "amount",
88
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__lt=0),
89
+ filter=Q(
90
+ ref_type__in=RefTypeManager.ledger_ref_types(), amount__lt=0
91
+ ),
89
92
  ),
90
93
  Value(0),
91
94
  output_field=DecimalField(),
@@ -107,7 +110,7 @@ class CorporationWalletQuerySet(models.QuerySet):
107
110
  def aggregate_miscellaneous(self) -> dict:
108
111
  """Aggregate miscellaneous income (nur positive Beträge)."""
109
112
  return self.filter(
110
- ref_type__in=RefTypeManager.all_ref_types(), amount__gt=0
113
+ ref_type__in=RefTypeManager.ledger_ref_types(), amount__gt=0
111
114
  ).aggregate(
112
115
  total_misc=Coalesce(Sum("amount"), Value(0), output_field=DecimalField())
113
116
  )[
@@ -117,7 +120,7 @@ class CorporationWalletQuerySet(models.QuerySet):
117
120
  def aggregate_costs(self) -> dict:
118
121
  """Aggregate costs."""
119
122
  return self.filter(
120
- ref_type__in=RefTypeManager.all_ref_types(), amount__lt=0
123
+ ref_type__in=RefTypeManager.ledger_ref_types(), amount__lt=0
121
124
  ).aggregate(
122
125
  total_costs=Coalesce(Sum("amount"), Value(0), output_field=DecimalField())
123
126
  )[
@@ -160,20 +163,67 @@ class CorporationWalletQuerySet(models.QuerySet):
160
163
  )["total"]
161
164
 
162
165
 
163
- class CorporationWalletManagerBase(models.Manager):
166
+ class CorporationWalletManager(models.Manager):
167
+ def get_queryset(self) -> CorporationWalletQuerySet:
168
+ return CorporationWalletQuerySet(self.model, using=self._db)
169
+
170
+ def annotate_bounty_income(
171
+ self,
172
+ ) -> CorporationWalletQuerySet:
173
+ return self.get_queryset().annotate_bounty_income()
174
+
175
+ def annotate_ess_income(self) -> CorporationWalletQuerySet:
176
+ return self.get_queryset().annotate_ess_income()
177
+
178
+ def annotate_miscellaneous(self) -> CorporationWalletQuerySet:
179
+ return self.get_queryset().annotate_miscellaneous()
180
+
181
+ def annotate_costs(self) -> CorporationWalletQuerySet:
182
+ return self.get_queryset().annotate_costs()
183
+
184
+ def aggregate_bounty(self) -> dict:
185
+ """Aggregate bounty income."""
186
+ return self.get_queryset().aggregate_bounty()
187
+
188
+ def aggregate_ess(self) -> dict:
189
+ """Aggregate ESS income."""
190
+ return self.get_queryset().aggregate_ess()
191
+
192
+ def aggregate_miscellaneous(self) -> dict:
193
+ """Aggregate miscellaneous income (nur positive Beträge)."""
194
+ return self.get_queryset().aggregate_miscellaneous()
195
+
196
+ def aggregate_costs(self) -> dict:
197
+ """Aggregate costs."""
198
+ return self.get_queryset().aggregate_costs()
199
+
200
+ # pylint: disable=too-many-positional-arguments
201
+ def aggregate_ref_type(
202
+ self,
203
+ ref_type: list,
204
+ first_party=None,
205
+ second_party=None,
206
+ exclude=None,
207
+ income: bool = False,
208
+ ) -> dict:
209
+ """Aggregate income by ref_type."""
210
+ return self.get_queryset().aggregate_ref_type(
211
+ ref_type, first_party, second_party, exclude, income
212
+ )
213
+
164
214
  @log_timing(logger)
165
215
  def update_or_create_esi(
166
- self, corporation: "CorporationAudit", force_refresh: bool = False
216
+ self, owner: "CorporationOwner", force_refresh: bool = False
167
217
  ) -> None:
168
218
  """Update or Create a wallet journal entry from ESI data."""
169
- return corporation.update_section_if_changed(
170
- section=corporation.UpdateSection.WALLET_JOURNAL,
219
+ return owner.update_manager.update_section_if_changed(
220
+ section=CorporationUpdateSection.WALLET_JOURNAL,
171
221
  fetch_func=self._fetch_esi_data,
172
222
  force_refresh=force_refresh,
173
223
  )
174
224
 
175
225
  def _fetch_esi_data(
176
- self, audit: "CorporationAudit", force_refresh: bool = False
226
+ self, owner: "CorporationOwner", force_refresh: bool = False
177
227
  ) -> None:
178
228
  """Fetch wallet journal entries from ESI data."""
179
229
  # AA Ledger
@@ -186,16 +236,16 @@ class CorporationWalletManagerBase(models.Manager):
186
236
  ]
187
237
  req_roles = ["CEO", "Director", "Accountant", "Junior_Accountant"]
188
238
 
189
- token = audit.get_token(scopes=req_scopes, req_roles=req_roles)
239
+ token = owner.get_token(scopes=req_scopes, req_roles=req_roles)
190
240
 
191
- divisions = CorporationWalletDivision.objects.filter(corporation=audit)
241
+ divisions = CorporationWalletDivision.objects.filter(corporation=owner)
192
242
  is_updated = False
193
243
 
194
244
  for division in divisions:
195
245
  # Make the ESI request
196
246
  operation = (
197
247
  esi.client.Wallet.GetCorporationsCorporationIdWalletsDivisionJournal(
198
- corporation_id=audit.corporation.corporation_id,
248
+ corporation_id=owner.eve_corporation.corporation_id,
199
249
  division=division.division_id,
200
250
  token=token,
201
251
  )
@@ -217,7 +267,7 @@ class CorporationWalletManagerBase(models.Manager):
217
267
  def _update_or_create_objs(
218
268
  self,
219
269
  division: "CorporationWalletDivision",
220
- objs: list["JournalItem"],
270
+ objs: list["DivisionJournalContext"],
221
271
  ) -> None:
222
272
  """Update or Create wallet journal entries from objs data."""
223
273
  _new_names = []
@@ -276,29 +326,20 @@ class CorporationWalletManagerBase(models.Manager):
276
326
  )
277
327
 
278
328
 
279
- CorporationWalletManager = CorporationWalletManagerBase.from_queryset(
280
- CorporationWalletQuerySet
281
- )
282
-
283
-
284
- class CorporationDivisionQuerySet(models.QuerySet):
285
- pass
286
-
287
-
288
- class CorporationDivisionManagerBase(models.Manager):
329
+ class CorporationDivisionManager(models.Manager):
289
330
  @log_timing(logger)
290
331
  def update_or_create_esi(
291
- self, corporation: "CorporationAudit", force_refresh: bool = False
332
+ self, owner: "CorporationOwner", force_refresh: bool = False
292
333
  ) -> None:
293
334
  """Update or Create a division entry from ESI data."""
294
- return corporation.update_section_if_changed(
295
- section=corporation.UpdateSection.WALLET_DIVISION,
335
+ return owner.update_manager.update_section_if_changed(
336
+ section=CorporationUpdateSection.WALLET_DIVISION,
296
337
  fetch_func=self._fetch_esi_data,
297
338
  force_refresh=force_refresh,
298
339
  )
299
340
 
300
341
  def _fetch_esi_data(
301
- self, audit: "CorporationAudit", force_refresh: bool = False
342
+ self, owner: "CorporationOwner", force_refresh: bool = False
302
343
  ) -> None:
303
344
  """Fetch division entries from ESI data."""
304
345
  req_scopes = [
@@ -307,52 +348,52 @@ class CorporationDivisionManagerBase(models.Manager):
307
348
  "esi-corporations.read_divisions.v1",
308
349
  ]
309
350
  req_roles = ["CEO", "Director", "Accountant", "Junior_Accountant"]
310
- token = audit.get_token(scopes=req_scopes, req_roles=req_roles)
351
+ token = owner.get_token(scopes=req_scopes, req_roles=req_roles)
311
352
 
312
353
  # Make the ESI request
313
354
  operation = esi.client.Wallet.GetCorporationsCorporationIdWallets(
314
- corporation_id=audit.corporation.corporation_id,
355
+ corporation_id=owner.eve_corporation.corporation_id,
315
356
  token=token,
316
357
  )
317
358
  division_items = operation.results(force_refresh=force_refresh)
318
359
 
319
- self._update_or_create_objs(corporation=audit, objs=division_items)
360
+ self._update_or_create_objs(owner=owner, objs=division_items)
320
361
 
321
362
  @log_timing(logger)
322
363
  def update_or_create_esi_names(
323
- self, corporation: "CorporationAudit", force_refresh: bool = False
364
+ self, owner: "CorporationOwner", force_refresh: bool = False
324
365
  ) -> None:
325
366
  """Update or Create a division entry from ESI data."""
326
- return corporation.update_section_if_changed(
327
- section=corporation.UpdateSection.WALLET_DIVISION_NAMES,
367
+ return owner.update_manager.update_section_if_changed(
368
+ section=CorporationUpdateSection.WALLET_DIVISION_NAMES,
328
369
  fetch_func=self._fetch_esi_data_names,
329
370
  force_refresh=force_refresh,
330
371
  )
331
372
 
332
373
  def _fetch_esi_data_names(
333
- self, audit: "CorporationAudit", force_refresh: bool = False
374
+ self, owner: "CorporationOwner", force_refresh: bool = False
334
375
  ) -> None:
335
376
  """Fetch division entries from ESI data."""
336
377
  req_scopes = [
337
378
  "esi-corporations.read_divisions.v1",
338
379
  ]
339
380
  req_roles = ["CEO", "Director"]
340
- token = audit.get_token(scopes=req_scopes, req_roles=req_roles)
381
+ token = owner.get_token(scopes=req_scopes, req_roles=req_roles)
341
382
 
342
383
  # Make the ESI request
343
384
  operation = esi.client.Corporation.GetCorporationsCorporationIdDivisions(
344
- corporation_id=audit.corporation.corporation_id,
385
+ corporation_id=owner.eve_corporation.corporation_id,
345
386
  token=token,
346
387
  )
347
388
  division_items = operation.results(force_refresh=force_refresh)
348
389
 
349
- self._update_or_create_objs_division(corporation=audit, objs=division_items)
390
+ self._update_or_create_objs_division(owner=owner, objs=division_items)
350
391
 
351
392
  @transaction.atomic()
352
393
  def _update_or_create_objs_division(
353
394
  self,
354
- corporation: "CorporationAudit",
355
- objs: list["DivisionItem"],
395
+ owner: "CorporationOwner",
396
+ objs: list["DivisionsContext"],
356
397
  ) -> None:
357
398
  """Update or Create division entries from objs data."""
358
399
  for division in objs: # list (hanger, wallet)
@@ -363,7 +404,7 @@ class CorporationDivisionManagerBase(models.Manager):
363
404
  name = getattr(wallet, "name", _("Unknown"))
364
405
 
365
406
  obj, created = self.get_or_create(
366
- corporation=corporation,
407
+ corporation=owner,
367
408
  division_id=wallet.division,
368
409
  defaults={"balance": 0, "name": name},
369
410
  )
@@ -374,13 +415,13 @@ class CorporationDivisionManagerBase(models.Manager):
374
415
  @transaction.atomic()
375
416
  def _update_or_create_objs(
376
417
  self,
377
- corporation: "CorporationAudit",
378
- objs: list,
418
+ owner: "CorporationOwner",
419
+ objs: list["WalletsGetContext"],
379
420
  ) -> None:
380
421
  """Update or Create division entries from objs data."""
381
422
  for division in objs:
382
423
  obj, created = self.get_or_create(
383
- corporation=corporation,
424
+ corporation=owner,
384
425
  division_id=division.division,
385
426
  defaults={
386
427
  "balance": division.balance,
@@ -391,8 +432,3 @@ class CorporationDivisionManagerBase(models.Manager):
391
432
  if not created:
392
433
  obj.balance = division.balance
393
434
  obj.save()
394
-
395
-
396
- CorporationDivisionManager = CorporationDivisionManagerBase.from_queryset(
397
- CorporationDivisionQuerySet
398
- )
@@ -1,5 +1,5 @@
1
1
  # Standard Library
2
- from typing import Any
2
+ from typing import TYPE_CHECKING, Any
3
3
 
4
4
  # Django
5
5
  from django.db import models
@@ -8,18 +8,19 @@ from django.db import models
8
8
  from allianceauth.eveonline.providers import ObjectNotFound
9
9
  from allianceauth.services.hooks import get_extension_logger
10
10
 
11
- # Alliance Auth (External Libs)
12
- from app_utils.logging import LoggerAddTag
13
-
14
11
  # AA Ledger
15
12
  from ledger import __title__
16
13
  from ledger.app_settings import LEDGER_BULK_BATCH_SIZE
17
- from ledger.providers import esi
14
+ from ledger.providers import AppLogger, esi
15
+
16
+ logger = AppLogger(get_extension_logger(__name__), __title__)
18
17
 
19
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
18
+ if TYPE_CHECKING:
19
+ # AA Ledger
20
+ from ledger.models.general import EveEntity as EveEntityContext
20
21
 
21
22
 
22
- class EveEntityManager(models.Manager):
23
+ class EveEntityManager(models.Manager["EveEntityContext"]):
23
24
  def get_or_create_esi(self, *, eve_id: int) -> tuple[Any, bool]:
24
25
  """gets or creates entity object with data fetched from ESI"""
25
26
  # pylint: disable=import-outside-toplevel
@@ -0,0 +1,44 @@
1
+ # Generated by Django 4.2.26 on 2025-12-25 14:42
2
+
3
+ # Django
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("ledger", "0017_alter_eveentity_category_alter_eveentity_eve_id_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.RemoveIndex(
15
+ model_name="characterplanet",
16
+ name="ledger_char_planet__58a5b6_idx",
17
+ ),
18
+ migrations.RenameField(
19
+ model_name="characterplanet",
20
+ old_name="planet",
21
+ new_name="eve_planet",
22
+ ),
23
+ migrations.RenameField(
24
+ model_name="characterplanet",
25
+ old_name="planet_name",
26
+ new_name="name",
27
+ ),
28
+ migrations.RenameField(
29
+ model_name="corporationaudit",
30
+ old_name="corporation",
31
+ new_name="eve_corporation",
32
+ ),
33
+ migrations.AddIndex(
34
+ model_name="characterplanet",
35
+ index=models.Index(
36
+ fields=["eve_planet"], name="ledger_char_eve_pla_d4379e_idx"
37
+ ),
38
+ ),
39
+ migrations.RenameField(
40
+ model_name="characterplanetdetails",
41
+ old_name="facilitys",
42
+ new_name="factories",
43
+ ),
44
+ ]
@@ -0,0 +1,48 @@
1
+ # Generated by Django 4.2.26 on 2025-12-26 19:44
2
+
3
+ # Django
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("eveonline", "0017_alliance_and_corp_names_are_not_unique"),
11
+ (
12
+ "ledger",
13
+ "0018_remove_characterplanet_ledger_char_planet__58a5b6_idx_and_more",
14
+ ),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.RenameModel(
19
+ old_name="CharacterAudit",
20
+ new_name="CharacterOwner",
21
+ ),
22
+ migrations.RenameModel(
23
+ old_name="CorporationAudit",
24
+ new_name="CorporationOwner",
25
+ ),
26
+ migrations.RenameField(
27
+ model_name="characterupdatestatus",
28
+ old_name="character",
29
+ new_name="owner",
30
+ ),
31
+ migrations.RenameField(
32
+ model_name="corporationupdatestatus",
33
+ old_name="corporation",
34
+ new_name="owner",
35
+ ),
36
+ migrations.AddIndex(
37
+ model_name="characterwalletjournalentry",
38
+ index=models.Index(
39
+ fields=["character"], name="ledger_char_charact_fa27b8_idx"
40
+ ),
41
+ ),
42
+ migrations.AddIndex(
43
+ model_name="corporationwalletjournalentry",
44
+ index=models.Index(
45
+ fields=["division"], name="ledger_corp_divisio_6ef4ce_idx"
46
+ ),
47
+ ),
48
+ ]
ledger/models/__init__.py CHANGED
@@ -1,11 +1,5 @@
1
- from .characteraudit import (
2
- CharacterAudit,
3
- CharacterMiningLedger,
4
- CharacterWalletJournalEntry,
5
- )
6
- from .corporationaudit import (
7
- CorporationAudit,
8
- CorporationWalletDivision,
9
- CorporationWalletJournalEntry,
10
- )
11
- from .general import EveEntity, General
1
+ # flake8: noqa
2
+ from .characteraudit import *
3
+ from .corporationaudit import *
4
+ from .general import *
5
+ from .planetary import *