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