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,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()