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