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,427 +0,0 @@
1
- """PvE Views"""
2
-
3
- # Standard Library
4
- from decimal import Decimal
5
- from typing import Any
6
-
7
- # Django
8
- from django.db.models import DecimalField, Q, QuerySet, Sum
9
- from django.utils.translation import gettext as _
10
-
11
- # Alliance Auth
12
- from allianceauth.eveonline.models import EveCharacter
13
- from allianceauth.services.hooks import get_extension_logger
14
-
15
- # Alliance Auth (External Libs)
16
- from app_utils.logging import LoggerAddTag
17
-
18
- # AA Ledger
19
- from ledger import __title__
20
- from ledger.constants import NPC_ENTITIES
21
- from ledger.helpers.billboard import BillboardSystem
22
- from ledger.helpers.core import LedgerCore, LedgerEntity
23
- from ledger.helpers.ref_type import RefTypeManager
24
- from ledger.models.corporationaudit import (
25
- CorporationAudit,
26
- CorporationWalletDivision,
27
- CorporationWalletJournalEntry,
28
- )
29
-
30
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
31
-
32
-
33
- class CorporationData(LedgerCore):
34
- """Class to hold character data for the ledger."""
35
-
36
- # pylint: disable=too-many-positional-arguments
37
- def __init__(
38
- self,
39
- corporation: CorporationAudit,
40
- division_id: int = None,
41
- year: int = None,
42
- month: int = None,
43
- day: int = None,
44
- section: str = None,
45
- ):
46
- super().__init__(year, month, day)
47
- self.corporation = corporation
48
- self.entity_id = corporation.corporation.corporation_id
49
- self.division_id = division_id
50
- self.section = section
51
- self.auth_char_ids = self.auth_character_ids
52
- self.billboard = BillboardSystem()
53
- self.queryset = (
54
- self._get_journal_queryset()
55
- ) # Prepare Queryset and auxiliary data
56
-
57
- @property
58
- def has_data(self) -> bool:
59
- """Return True if there is data for the corporation in the selected date range."""
60
- return self.queryset.exists()
61
-
62
- @property
63
- def activity_years(self) -> list[int]:
64
- """Return a list of years with data for the corporation."""
65
- return (
66
- CorporationWalletJournalEntry.objects.filter(
67
- division__corporation=self.corporation
68
- )
69
- .values_list("date__year", flat=True)
70
- .distinct()
71
- .order_by("-date__year")
72
- )
73
-
74
- @property
75
- def divisions(self) -> QuerySet:
76
- """Return a list of divisions for the corporation."""
77
- return CorporationWalletDivision.objects.filter(
78
- corporation=self.corporation
79
- ).order_by("division_id")
80
-
81
- def _get_journal_queryset(self) -> QuerySet[CorporationWalletJournalEntry]:
82
- """Return the base queryset filtered by the current date range and corporation division."""
83
- if self.division_id is not None:
84
- return CorporationWalletJournalEntry.objects.filter(
85
- self.filter_date,
86
- division__corporation=self.corporation,
87
- division=self.division_id,
88
- ).exclude(
89
- first_party_id=self.corporation.corporation.corporation_id,
90
- second_party_id=self.corporation.corporation.corporation_id,
91
- )
92
- return CorporationWalletJournalEntry.objects.filter(
93
- self.filter_date,
94
- division__corporation=self.corporation,
95
- ).exclude(
96
- first_party_id=self.corporation.corporation.corporation_id,
97
- second_party_id=self.corporation.corporation.corporation_id,
98
- )
99
-
100
- def _compute_entities(
101
- self, journal: QuerySet[CorporationWalletJournalEntry]
102
- ) -> set:
103
- """Return a set of all entity IDs (first and second parties) present in the current journal."""
104
- return set(journal.values_list("second_party_id", flat=True)) | set(
105
- journal.values_list("first_party_id", flat=True)
106
- )
107
-
108
- # pylint: disable=duplicate-code
109
- def _compute_journal_values(
110
- self, journal: QuerySet[CorporationWalletJournalEntry]
111
- ) -> QuerySet[dict[str, Any]]:
112
- """Return the journal values for the current journal."""
113
- return journal.values(
114
- "first_party_id", "second_party_id", "pk", "ref_type"
115
- ).annotate(
116
- bounty=Sum(
117
- "amount",
118
- filter=Q(ref_type__in=RefTypeManager.BOUNTY_PRIZES),
119
- output_field=DecimalField(),
120
- ),
121
- ess=Sum(
122
- "amount",
123
- filter=Q(ref_type__in=RefTypeManager.ESS_TRANSFER),
124
- output_field=DecimalField(),
125
- ),
126
- costs=Sum(
127
- "amount",
128
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__lt=0),
129
- output_field=DecimalField(),
130
- ),
131
- miscellaneous=Sum(
132
- "amount",
133
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__gt=0),
134
- output_field=DecimalField(),
135
- ),
136
- )
137
-
138
- def create_entity_data(
139
- self,
140
- entity: LedgerEntity,
141
- alts: EveCharacter = None,
142
- ) -> dict:
143
- """Create the URL for entity details based on the view type."""
144
- ids = (
145
- list(alts.values_list("character__character_id", flat=True))
146
- if alts is not None
147
- else [entity.entity_id]
148
- )
149
-
150
- # Create Alts Dictionary
151
- alts_dict = {}
152
- if alts is not None:
153
- for alt in alts:
154
- alts_dict[alt.character.character_id] = alt.character.character_name
155
-
156
- # Remove the main character from the alts dictionary only one entry
157
- if len(alts_dict) == 1:
158
- alts_dict.pop(entity.entity_id, None)
159
-
160
- used_pks = set()
161
- bounty = Decimal(0)
162
- ess = Decimal(0)
163
- miscellaneous = Decimal(0)
164
- costs = Decimal(0)
165
-
166
- for pk, rows in list(self.entries.items()):
167
- for row in rows:
168
- if row["first_party_id"] in ids or row["second_party_id"] in ids:
169
- if RefTypeManager.special_cases(
170
- row, ids=ids, account_char_ids=self.auth_char_ids
171
- ):
172
- continue
173
- bounty += row.get("bounty") or Decimal(0)
174
- ess += row.get("ess") or Decimal(0)
175
- miscellaneous += row.get("miscellaneous") or Decimal(0)
176
- costs += row.get("costs") or Decimal(0)
177
- used_pks.add(pk)
178
-
179
- # Remove Used Pks from Entries
180
- # This is to prevent the entries from being used in the future
181
- for pk in used_pks:
182
- self.entries.pop(pk, None)
183
-
184
- total = sum([bounty, ess, miscellaneous, costs])
185
-
186
- if total == 0:
187
- return None
188
-
189
- char_data = {
190
- "entity": entity,
191
- "alts": alts_dict,
192
- "ledger": {
193
- "bounty": bounty,
194
- "ess": ess,
195
- "miscellaneous": miscellaneous,
196
- "costs": costs,
197
- "total": total,
198
- },
199
- "type": entity.type,
200
- }
201
-
202
- return char_data
203
-
204
- def generate_ledger_data(self) -> dict:
205
- """
206
- Generate the ledger data for the corporation.
207
-
208
- This method processes the journal entries, builds the ledger data,
209
- and prepares the context for rendering the corporation ledger view.
210
- """
211
- # Compute all entities in the journal
212
- self.entities = self._compute_entities(self.queryset)
213
- # Compute journal values
214
- journal = self._compute_journal_values(self.queryset)
215
-
216
- # Caching
217
- ledger_hash = self.get_ledger_journal_hash(journal.values_list("pk"))
218
- cache_key = f"{self.corporation.corporation.corporation_id}_{self.division_id}"
219
-
220
- # Get Cached Data if available
221
- ledger, finished_entities = self.get_cache_ledger(
222
- ledger_hash=ledger_hash, cache_key=cache_key
223
- )
224
-
225
- if finished_entities is False or ledger is False:
226
- # Build the entries from the journal
227
- self.entries = {}
228
- for row in journal:
229
- self.entries.setdefault(row["pk"], []).append(row)
230
-
231
- # Process Auth Accounts first
232
- ledger, finished_entities = self._process_auth_accounts()
233
- # Process remaining entities
234
- ledger, finished_entities = self._process_remaining_entities(
235
- ledger, finished_entities
236
- )
237
- # Process corporation entity last to ensure it's always included
238
- self._handle_entity(
239
- ledger=ledger,
240
- entity_id=self.corporation.corporation.corporation_id,
241
- corporation_obj=self.corporation.corporation,
242
- )
243
-
244
- # Create Cache
245
- self.set_cache_ledger(
246
- ledger_hash=ledger_hash,
247
- cache_key=cache_key,
248
- ledger=ledger,
249
- finished_entities=finished_entities,
250
- )
251
-
252
- # Finalize the billboard for the ledger.
253
- self.billboard.change_view(self.get_view_mode())
254
- self.create_rattingbar(journal=journal, entities_ids=list(finished_entities))
255
- self.create_chord(ledger)
256
- return ledger
257
-
258
- def generate_data_export(self) -> dict:
259
- """Generate the data export for the corporation."""
260
- # Compute all entities in the journal
261
- self.entities = self._compute_entities(self.queryset)
262
- # Compute journal values
263
- journal = self._compute_journal_values(self.queryset)
264
-
265
- # Build the entries from the journal
266
- self.entries = {}
267
- for row in journal:
268
- self.entries.setdefault(row["pk"], []).append(row)
269
-
270
- # Process Auth Accounts first
271
- ledger, finished_entities = self._process_auth_accounts()
272
- # Process remaining entities
273
- ledger, finished_entities = self._process_remaining_entities(
274
- ledger, finished_entities
275
- )
276
- # Process corporation entity last to ensure it's always included
277
- self._handle_entity(
278
- ledger=ledger,
279
- entity_id=self.corporation.corporation.corporation_id,
280
- corporation_obj=self.corporation.corporation,
281
- )
282
- return ledger
283
-
284
- # pylint: disable=too-many-arguments
285
- def _handle_entity(
286
- self,
287
- ledger: list,
288
- entity_id: int,
289
- character_obj=None,
290
- corporation_obj=None,
291
- alts=None,
292
- add_finished: bool = True,
293
- finished_ids=None,
294
- ) -> set:
295
- """Create entity object, add to ledger if it has data and return IDs to mark finished.
296
-
297
- - ledger: list to append to
298
- - entity_id: numeric id
299
- - character_obj / corporation_obj: optional objects to attach to LedgerEntity
300
- - alts: optional alts queryset passed to create_entity_data
301
- - add_finished: whether to return ids that should be added to finished_entities
302
- - finished_ids: explicit IDs (set or iterable) to mark finished (used for accounts)
303
- """
304
- details_url = self.create_url(
305
- viewname="corporation_details",
306
- corporation_id=self.corporation.corporation.corporation_id,
307
- entity_id=entity_id,
308
- section="single",
309
- )
310
- entity_obj = LedgerEntity(
311
- entity_id,
312
- character_obj=character_obj,
313
- corporation_obj=corporation_obj,
314
- details_url=details_url,
315
- )
316
-
317
- # Create the character data for the ledger
318
- char_data = self.create_entity_data(entity=entity_obj, alts=alts)
319
-
320
- # Only add to ledger if there is data
321
- if char_data is None:
322
- return set()
323
-
324
- ledger.append(char_data)
325
-
326
- if not add_finished:
327
- return set()
328
-
329
- if finished_ids is not None:
330
- return set(finished_ids)
331
-
332
- return {entity_id}
333
-
334
- def _process_auth_accounts(self):
335
- """Process Auth Account information for the ledger."""
336
- ledger = []
337
- finished_entities = set()
338
- for account in self.auth_accounts:
339
- alts = account.user.character_ownerships.all()
340
- existing_alts = set(
341
- alts.values_list("character__character_id", flat=True)
342
- ).intersection(self.entities)
343
- alts = alts.filter(character__character_id__in=existing_alts)
344
- if not existing_alts:
345
- continue
346
- finished_entities.update(
347
- self._handle_entity(
348
- ledger,
349
- account.main_character.character_id,
350
- character_obj=account.main_character,
351
- alts=alts,
352
- finished_ids=existing_alts,
353
- )
354
- )
355
- return ledger, finished_entities
356
-
357
- def _process_remaining_entities(self, ledger, finished_entities: set):
358
- """Process remaining entities for the ledger."""
359
- remaining_entities = self.entities - finished_entities
360
-
361
- # If no remaining entities, return finished_entities
362
- if not remaining_entities:
363
- return ledger, finished_entities
364
-
365
- for entity_id in remaining_entities:
366
- if entity_id in NPC_ENTITIES:
367
- continue
368
- if entity_id == self.corporation.corporation.corporation_id:
369
- continue
370
- finished_entities.update(self._handle_entity(ledger, entity_id))
371
- return ledger, finished_entities
372
-
373
- def create_rattingbar(
374
- self,
375
- journal: QuerySet[CorporationWalletJournalEntry],
376
- entities_ids: list = None,
377
- ):
378
- """Create the ratting bar for the view."""
379
- if not entities_ids:
380
- return
381
-
382
- # Create the timeline for the ratting bar
383
- rattingbar_timeline = self.billboard.create_timeline(journal)
384
- # Annotate the timeline with the relevant data
385
- rattingbar = (
386
- rattingbar_timeline.annotate_bounty_income()
387
- .annotate_ess_income()
388
- .annotate_miscellaneous()
389
- )
390
- # Generate the XY series for the ratting bar
391
- self.billboard.create_or_update_results(rattingbar)
392
- series, categories = self.billboard.generate_xy_series()
393
- if series and categories:
394
- # Create the ratting bar chart
395
- self.billboard.create_xy_chart(
396
- title=_("Ratting Bar"), categories=categories, series=series
397
- )
398
-
399
- def create_chord(self, ledger_data: list[dict]):
400
- """Create the chord chart for the view."""
401
- if not ledger_data:
402
- return
403
-
404
- for entry in ledger_data:
405
- entity_name = entry["entity"].entity_name
406
- ledger = entry["ledger"]
407
- self.billboard.chord_add_data(
408
- chord_from=entity_name,
409
- chord_to=_("Bounty (Wallet)"),
410
- value=ledger.get("bounty", 0),
411
- )
412
- self.billboard.chord_add_data(
413
- chord_from=entity_name,
414
- chord_to=_("ESS (Wallet)"),
415
- value=ledger.get("ess", 0),
416
- )
417
- self.billboard.chord_add_data(
418
- chord_from=entity_name,
419
- chord_to=_("Costs (Wallet)"),
420
- value=abs(ledger.get("costs", 0)),
421
- )
422
- self.billboard.chord_add_data(
423
- chord_from=entity_name,
424
- chord_to=_("Miscellaneous (Wallet)"),
425
- value=abs(ledger.get("miscellaneous", 0)),
426
- )
427
- self.billboard.chord_handle_overflow()