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,317 +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.core.handlers.wsgi import WSGIRequest
9
- from django.db.models import DecimalField, F, Q, QuerySet, Sum
10
- from django.utils.translation import gettext as _
11
-
12
- # Alliance Auth
13
- from allianceauth.eveonline.models import EveAllianceInfo
14
- from allianceauth.services.hooks import get_extension_logger
15
-
16
- # Alliance Auth (External Libs)
17
- from app_utils.logging import LoggerAddTag
18
-
19
- # AA Ledger
20
- from ledger import __title__
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
- CorporationWalletJournalEntry,
27
- )
28
-
29
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
30
-
31
-
32
- class AllianceData(LedgerCore):
33
- """Class to hold alliance data for the ledger."""
34
-
35
- # pylint: disable=too-many-positional-arguments
36
- def __init__(
37
- self,
38
- alliance: EveAllianceInfo,
39
- request: WSGIRequest = None,
40
- year=None,
41
- month=None,
42
- day=None,
43
- section=None,
44
- ):
45
- super().__init__(year, month, day)
46
- self.request = request
47
- self.alliance = alliance
48
- self.entity_id = self.alliance.alliance_id
49
- self.section = section
50
- self.corporations = CorporationAudit.objects.filter(
51
- corporation__alliance__alliance_id=self.alliance.alliance_id
52
- ).values_list("corporation__corporation_id", flat=True)
53
- self.auth_char_ids = self.auth_character_ids
54
- self.billboard = BillboardSystem()
55
- self.queryset = (
56
- self._get_journal_queryset()
57
- ) # Base queryset filtered by date and alliance
58
-
59
- def _get_journal_queryset(self) -> QuerySet[CorporationWalletJournalEntry]:
60
- """Return the base queryset filtered by the current date range and corporation division."""
61
- return CorporationWalletJournalEntry.objects.filter(
62
- self.filter_date,
63
- division__corporation__corporation__alliance__alliance_id=self.alliance.alliance_id,
64
- ).exclude(
65
- Q(ref_type="corporation_account_withdrawal")
66
- & Q(first_party_id=F("second_party_id"))
67
- )
68
-
69
- def _compute_entities(
70
- self, journal: QuerySet[CorporationWalletJournalEntry]
71
- ) -> set:
72
- """Return a set of all entity IDs (first and second parties) present in the current journal."""
73
- return set(journal.values_list("second_party_id", flat=True)) | set(
74
- journal.values_list("first_party_id", flat=True)
75
- )
76
-
77
- def _compute_journal_values(
78
- self, journal: QuerySet[CorporationWalletJournalEntry]
79
- ) -> QuerySet[dict[str, Any]]:
80
- """Return the journal values for the current journal."""
81
- return journal.values(
82
- "first_party_id",
83
- "second_party_id",
84
- "pk",
85
- "ref_type",
86
- "division__corporation__corporation__corporation_id",
87
- ).annotate(
88
- bounty=Sum(
89
- "amount",
90
- filter=Q(ref_type__in=RefTypeManager.BOUNTY_PRIZES),
91
- output_field=DecimalField(),
92
- ),
93
- ess=Sum(
94
- "amount",
95
- filter=Q(ref_type__in=RefTypeManager.ESS_TRANSFER),
96
- output_field=DecimalField(),
97
- ),
98
- costs=Sum(
99
- "amount",
100
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__lt=0),
101
- output_field=DecimalField(),
102
- ),
103
- miscellaneous=Sum(
104
- "amount",
105
- filter=Q(ref_type__in=RefTypeManager.all_ref_types(), amount__gt=0),
106
- output_field=DecimalField(),
107
- ),
108
- )
109
-
110
- # pylint: disable=duplicate-code
111
- def create_entity_data(
112
- self,
113
- entity: LedgerEntity,
114
- ) -> dict:
115
- """Create the URL for entity details based on the view type."""
116
- used_pks = set()
117
- bounty = Decimal(0)
118
- ess = Decimal(0)
119
- miscellaneous = Decimal(0)
120
- costs = Decimal(0)
121
-
122
- for pk, rows in list(self.entries.items()):
123
- for row in rows:
124
- if (
125
- row["division__corporation__corporation__corporation_id"]
126
- == entity.entity_id
127
- ):
128
- if RefTypeManager.special_cases(
129
- row, ids=[], account_char_ids=self.auth_char_ids
130
- ):
131
- continue
132
- bounty += row.get("bounty") or Decimal(0)
133
- ess += row.get("ess") or Decimal(0)
134
- miscellaneous += row.get("miscellaneous") or Decimal(0)
135
- costs += row.get("costs") or Decimal(0)
136
- used_pks.add(pk)
137
-
138
- # Remove Used Pks from Entries
139
- # This is to prevent the entries from being used in the future
140
- for pk in used_pks:
141
- self.entries.pop(pk, None)
142
-
143
- misc = miscellaneous
144
- total = sum([bounty, ess, miscellaneous, costs])
145
-
146
- if total == 0:
147
- return None
148
-
149
- entity_ledger_info = {
150
- "entity": entity,
151
- "ledger": {
152
- "bounty": bounty,
153
- "ess": ess,
154
- "miscellaneous": misc,
155
- "costs": costs,
156
- "total": total,
157
- },
158
- "type": entity.type,
159
- }
160
-
161
- return entity_ledger_info
162
-
163
- # pylint: disable=duplicate-code
164
- def generate_ledger_data(self) -> dict:
165
- """Generate the ledger data for the alliance."""
166
- # Compute all entities in the journal
167
- self.entities = self._compute_entities(self.queryset)
168
- # Compute journal values
169
- journal = self._compute_journal_values(self.queryset)
170
-
171
- # Caching
172
- ledger_hash = self.get_ledger_journal_hash(journal.values_list("pk"))
173
- cache_key = f"{self.entity_id}"
174
-
175
- # Get Cached Data if available
176
- ledger, finished_entities = self.get_cache_ledger(
177
- ledger_hash=ledger_hash, cache_key=cache_key
178
- )
179
-
180
- if finished_entities is False or ledger is False:
181
- ledger = []
182
- finished_entities = set()
183
-
184
- # Build the entries from the journal
185
- self.entries = {}
186
- for row in journal:
187
- self.entries.setdefault(row["pk"], []).append(row)
188
-
189
- # Build Data for each corporation
190
- for corporation_id in self.corporations:
191
- # Create Details URL for the entity
192
- details_url = self.create_url(
193
- viewname="corporation_details",
194
- corporation_id=corporation_id,
195
- entity_id=corporation_id,
196
- section="summary",
197
- )
198
-
199
- # Create the LedgerEntity object for the entity
200
- entity_obj = LedgerEntity(
201
- entity_id=corporation_id,
202
- details_url=details_url,
203
- )
204
-
205
- corp_data = self.create_entity_data(
206
- entity=entity_obj,
207
- )
208
-
209
- if corp_data is None:
210
- continue
211
-
212
- ledger.append(corp_data)
213
- finished_entities.add(corporation_id)
214
-
215
- # Create Cache
216
- self.set_cache_ledger(
217
- ledger_hash=ledger_hash,
218
- cache_key=cache_key,
219
- ledger=ledger,
220
- finished_entities=finished_entities,
221
- )
222
-
223
- # Create the billboard data
224
- self.billboard.change_view(self.get_view_mode())
225
- self.create_rattingbar(journal=journal, entities_ids=list(finished_entities))
226
- self.create_chord(ledger)
227
- return ledger
228
-
229
- def generate_data_export(self) -> dict:
230
- """Generate the data export for the corporation."""
231
- # Compute all entities in the journal
232
- self.entities = self._compute_entities(self.queryset)
233
- # Compute journal values
234
- journal = self._compute_journal_values(self.queryset)
235
-
236
- ledger = []
237
-
238
- # Build the entries from the journal
239
- self.entries = {}
240
- for row in journal:
241
- self.entries.setdefault(row["pk"], []).append(row)
242
-
243
- # Build Data for each corporation
244
- for corporation_id in self.corporations:
245
- # Create the LedgerEntity object for the entity
246
- entity_obj = LedgerEntity(
247
- entity_id=corporation_id,
248
- )
249
-
250
- # Create Ledger Data for the entity
251
- corp_data = self.create_entity_data(
252
- entity=entity_obj,
253
- )
254
-
255
- if corp_data is None:
256
- continue
257
-
258
- ledger.append(corp_data)
259
- return ledger
260
-
261
- def create_rattingbar(
262
- self,
263
- journal: QuerySet[CorporationWalletJournalEntry],
264
- entities_ids: list = None,
265
- ):
266
- """Create the ratting bar for the view."""
267
- if not entities_ids:
268
- return
269
-
270
- # Create the timeline for the ratting bar
271
- rattingbar_timeline = self.billboard.create_timeline(journal)
272
-
273
- # Annotate the timeline with the relevant data
274
- rattingbar = (
275
- rattingbar_timeline.annotate_bounty_income()
276
- .annotate_ess_income()
277
- .annotate_miscellaneous()
278
- )
279
-
280
- # Generate the XY series for the ratting bar
281
- self.billboard.create_or_update_results(rattingbar)
282
- series, categories = self.billboard.generate_xy_series()
283
- if series and categories:
284
- # Create the ratting bar chart
285
- self.billboard.create_xy_chart(
286
- title=_("Ratting Bar"), categories=categories, series=series
287
- )
288
-
289
- def create_chord(self, ledger_data: list[dict]):
290
- """Create the chord chart for the view."""
291
- if not ledger_data:
292
- return
293
-
294
- for entry in ledger_data:
295
- entity_name = entry["entity"].entity_name
296
- ledger = entry["ledger"]
297
- self.billboard.chord_add_data(
298
- chord_from=entity_name,
299
- chord_to=_("Bounty (Wallet)"),
300
- value=ledger.get("bounty", 0),
301
- )
302
- self.billboard.chord_add_data(
303
- chord_from=entity_name,
304
- chord_to=_("ESS (Wallet)"),
305
- value=ledger.get("ess", 0),
306
- )
307
- self.billboard.chord_add_data(
308
- chord_from=entity_name,
309
- chord_to=_("Costs (Wallet)"),
310
- value=abs(ledger.get("costs", 0)),
311
- )
312
- self.billboard.chord_add_data(
313
- chord_from=entity_name,
314
- chord_to=_("Miscellaneous (Wallet)"),
315
- value=abs(ledger.get("miscellaneous", 0)),
316
- )
317
- self.billboard.chord_handle_overflow()
@@ -1,251 +0,0 @@
1
- """PvE Views"""
2
-
3
- # Standard Library
4
- from decimal import Decimal
5
-
6
- # Django
7
- from django.core.handlers.wsgi import WSGIRequest
8
- from django.db.models import QuerySet
9
- from django.utils.translation import gettext as _
10
-
11
- # Alliance Auth
12
- from allianceauth.services.hooks import get_extension_logger
13
-
14
- # Alliance Auth (External Libs)
15
- from app_utils.logging import LoggerAddTag
16
-
17
- # AA Ledger
18
- from ledger import __title__
19
- from ledger.helpers.billboard import BillboardSystem
20
- from ledger.helpers.core import LedgerCore
21
- from ledger.models.characteraudit import (
22
- CharacterAudit,
23
- CharacterMiningLedger,
24
- CharacterWalletJournalEntry,
25
- )
26
-
27
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
28
-
29
-
30
- class CharacterData(LedgerCore):
31
- """Class to hold character data for the ledger."""
32
-
33
- # pylint: disable=too-many-positional-arguments
34
- def __init__(
35
- self,
36
- request: WSGIRequest,
37
- character: CharacterAudit,
38
- year=None,
39
- month=None,
40
- day=None,
41
- section=None,
42
- ):
43
- super().__init__(year, month, day)
44
- self.request = request
45
- self.character = character
46
- self.alts_ids = self.get_alt_ids
47
- self.characters = CharacterAudit.objects.filter(
48
- eve_character__character_id__in=self.alts_ids
49
- ).select_related("eve_character")
50
- self.section = section
51
- self.billboard = BillboardSystem()
52
- self.queryset = character.ledger_character_journal.filter(self.filter_date)
53
- self.mining = character.ledger_character_mining.filter(self.filter_date)
54
-
55
- @property
56
- def get_alt_ids(self):
57
- return self.character.alts.values_list("character_id", flat=True)
58
-
59
- @property
60
- def is_old_ess(self):
61
- """
62
- Compatibility check for old ESS income calculation.
63
- Since Swagger ESI has added ESS Ref Type to the Character Journal Endpoint
64
- """
65
- try:
66
- if self.month is None and self.year is None:
67
- return False
68
- if self.year >= 2025 and self.month >= 6:
69
- return False
70
- except TypeError:
71
- return True
72
- return True
73
-
74
- def filter_character_journal(
75
- self, character: CharacterAudit
76
- ) -> tuple[QuerySet[CharacterWalletJournalEntry], QuerySet[CharacterMiningLedger]]:
77
- """Filter the journal entries for the character and its alts."""
78
- if self.section == "summary":
79
- journal = CharacterWalletJournalEntry.objects.filter(
80
- self.filter_date,
81
- character__eve_character__character_id__in=self.alts_ids,
82
- )
83
- mining = CharacterMiningLedger.objects.filter(
84
- self.filter_date,
85
- character__eve_character__character_id__in=self.alts_ids,
86
- )
87
- return journal, mining
88
- # Get Journal Entries for the Character
89
- journal = character.ledger_character_journal.filter(self.filter_date)
90
- mining = character.ledger_character_mining.filter(self.filter_date)
91
- return journal, mining
92
-
93
- def generate_ledger_data(self) -> dict:
94
- """Generate the ledger data for the character and its alts."""
95
- # Only show the character if 'single' is set in the request
96
- if self.section == "single":
97
- self.ledger_type = "single"
98
- characters = CharacterAudit.objects.filter(
99
- eve_character=self.character.eve_character
100
- ).select_related("eve_character")
101
- character_data = self._create_character_data(character=self.character)
102
- ledger = character_data
103
- else:
104
- ledger = []
105
- characters = self.characters
106
- for character in self.characters:
107
- character_data = self._create_character_data(character=character)
108
- if character_data:
109
- ledger.append(character_data)
110
-
111
- # Billboard
112
- self.billboard.change_view(self.get_view_mode())
113
- # Create the ratting bar for the view
114
- self.create_rattingbar(
115
- is_old_ess=self.is_old_ess,
116
- character_ids=characters.values_list(
117
- "eve_character__character_id", flat=True
118
- ),
119
- )
120
- return ledger
121
-
122
- def _create_character_data(
123
- self,
124
- character: CharacterAudit,
125
- ):
126
- """Create a dictionary with character data and update billboard/ledger."""
127
- journal, mining = self.filter_character_journal(character)
128
-
129
- # If no journal or mining data exists, return None
130
- if not journal.exists() and not mining.exists():
131
- return None
132
-
133
- bounty = journal.aggregate_bounty()
134
- ess = (
135
- journal.aggregate_bounty() * Decimal(0.667)
136
- if self.is_old_ess
137
- else journal.aggregate_ess()
138
- )
139
- mining_val = mining.aggregate_mining()
140
- costs = journal.aggregate_costs(second_party=self.alts_ids)
141
- miscellaneous = journal.aggregate_miscellaneous(first_party=self.alts_ids)
142
-
143
- total = sum(
144
- [
145
- bounty,
146
- ess,
147
- costs,
148
- miscellaneous,
149
- ]
150
- )
151
-
152
- # If total is 0, we do not need to create a character data entry
153
- if int(total) + int(mining_val) == 0:
154
- return None
155
-
156
- update_states = {}
157
-
158
- for status in character.ledger_update_status.all():
159
- update_states[status.section] = {
160
- "is_success": status.is_success,
161
- "last_update_finished_at": status.last_update_finished_at,
162
- "last_run_finished_at": status.last_run_finished_at,
163
- }
164
-
165
- char_data = {
166
- "character": character,
167
- "ledger": {
168
- "bounty": bounty,
169
- "ess": ess,
170
- "mining": mining_val,
171
- "costs": costs,
172
- "miscellaneous": miscellaneous,
173
- "total": total,
174
- },
175
- "update_states": update_states,
176
- "single_url": self.create_url(
177
- viewname="character_ledger",
178
- character_id=character.eve_character.character_id,
179
- section="single",
180
- ),
181
- "details_url": self.create_url(
182
- viewname="character_details",
183
- character_id=character.eve_character.character_id,
184
- section="single",
185
- ),
186
- }
187
- self.billboard.change_view(self.get_view_mode())
188
- # Create the chord data for the billboard
189
- self.billboard.chord_add_data(
190
- chord_from=character.eve_character.character_name,
191
- chord_to=_("Bounty"),
192
- value=bounty,
193
- )
194
- self.billboard.chord_add_data(
195
- chord_from=character.eve_character.character_name,
196
- chord_to=_("ESS"),
197
- value=ess,
198
- )
199
- self.billboard.chord_add_data(
200
- chord_from=character.eve_character.character_name,
201
- chord_to=_("Mining"),
202
- value=mining_val,
203
- )
204
- self.billboard.chord_add_data(
205
- chord_from=character.eve_character.character_name,
206
- chord_to=_("Miscellaneous"),
207
- value=miscellaneous,
208
- )
209
- self.billboard.chord_add_data(
210
- chord_from=character.eve_character.character_name,
211
- chord_to=_("Costs"),
212
- value=abs(costs),
213
- )
214
-
215
- return char_data
216
-
217
- def create_rattingbar(self, character_ids: list = None, is_old_ess: bool = False):
218
- """Create the ratting bar for the view."""
219
- if not character_ids:
220
- return
221
-
222
- # Create the timeline for the ratting bar
223
- rattingbar_timeline = self.billboard.create_timeline(
224
- CharacterWalletJournalEntry.objects.filter(
225
- self.filter_date,
226
- character__eve_character__character_id__in=character_ids,
227
- )
228
- )
229
- rattingbar_mining_timeline = self.billboard.create_timeline(
230
- CharacterMiningLedger.objects.filter(
231
- self.filter_date,
232
- character__eve_character__character_id__in=character_ids,
233
- )
234
- )
235
- # Annotate the timeline with the relevant data
236
- rattingbar = (
237
- rattingbar_timeline.annotate_bounty_income()
238
- .annotate_ess_income()
239
- .annotate_miscellaneous_exclude_donations(exclude=self.alts_ids)
240
- )
241
- rattingbar_mining = rattingbar_mining_timeline.annotate_mining(with_period=True)
242
-
243
- # Generate the XY series for the ratting bar
244
- self.billboard.create_or_update_results(rattingbar, is_old_ess=is_old_ess)
245
- self.billboard.add_category(rattingbar_mining, category="mining")
246
- series, categories = self.billboard.generate_xy_series()
247
- if series and categories:
248
- # Create the ratting bar chart
249
- self.billboard.create_xy_chart(
250
- title=_("Ratting Bar"), categories=categories, series=series
251
- )