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,15 +1,16 @@
1
1
  """PvE Views"""
2
2
 
3
3
  # Standard Library
4
- import json
5
4
  from http import HTTPStatus
6
5
 
7
6
  # Django
8
7
  from django.contrib import messages
9
8
  from django.contrib.auth.decorators import login_required, permission_required
10
9
  from django.core.handlers.wsgi import WSGIRequest
11
- from django.http import FileResponse, Http404, JsonResponse
10
+ from django.http import JsonResponse
12
11
  from django.shortcuts import redirect, render
12
+ from django.urls import reverse
13
+ from django.utils import timezone
13
14
  from django.utils.translation import gettext_lazy as _
14
15
  from django.views.decorators.http import require_POST
15
16
 
@@ -17,200 +18,20 @@ from django.views.decorators.http import require_POST
17
18
  from allianceauth.authentication.models import CharacterOwnership
18
19
  from allianceauth.services.hooks import get_extension_logger
19
20
 
20
- # Alliance Auth (External Libs)
21
- from app_utils.logging import LoggerAddTag
22
-
23
21
  # AA Ledger
24
- from ledger import __title__, forms, tasks
25
- from ledger.api.helpers import (
26
- get_corporation,
22
+ from ledger import __title__, forms
23
+ from ledger.api.helpers.core import (
24
+ get_corporationowner_or_none,
27
25
  get_manage_corporation,
28
26
  )
29
- from ledger.helpers import data_exporter
30
- from ledger.helpers.core import add_info_to_context
31
- from ledger.helpers.corporation import CorporationData, LedgerEntity
32
27
  from ledger.models.corporationaudit import (
33
- CorporationAudit,
28
+ CorporationOwner,
34
29
  )
30
+ from ledger.providers import AppLogger
35
31
 
36
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
37
-
38
-
39
- @login_required
40
- @permission_required("ledger.advanced_access")
41
- def corporation_ledger_index(request):
42
- """Corporation Ledger Index View"""
43
- context = {}
44
- context = add_info_to_context(request, context)
45
- return redirect(
46
- "ledger:corporation_ledger", request.user.profile.main_character.corporation_id
47
- )
48
-
49
-
50
- @login_required
51
- @permission_required("ledger.basic_access")
52
- def corporation_data_export(request, corporation_id: int):
53
- """Data Export View"""
54
- perms = get_corporation(request, corporation_id)[0]
55
-
56
- corporation_exporter = data_exporter.LedgerCSVExporter.create_exporter(
57
- "corporation", corporation_id
58
- )
59
- files = corporation_exporter.gather_export_files()
60
-
61
- context = {
62
- "title": "Data Export",
63
- "corporation_id": corporation_id,
64
- "files": files,
65
- "is_exportable": corporation_exporter.has_data,
66
- }
67
-
68
- if perms is False:
69
- msg = _("Permission Denied")
70
- messages.error(request, msg)
71
- return render(request, "ledger/data-export.html", context=context)
72
-
73
- if perms is None:
74
- msg = _("Corporation not found")
75
- messages.info(request, msg)
76
- return render(request, "ledger/data-export.html", context=context)
77
-
78
- context.update(
79
- {
80
- "forms": {
81
- "generate_data_export": forms.GenerateDataExportForm(
82
- corporation_id=corporation_id
83
- ),
84
- },
85
- }
86
- )
87
-
88
- context = add_info_to_context(request, context)
89
- return render(request, "ledger/data-export.html", context)
90
-
91
-
92
- @login_required
93
- @permission_required("ledger.manage_access")
94
- # pylint: disable=unused-argument
95
- def corporation_download_export_file(
96
- request,
97
- hash_code: str,
98
- ) -> FileResponse:
99
- """Render file view for downloading an export file."""
100
- entity_id, division_id, year, month = data_exporter.LedgerCSVExporter.decoder(
101
- hash_code
102
- )
103
- exporter = data_exporter.LedgerCSVExporter.create_exporter(
104
- "corporation", entity_id, division_id=division_id, year=year, month=month
105
- )
106
- destination = data_exporter.default_destination()
107
- zip_file = destination / exporter.output_basename.with_suffix(".zip")
108
- if not zip_file.exists():
109
- raise Http404(f"Could not find export file for corporation {entity_id}")
110
- logger.info("Returning file %s for download of topic %s", zip_file, "corporation")
111
- return FileResponse(zip_file.open("rb"))
112
-
113
-
114
- @login_required
115
- @permission_required("ledger.manage_access")
116
- @require_POST
117
- def corporation_data_export_generate(request, corporation_id: int):
118
- """Handle POST form to generate a data export for a corporation."""
119
- perms = get_corporation(request, corporation_id)[0]
120
- if perms is False:
121
- msg = _("Permission Denied")
122
- messages.error(request, msg)
123
- return redirect("ledger:corporation_data_export", corporation_id=corporation_id)
124
-
125
- if perms is None:
126
- msg = _("Corporation not found")
127
- messages.info(request, msg)
128
- return redirect("ledger:corporation_data_export", corporation_id=corporation_id)
129
-
130
- form = forms.GenerateDataExportForm(
131
- request.POST,
132
- corporation_id=corporation_id,
133
- )
134
-
135
- if not form.is_valid():
136
- msg = _("Invalid form submission.")
137
- messages.error(request, msg)
138
- return redirect("ledger:corporation_data_export", corporation_id=corporation_id)
139
-
140
- # Read optional form values
141
- year_val = form.cleaned_data.get("year")
142
- month_val = form.cleaned_data.get("month") or None
143
-
144
- division_obj = form.cleaned_data.get("division")
145
- division_val = division_obj.division_id if division_obj is not None else None
146
-
147
- logger.debug("Generating data export for year=%s, month=%s", year_val, month_val)
148
- tasks.export_data_ledger.apply_async(
149
- kwargs={
150
- "user_pk": request.user.pk,
151
- "ledger_type": "corporation",
152
- "entity_id": corporation_id,
153
- "division_id": division_val,
154
- "year": year_val,
155
- "month": month_val,
156
- },
157
- priority=7,
158
- )
159
- msg = _(
160
- f"Data export for {corporation_id} has been started. This can take a couple of minutes. You will get a notification once it is completed."
161
- )
162
- messages.info(request, msg)
163
- return redirect("ledger:corporation_data_export", corporation_id=corporation_id)
164
-
165
-
166
- @login_required
167
- @permission_required("ledger.manage_access")
168
- def corporation_data_export_run_update(
169
- request,
170
- hash_code: str,
171
- ):
172
- """Render view for running data export update."""
173
- entity_id, division_id, year, month = data_exporter.LedgerCSVExporter.decoder(
174
- hash_code
175
- )
176
-
177
- logger.debug(
178
- "Running data export update for entity_id=%s, division_id=%s, year=%s, month=%s",
179
- entity_id,
180
- division_id,
181
- year,
182
- month,
183
- )
184
- perms = get_corporation(request, entity_id)[0]
185
- if perms is False:
186
- msg = _("Permission Denied")
187
- messages.error(request, msg)
188
- return redirect("ledger:corporation_data_export", corporation_id=entity_id)
189
-
190
- if perms is None:
191
- msg = _("Corporation not found")
192
- messages.info(request, msg)
193
- return redirect("ledger:corporation_data_export", corporation_id=entity_id)
32
+ logger = AppLogger(get_extension_logger(__name__), __title__)
194
33
 
195
- tasks.export_data_ledger.apply_async(
196
- kwargs={
197
- "user_pk": request.user.pk,
198
- "ledger_type": "corporation",
199
- "entity_id": entity_id,
200
- "division_id": division_id,
201
- "year": year,
202
- "month": month,
203
- },
204
- priority=7,
205
- )
206
- msg = _(
207
- f"Data export for {entity_id} has been started. This can take a couple of minutes. You will get a notification once it is completed."
208
- )
209
- messages.info(request, msg)
210
- return redirect("ledger:corporation_data_export", corporation_id=entity_id)
211
34
 
212
-
213
- # pylint: disable=too-many-positional-arguments
214
35
  @login_required
215
36
  @permission_required("ledger.advanced_access")
216
37
  def corporation_ledger(
@@ -224,141 +45,61 @@ def corporation_ledger(
224
45
  """
225
46
  Corporation Ledger
226
47
  """
227
- perms, corporation = get_corporation(request, corporation_id)
48
+ perms = get_corporationowner_or_none(request, corporation_id)[0]
228
49
 
229
- context = {
230
- "title": "Corporation Ledger",
50
+ kwargs = {
231
51
  "corporation_id": corporation_id,
232
- "disabled": True,
233
52
  }
234
53
 
235
- # pylint: disable=duplicate-code
236
- if perms is False:
237
- msg = _("Permission Denied")
238
- messages.error(request, msg)
239
- return render(
240
- request, "ledger/corpledger/corporation_ledger.html", context=context
241
- )
242
- # pylint: disable=duplicate-code
243
- if perms is None:
244
- msg = _("Corporation not found")
245
- messages.info(request, msg)
246
- return render(
247
- request, "ledger/corpledger/corporation_ledger.html", context=context
248
- )
249
-
250
- corporation_data = CorporationData(
251
- corporation=corporation,
252
- division_id=division_id,
253
- year=year,
254
- month=month,
255
- day=day,
256
- )
257
- # Create the Corporation ledger data
258
- ledger = corporation_data.generate_ledger_data()
259
-
260
- context = {
261
- "title": f"Corporation Ledger - {corporation.corporation.corporation_name}",
262
- "corporation_id": corporation_id,
263
- "division_id": division_id,
264
- "billboard": json.dumps(corporation_data.billboard.dict.asdict()),
265
- "ledger": ledger,
266
- "divisions": corporation_data.divisions,
267
- "years": corporation_data.activity_years,
268
- "totals": corporation_data.calculate_totals(ledger),
269
- "view": corporation_data.create_view_data(
270
- viewname="corporation_details",
271
- corporation_id=corporation_id,
272
- entity_id=corporation_id,
273
- division_id=division_id,
274
- section="summary",
275
- ),
276
- }
277
- # Add additional information to the context
278
- context = add_info_to_context(request, context)
279
-
280
- return render(request, "ledger/corpledger/corporation_ledger.html", context=context)
281
-
282
-
283
- # pylint: disable=too-many-positional-arguments, too-many-arguments
284
- @login_required
285
- @permission_required("ledger.advanced_access")
286
- def corporation_details(
287
- request: WSGIRequest,
288
- corporation_id: int,
289
- entity_id: int,
290
- division_id: int = None,
291
- year: int = None,
292
- month: int = None,
293
- day: int = None,
294
- section: str = None,
295
- ):
296
- """
297
- Corporation Details
298
- """
299
- perms, corporation = get_corporation(request, corporation_id)
54
+ if request.POST:
55
+ division_id = request.POST.get("division") or None
56
+ year = request.POST.get("year") or None
57
+ month = request.POST.get("month") or None
58
+ day = request.POST.get("day") or None
59
+ # Ensure that if only day is provided, month is also provided
60
+ if day is not None and month is None:
61
+ month = timezone.now().month
62
+
63
+ if division_id is not None:
64
+ kwargs["division_id"] = division_id
65
+ if year is not None:
66
+ kwargs["year"] = year
67
+ if month is not None:
68
+ kwargs["month"] = month
69
+ if day is not None:
70
+ kwargs["day"] = day
71
+
72
+ # Redirect to the same view with updated parameters
73
+ if request.POST:
74
+ return redirect("ledger:corporation_ledger", **kwargs)
75
+
76
+ ledger_url = reverse("ledger:api:get_corporation_ledger", kwargs=kwargs)
300
77
 
301
78
  context = {
302
79
  "title": "Corporation Ledger",
303
80
  "corporation_id": corporation_id,
81
+ "ledger_url": ledger_url,
82
+ "forms": {
83
+ "corporation_dropdown": forms.CorporationDropdownForm(
84
+ corporation_id=corporation_id,
85
+ division_id=division_id,
86
+ year=year,
87
+ month=month,
88
+ day=day,
89
+ ),
90
+ },
304
91
  }
305
92
 
306
- # pylint: disable=duplicate-code
307
- if perms is False:
308
- msg = _("Permission Denied")
309
- return render(
310
- request,
311
- "ledger/partials/information/view_character_content.html",
312
- {
313
- "error": msg,
314
- "corporation_id": corporation_id,
315
- },
316
- )
317
- # pylint: disable=duplicate-code
318
93
  if perms is None:
319
94
  msg = _("Corporation not found")
320
- return render(
321
- request,
322
- "ledger/partials/information/view_character_content.html",
323
- {
324
- "error": msg,
325
- "corporation_id": corporation_id,
326
- },
327
- )
328
-
329
- corporation_data = CorporationData(
330
- corporation=corporation,
331
- division_id=division_id,
332
- year=year,
333
- month=month,
334
- day=day,
335
- section=section,
336
- )
337
-
338
- # Create the Entity for the ledger
339
- entity = LedgerEntity(
340
- entity_id=entity_id,
341
- )
342
-
343
- journal = corporation_data.filter_entity_journal(entity=entity)
344
- amounts = corporation_data._create_corporation_details(
345
- journal=journal, entity=entity
346
- )
347
- details = corporation_data._add_average_details(request, amounts, day)
95
+ messages.info(request, msg)
96
+ return redirect("ledger:corporation_overview")
348
97
 
349
- context = {
350
- "title": f"Corporation Details - {corporation.corporation_name}",
351
- "type": "corporation",
352
- "character": details,
353
- "information": f"Corporation Details - {corporation_data.get_details_title}",
354
- }
355
- context = add_info_to_context(request, context)
356
- # pylint: disable=duplicate-code
357
- return render(
358
- request,
359
- "ledger/partials/information/view_character_content.html",
360
- context=context,
361
- )
98
+ if perms is False:
99
+ msg = _("Permission Denied")
100
+ messages.error(request, msg)
101
+ return redirect("ledger:corporation_overview")
102
+ return render(request, "ledger/view-corporation-ledger.html", context=context)
362
103
 
363
104
 
364
105
  @login_required
@@ -367,11 +108,12 @@ def corporation_overview(request):
367
108
  """
368
109
  Corporation Overview
369
110
  """
370
- context = {"title": "Corporation Overview"}
371
- context = add_info_to_context(request, context)
372
- return render(
373
- request, "ledger/corpledger/admin/corporation_overview.html", context=context
374
- )
111
+ context = {
112
+ "title": "Corporation Overview",
113
+ "year": timezone.now().year,
114
+ "month": timezone.now().month,
115
+ }
116
+ return render(request, "ledger/view-corporation-overview.html", context=context)
375
117
 
376
118
 
377
119
  @login_required
@@ -385,33 +127,29 @@ def corporation_administration(request, corporation_id):
385
127
  if perm is False:
386
128
  msg = _("Permission Denied")
387
129
  messages.error(request, msg)
388
- return redirect("ledger:corporation_ledger_index")
130
+ return redirect("ledger:corporation_overview")
389
131
 
390
132
  if perm is None:
391
133
  msg = _("Corporation not found")
392
134
  messages.info(request, msg)
393
- return redirect("ledger:corporation_ledger_index")
135
+ return redirect("ledger:corporation_overview")
394
136
 
395
137
  # TODO Get Missing Characters from esi-corporations.read_corporation_membership.v1 ?
396
138
  corp_characters = CharacterOwnership.objects.filter(
397
- character__corporation_id=corporation.corporation.corporation_id
139
+ character__corporation_id=corporation.eve_corporation.corporation_id
398
140
  ).order_by("character__character_name")
399
- corporation_dataexporter = data_exporter.LedgerCSVExporter.create_exporter(
400
- "corporation", corporation_id
401
- )
402
141
 
403
142
  context = {
404
143
  "corporation_id": corporation_id,
405
144
  "title": "Corporation Administration",
145
+ "year": timezone.now().year,
146
+ "month": timezone.now().month,
406
147
  "corporation": corporation,
407
148
  "characters": corp_characters,
408
- "is_exportable": corporation_dataexporter.has_data,
409
149
  }
410
- context = add_info_to_context(request, context)
411
-
412
150
  return render(
413
151
  request,
414
- "ledger/corpledger/admin/corporation_administration.html",
152
+ "ledger/view-corporation-administration.html",
415
153
  context=context,
416
154
  )
417
155
 
@@ -436,10 +174,10 @@ def corporation_delete(request, corporation_id):
436
174
  {"success": False, "message": msg}, status=HTTPStatus.NOT_FOUND, safe=False
437
175
  )
438
176
 
439
- audit = CorporationAudit.objects.get(corporation__corporation_id=corporation_id)
177
+ audit = CorporationOwner.objects.get(eve_corporation__corporation_id=corporation_id)
440
178
  audit.delete()
441
179
 
442
- msg = _(f"{audit.corporation.corporation_name} successfully deleted")
180
+ msg = _(f"{audit.eve_corporation.corporation_name} successfully deleted")
443
181
  return JsonResponse(
444
182
  {"success": True, "message": msg}, status=HTTPStatus.OK, safe=False
445
183
  )
ledger/views/index.py CHANGED
@@ -3,61 +3,123 @@
3
3
  # Django
4
4
  from django.contrib import messages
5
5
  from django.contrib.auth.decorators import login_required, permission_required
6
+ from django.core.handlers.wsgi import WSGIRequest
6
7
  from django.shortcuts import redirect, render
7
- from django.utils.translation import gettext as _
8
+ from django.utils import timezone
9
+ from django.utils.text import format_lazy
10
+ from django.utils.translation import gettext_lazy as _
8
11
 
9
12
  # Alliance Auth
10
13
  from allianceauth.services.hooks import get_extension_logger
11
14
 
12
- # Alliance Auth (External Libs)
13
- from app_utils.logging import LoggerAddTag
14
-
15
15
  # AA Ledger
16
- from ledger import __title__
16
+ from ledger import __title__, tasks
17
17
 
18
18
  # Ledger
19
- from ledger.helpers.core import add_info_to_context
20
- from ledger.tasks import clear_all_etags, update_all_characters, update_all_corporations
19
+ from ledger.models.characteraudit import CharacterOwner
20
+ from ledger.models.corporationaudit import CorporationOwner
21
+ from ledger.providers import AppLogger
21
22
 
22
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
23
+ logger = AppLogger(get_extension_logger(__name__), __title__)
23
24
 
24
25
 
25
26
  @login_required
26
27
  @permission_required("ledger.basic_access")
27
28
  def index(request):
28
29
  """Index View"""
29
- context = {
30
- "title": "Ledger",
31
- }
32
- context = add_info_to_context(request, context)
33
30
  return redirect(
34
31
  "ledger:character_ledger",
35
32
  character_id=request.user.profile.main_character.character_id,
33
+ year=timezone.now().year,
34
+ month=timezone.now().month,
36
35
  )
37
36
 
38
37
 
39
38
  @login_required
40
39
  @permission_required("ledger.basic_access")
41
- def admin(request):
40
+ def admin(request: WSGIRequest):
41
+ # Check Permissions
42
42
  if not request.user.is_superuser:
43
43
  messages.error(request, _("You do not have permission to access this page."))
44
44
  return redirect("ledger:index")
45
45
 
46
+ # Handle Character
47
+ def _handle_character_updates(force_refresh):
48
+ character_id = request.POST.get("character_id")
49
+ if character_id:
50
+ try:
51
+ character = CharacterOwner.objects.get(
52
+ eve_character__character_id=int(character_id)
53
+ )
54
+ msg = format_lazy(
55
+ _("Queued Update for Character: {character_name}"),
56
+ character_name=character.character_name,
57
+ )
58
+ messages.info(request, msg)
59
+ tasks.update_character.apply_async(
60
+ kwargs={
61
+ "character_pk": character.pk,
62
+ "force_refresh": force_refresh,
63
+ },
64
+ priority=7,
65
+ )
66
+ except (ValueError, CharacterOwner.DoesNotExist):
67
+ msg = format_lazy(
68
+ _("Character with ID {character_id} not found"),
69
+ character_id=character_id,
70
+ )
71
+ messages.error(request, msg)
72
+ return
73
+
74
+ tasks.update_all_characters.apply_async(
75
+ kwargs={"force_refresh": force_refresh}, priority=7
76
+ )
77
+ messages.info(request, _("Queued Update All Characters"))
78
+ return
79
+
80
+ # Handle Corporation
81
+ def _handle_corporation_updates(force_refresh):
82
+ corporation_id = request.POST.get("corporation_id")
83
+ if corporation_id:
84
+ try:
85
+ corporation = CorporationOwner.objects.get(
86
+ eve_corporation__corporation_id=int(corporation_id)
87
+ )
88
+ msg = format_lazy(
89
+ _("Queued Update for Corporation: {corporation_name}"),
90
+ corporation_name=corporation.corporation_name,
91
+ )
92
+ messages.info(request, msg)
93
+ tasks.update_corporation.apply_async(
94
+ args=[corporation.pk],
95
+ kwargs={"force_refresh": force_refresh},
96
+ priority=7,
97
+ )
98
+ except (ValueError, CorporationOwner.DoesNotExist):
99
+ msg = format_lazy(
100
+ _("Corporation with ID {corporation_id} not found"),
101
+ corporation_id=corporation_id,
102
+ )
103
+ messages.error(request, msg)
104
+ return
105
+
106
+ tasks.update_all_corporations.apply_async(
107
+ kwargs={"force_refresh": force_refresh}, priority=7
108
+ )
109
+ messages.info(request, _("Queued Update All Corporations"))
110
+ return
111
+
112
+ # Handle POST Requests
46
113
  if request.method == "POST":
47
- force_refresh = False
48
- if request.POST.get("force_refresh", False):
49
- force_refresh = True
50
- if request.POST.get("run_clear_etag"):
51
- messages.info(request, _("Queued Clear All ETags"))
52
- clear_all_etags.apply_async(priority=1)
53
- if request.POST.get("run_char_updates"):
54
- messages.info(request, _("Queued Update All Characters"))
55
- update_all_characters.apply_async(
56
- kwargs={"force_refresh": force_refresh}, priority=7
57
- )
58
- if request.POST.get("run_corp_updates"):
59
- messages.info(request, _("Queued Update All Corporations"))
60
- update_all_corporations.apply_async(
61
- kwargs={"force_refresh": force_refresh}, priority=7
62
- )
63
- return render(request, "ledger/admin.html")
114
+ force_refresh = bool(request.POST.get("force_refresh", False))
115
+
116
+ # General Tasks
117
+ if request.POST.get("run_clear_cache"):
118
+ messages.info(request, _("Queued Clear All Cache"))
119
+ tasks.clear_all_cache.apply_async(priority=1)
120
+ # Specific Tasks
121
+ if request.POST.get("run_character_updates"):
122
+ _handle_character_updates(force_refresh)
123
+ if request.POST.get("run_corporation_updates"):
124
+ _handle_corporation_updates(force_refresh)
125
+ return render(request, "ledger/view-administration.html")