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
ledger/api/schema.py CHANGED
@@ -1,25 +1,198 @@
1
1
  # Standard Library
2
2
  from datetime import datetime
3
- from typing import Any
4
3
 
5
4
  # Third Party
6
5
  from ninja import Schema
7
6
 
7
+ # Django
8
+ from django.utils import timezone
8
9
 
9
- class EveName(Schema):
10
- id: int
10
+ # AA Ledger
11
+ from ledger.helpers.billboard import BillboardData
12
+
13
+
14
+ class OwnerSchema(Schema):
15
+ """
16
+ Schema for Character or Character Owner.
17
+
18
+ Attributes:
19
+ character_id (int): The ID of the character.
20
+ character_name (str): The name of the character.
21
+ icon (str | None): The URL of the character's icon, if available.
22
+ """
23
+
24
+ character_id: int
25
+ character_name: str
26
+ icon: str | None = None
27
+
28
+
29
+ class EntitySchema(Schema):
30
+ """
31
+ Schema for Entity or Corporation Owner.
32
+
33
+ Attributes:
34
+ entity_id (int): The ID of the entity.
35
+ entity_name (str): The name of the entity.
36
+ icon (str | None): The URL of the entity's icon, if available.
37
+ """
38
+
39
+ entity_id: int
40
+ entity_name: str
41
+ alt_ids: list[int] = []
42
+ icon: str = ""
43
+ popover: str = ""
44
+
45
+
46
+ class CategorySchema(Schema):
11
47
  name: str
12
- cat: str | None = None
48
+ amount: float = 0.00
49
+ average: float = 0.00
50
+ average_tick: float = 0.00
51
+ ref_types: str | None = None
13
52
 
14
53
 
15
- class CharacterPlanet(Schema):
16
- character_id: int | None = None
17
- character_name: str | None = None
18
- planet: str | None = None
19
- planet_id: int | None = None
20
- upgrade_level: int | None = None
21
- num_pins: int | None = None
54
+ class UpdateStatusSchema(Schema):
22
55
  last_update: datetime | None = None
56
+ last_run: datetime | None = None
57
+ status: str | None = None
58
+ icon: str | None = None
59
+
60
+
61
+ class BillboardSchema(Schema):
62
+ xy_chart: BillboardData | None = None
63
+ chord_chart: BillboardData | None = None
64
+
65
+
66
+ class LedgerResponse(Schema):
67
+ """
68
+ Schema for Ledger Response.
69
+
70
+ Attributes:
71
+ owner (OwnerSchema): The owner of the ledger.
72
+ billboard (BillboardSchema): Billboard data.
73
+ actions (str, optional): HTML string for actions.
74
+ """
75
+
76
+ owner: OwnerSchema
77
+ billboard: BillboardSchema
78
+ actions: str = ""
79
+
80
+
81
+ class LedgerSchema(Schema):
82
+ """
83
+
84
+ Schema for Ledger Summary.
85
+
86
+ Attributes:
87
+ bounty (float): Amount related to bounties.
88
+ ess (float): Amount related to ESS activities.
89
+ costs (float): Amount related to costs.
90
+ miscellaneous (float): Miscellaneous amount.
91
+ total (float): Total amount.
92
+ """
93
+
94
+ bounty: float = 0.00
95
+ ess: float = 0.00
96
+ costs: float = 0.00
97
+ miscellaneous: float = 0.00
98
+ total: float = 0.00
99
+
100
+
101
+ class CharacterLedgerSchema(LedgerSchema):
102
+ """
103
+ Schema for Character Ledger extending LedgerSchema.
104
+
105
+ Subclass of :class:`LedgerSchema`.
106
+
107
+ Attributes:
108
+ mining (float): Amount related to mining activities.
109
+ """
110
+
111
+ mining: float = 0.00
112
+
113
+
114
+ class OwnerLedgerRequestInfo(Schema):
115
+ """Schema for Owner Ledger Request Information."""
116
+
117
+ owner_id: int
118
+ year: int
119
+ month: int | None = None
120
+ day: int | None = None
121
+ section: str = "summary"
122
+ dropdown_html: str | None = None
123
+ footer_html: str | None = None
124
+
125
+ def to_date_query(self) -> dict:
126
+ date_query = {"date__year": self.year}
127
+ if self.month is not None:
128
+ date_query["date__month"] = self.month
129
+ if self.day is not None:
130
+ date_query["date__day"] = self.day
131
+ return date_query
132
+
133
+
134
+ class CorporationLedgerRequestInfo(OwnerLedgerRequestInfo):
135
+ """
136
+ Schema for Corporation Ledger Request Information.
137
+
138
+ Subclass of :class:`OwnerLedgerRequestInfo`.
139
+
140
+ Attributes:
141
+ entity_id (int | None): The ID of the entity.
142
+ division_id (int | None): The ID of the division.
143
+ """
144
+
145
+ entity_id: int | None = None
146
+ division_id: int | None = None
147
+
148
+ def to_division_query(self) -> dict:
149
+ division_query = {}
150
+ if self.division_id is not None:
151
+ division_query["division__division_id"] = self.division_id
152
+ return division_query
153
+
154
+
155
+ class AllianceLedgerRequestInfo(OwnerLedgerRequestInfo):
156
+ """
157
+ Schema for Alliance Ledger Request Information.
158
+
159
+ Subclass of :class:`OwnerLedgerRequestInfo`.
160
+
161
+ Attributes:
162
+ corporation_id (int | None): The ID of the corporation.
163
+ """
164
+
165
+ corporation_id: int | None = None
166
+
167
+
168
+ class LedgerDetailsSummary(Schema):
169
+ """
170
+ Schema for summary of ledger details.
171
+
172
+ Attributes:
173
+ summary (str): Summary of all categories.
174
+ daily (str): Daily breakdown of categories.
175
+ hourly (str): Hourly breakdown of categories.
176
+ """
177
+
178
+ summary: str = ""
179
+ daily: str = ""
180
+ hourly: str = ""
181
+
182
+
183
+ class LedgerDetailsResponse(Schema):
184
+ """Flexible schema for detailed ledger categories.
185
+
186
+ Attributes:
187
+ summary (CategorySchema): Summary of all categories.
188
+ daily (CategorySchema): Daily breakdown of categories.
189
+ hourly (CategorySchema): Hourly breakdown of categories.
190
+ """
191
+
192
+ summary: list[CategorySchema]
193
+ daily: list[CategorySchema]
194
+ hourly: list[CategorySchema]
195
+ total: LedgerDetailsSummary
23
196
 
24
197
 
25
198
  class CharacterAdmin(Schema):
@@ -34,7 +207,59 @@ class AllianceAdmin(Schema):
34
207
  alliance: dict | None = None
35
208
 
36
209
 
37
- class Ledger(Schema):
38
- ratting: list | None = None
39
- billboard: Any | None = None
40
- total: dict | None = None
210
+ class EveTypeSchema(Schema):
211
+ """
212
+ Schema for EVE Online item types.
213
+
214
+ Attributes:
215
+ id (int): The ID of the item type.
216
+ name (str): The name of the item type.
217
+ description (str | None): The description of the item type, if available.
218
+ group_id (int | None): The group ID of the item type, if available.
219
+ group_name (str | None): The group name of the item type, if available.
220
+ market_group_id (int | None): The market group ID of the item type, if available.
221
+ market_group_name (str | None): The market group name of the item type, if available.
222
+ icon (str | None): The URL of the item type's icon, if available.
223
+ """
224
+
225
+ id: int
226
+ name: str
227
+ description: str | None = None
228
+ group_id: int | None = None
229
+ group_name: str | None = None
230
+ market_group_id: int | None = None
231
+ market_group_name: str | None = None
232
+ icon: str | None = None
233
+
234
+
235
+ class PlanetSchema(Schema):
236
+ id: int
237
+ name: str
238
+ type: EveTypeSchema
239
+ upgrade_level: int
240
+ num_pins: int
241
+ last_update: timezone.datetime
242
+
243
+
244
+ class CharacterPlanet(Schema):
245
+ character_id: int | None = None
246
+ character_name: str | None = None
247
+ planet: str | None = None
248
+ planet_id: int | None = None
249
+ upgrade_level: int | None = None
250
+ num_pins: int | None = None
251
+ last_update: datetime | None = None
252
+
253
+
254
+ class ProgressBarSchema(Schema):
255
+ percentage: str
256
+ html: str
257
+
258
+
259
+ class ExtractorSchema(Schema):
260
+ item_id: int
261
+ item_name: str
262
+ icon: str | None = None
263
+ install_time: str
264
+ expiry_time: str
265
+ progress: ProgressBarSchema
ledger/app_settings.py CHANGED
@@ -2,33 +2,17 @@
2
2
  App Settings
3
3
  """
4
4
 
5
- # Standard Library
6
- import sys
7
-
8
- # Alliance Auth (External Libs)
9
- from app_utils.app_settings import clean_setting
10
-
11
- IS_TESTING = sys.argv[1:2] == ["test"]
12
-
13
- # Set Test Mode True or False
5
+ # Django
6
+ from django.conf import settings
14
7
 
15
8
  # Set Naming on Auth Hook
16
- LEDGER_APP_NAME = clean_setting("LEDGER_APP_NAME", "Ledger")
17
-
18
- # zKillboard - https://zkillboard.com/
19
- EVE_BASE_URL = "https://esi.evetech.net/"
20
- EVE_API_URL = "https://esi.evetech.net/latest/"
21
- EVE_BASE_URL_REGEX = r"^http[s]?:\/\/esi.evetech\.net\/"
22
-
23
- # fuzzwork
24
- FUZZ_BASE_URL = "https://www.fuzzwork.co.uk/"
25
- FUZZ_API_URL = "https://www.fuzzwork.co.uk/api/"
26
- FUZZ_BASE_URL_REGEX = r"^http[s]?:\/\/(www\.)?fuzzwork\.co\.uk\/"
9
+ LEDGER_APP_NAME = getattr(settings, "LEDGER_APP_NAME", "Ledger")
27
10
 
28
11
  # Global timeout for tasks in seconds to reduce task accumulation during outages.
29
- LEDGER_TASKS_TIME_LIMIT = clean_setting("LEDGER_TASKS_TIME_LIMIT", 600)
12
+ LEDGER_TASKS_TIME_LIMIT = getattr(settings, "LEDGER_TASKS_TIME_LIMIT", 600)
30
13
 
31
- LEDGER_STALE_TYPES = clean_setting(
14
+ LEDGER_STALE_TYPES = getattr(
15
+ settings,
32
16
  "LEDGER_STALE_TYPES",
33
17
  {
34
18
  "wallet_journal": 30,
@@ -41,10 +25,18 @@ LEDGER_STALE_TYPES = clean_setting(
41
25
  )
42
26
 
43
27
  # Mining Price Calculation
44
- LEDGER_USE_COMPRESSED = clean_setting("LEDGER_USE_COMPRESSED", True)
45
- LEDGER_PRICE_PERCENTAGE = clean_setting("LEDGER_PRICE_PERCENTAGE", 0.9)
28
+ LEDGER_USE_COMPRESSED = getattr(settings, "LEDGER_USE_COMPRESSED", True)
29
+ LEDGER_PRICE_PERCENTAGE = getattr(settings, "LEDGER_PRICE_PERCENTAGE", 0.9)
46
30
 
47
31
  # Ledger Cache System
48
- LEDGER_CACHE_STALE = 60 * 60 * 168 # 168 hours
32
+ LEDGER_CACHE_STALE = 60 * 60 * 24 * 30 # 30 days
49
33
  LEDGER_CACHE_KEY = "LEDGER"
50
- LEDGER_CACHE_ENABLED = True
34
+ LEDGER_CACHE_ENABLED = getattr(settings, "LEDGER_CACHE_ENABLED", True)
35
+
36
+ # Maximum Number of Objects processed per run of DJANGO Batch Method
37
+ # Controls how many database records are inserted in a single batch operation.
38
+ # If you encounter "Got a packet bigger than 'max_allowed_packet' bytes" errors,
39
+ # reduce this value (e.g., to 250 or 100).
40
+ # Can be increased for better performance if your MySQL max_allowed_packet setting
41
+ # is configured higher (default is usually 16-64MB).
42
+ LEDGER_BULK_BATCH_SIZE = getattr(settings, "LEDGER_BULK_BATCH_SIZE", 500)
ledger/auth_hooks.py CHANGED
@@ -10,7 +10,7 @@ from allianceauth.services.hooks import MenuItemHook, UrlHook
10
10
 
11
11
  # AA Ledger
12
12
  from ledger import app_settings, urls
13
- from ledger.models.characteraudit import CharacterAudit
13
+ from ledger.models.characteraudit import CharacterOwner
14
14
 
15
15
 
16
16
  class LedgerMenuItem(MenuItemHook):
@@ -27,7 +27,7 @@ class LedgerMenuItem(MenuItemHook):
27
27
  def render(self, request):
28
28
  if request.user.has_perm("ledger.basic_access"):
29
29
  self.count = (
30
- CharacterAudit.objects.annotate_total_update_status_user(
30
+ CharacterOwner.objects.annotate_total_update_status_user(
31
31
  user=request.user
32
32
  )
33
33
  .aggregate(total_failed=Sum("num_sections_failed"))
ledger/constants.py CHANGED
@@ -2,6 +2,10 @@
2
2
  Constants
3
3
  """
4
4
 
5
+ # Django
6
+ from django.db import models
7
+ from django.utils.translation import gettext_lazy as _
8
+
5
9
  # Embed colors
6
10
  DISCORD_EMBED_COLOR_INFO = 0x5BC0DE
7
11
  DISCORD_EMBED_COLOR_SUCCESS = 0x5CB85C
@@ -16,188 +20,57 @@ DISCORD_EMBED_COLOR_MAP = {
16
20
  "danger": DISCORD_EMBED_COLOR_DANGER,
17
21
  }
18
22
 
19
- COMMAND_CENTER = [
20
- 2129,
21
- 2130,
22
- 2131,
23
- 2132,
24
- 2136,
25
- 2137,
26
- 2138,
27
- 2139,
28
- 2140,
29
- 2141,
30
- 2142,
31
- 2143,
32
- 2144,
33
- 2145,
34
- 2146,
35
- 2147,
36
- 2148,
37
- 2149,
38
- 2150,
39
- 2151,
40
- 2152,
41
- 2153,
42
- 2154,
43
- 2155,
44
- 2156,
45
- 2157,
46
- 2158,
47
- 2159,
48
- 2160,
49
- 2254,
50
- 2524,
51
- 2525,
52
- 2533,
53
- 2534,
54
- 2549,
55
- 2550,
56
- 2551,
57
- 2574,
58
- 2576,
59
- 2577,
60
- 2568,
61
- 2581,
62
- 2582,
63
- 2585,
64
- 2586,
65
- ]
66
- SPACEPORTS = [2256, 2542, 2543, 2544, 2552, 2555, 2556, 2557]
67
- STORAGE_FACILITY = [2257, 2535, 2536, 2541, 2558, 2560, 2561, 2562]
68
- EXTRACTOR_CONTROL_UNIT = [2848, 3060, 3061, 3062, 3063, 3064, 3067, 3068]
69
- P0_PRODUCTS_SOLID = [2267, 2270, 2272, 2306, 2307]
70
- P0_PRODUCTS_LIQUID_GAS = [2268, 2308, 2309, 2310, 2311]
71
- P0_PRODUCTS_ORGANIC = [2073, 2286, 2287, 2288, 2305]
72
- P0_PRODUCTS = P0_PRODUCTS_SOLID + P0_PRODUCTS_LIQUID_GAS + P0_PRODUCTS_ORGANIC
73
- P1_PRODUCTS = [
74
- 2389,
75
- 2390,
76
- 2392,
77
- 2393,
78
- 2395,
79
- 2396,
80
- 2397,
81
- 2398,
82
- 2399,
83
- 2400,
84
- 2401,
85
- 3645,
86
- 3683,
87
- 3779,
88
- 9828,
89
- ]
90
- P2_PRODUCTS = [
91
- 44,
92
- 2312,
93
- 2317,
94
- 2319,
95
- 2321,
96
- 2327,
97
- 2328,
98
- 2329,
99
- 2463,
100
- 3689,
101
- 3691,
102
- 3693,
103
- 3695,
104
- 3697,
105
- 3725,
106
- 3775,
107
- 3828,
108
- 983,
109
- 9832,
110
- 9836,
111
- 9838,
112
- 9840,
113
- 9842,
114
- 15317,
115
- ]
116
- P3_PRODUCTS = [
117
- 2344,
118
- 2345,
119
- 2346,
120
- 2348,
121
- 2349,
122
- 2351,
123
- 2352,
124
- 2354,
125
- 2358,
126
- 2360,
127
- 2361,
128
- 2366,
129
- 2367,
130
- 9834,
131
- 9846,
132
- 9848,
133
- 12836,
134
- 17136,
135
- 17392,
136
- 17898,
137
- 28974,
138
- ]
139
- P4_PRODUCTS = [2867, 2868, 2869, 2870, 2871, 2872, 2875, 2876]
140
- P5_PRODUCTS = []
141
-
142
23
  NPC_ENTITIES = [
143
24
  1000125, # Concord Bounties (Bounty Prizes, ESS
144
25
  1000132, # Secure Commerce Commission (Market Fees)
145
26
  1000413, # Air Laboratories (Daily Login Rewards, etc.)
146
27
  ]
147
28
 
148
- BOUNTY_PRIZES = ["bounty_prizes"]
149
- ESS_TRANSFER = ["ess_escrow_transfer"]
150
- MISSION_REWARD = ["agent_mission_reward", "agent_mission_time_bonus_reward"]
151
- INCURSION = ["corporate_reward_payout"]
152
29
 
153
- # Cost Ref Types
154
- CONTRACT = [
155
- "contract_price",
156
- "contract_collateral",
157
- "contract_reward_deposited",
158
- "contract_brokers_fee",
159
- "contract_sales_tax",
160
- "contract_price_payment_corp",
161
- "contract_reward",
162
- "contract_reward_refund",
163
- "contract_collateral_refund",
164
- "contract_deposit_refund",
165
- ]
166
- MARKET = [
167
- "market_escrow",
168
- "transaction_tax",
169
- "market_provider_tax",
170
- "brokers_fee",
171
- "market_transaction",
172
- ]
173
- ASSETS = ["asset_safety_recovery_tax"]
174
- TRAVELING = [
175
- "structure_gate_jump",
176
- "jump_clone_activation_fee",
177
- "jump_clone_installation_fee",
178
- ]
179
- PRODUCTION = [
180
- "industry_job_tax",
181
- "manufacturing",
182
- "researching_time_productivity",
183
- "researching_material_productivity",
184
- "copying",
185
- "reprocessing_tax",
186
- "reaction",
187
- ]
188
- SKILL = ["skill_purchase"]
189
- PLANETARY = [
190
- "planetary_export_tax",
191
- "planetary_import_tax",
192
- "planetary_construction",
193
- ]
194
- LP = ["lp_store"]
195
- # Trading
196
- DONATION = ["player_donation"]
197
- INSURANCE = ["insurance"]
198
- # MISC
199
- MILESTONE_REWARD = ["milestone_reward_payment"]
200
- DAILY_GOAL_REWARD = ["daily_goal_payouts"]
30
+ class MonthChoice(models.TextChoices):
31
+ JANUARY = 1, _("January")
32
+ FEBRUARY = 2, _("February")
33
+ MARCH = 3, _("March")
34
+ APRIL = 4, _("April")
35
+ MAY = 5, _("May")
36
+ JUNE = 6, _("June")
37
+ JULY = 7, _("July")
38
+ AUGUST = 8, _("August")
39
+ SEPTEMBER = 9, _("September")
40
+ OCTOBER = 10, _("October")
41
+ NOVEMBER = 11, _("November")
42
+ DECEMBER = 12, _("December")
43
+
201
44
 
202
- RENTAL = ["office_rental_fee"]
203
- CORP_WITHDRAW = ["corporation_account_withdrawal"]
45
+ class DayChoice(models.TextChoices):
46
+ DAY_1 = 1, _("1")
47
+ DAY_2 = 2, _("2")
48
+ DAY_3 = 3, _("3")
49
+ DAY_4 = 4, _("4")
50
+ DAY_5 = 5, _("5")
51
+ DAY_6 = 6, _("6")
52
+ DAY_7 = 7, _("7")
53
+ DAY_8 = 8, _("8")
54
+ DAY_9 = 9, _("9")
55
+ DAY_10 = 10, _("10")
56
+ DAY_11 = 11, _("11")
57
+ DAY_12 = 12, _("12")
58
+ DAY_13 = 13, _("13")
59
+ DAY_14 = 14, _("14")
60
+ DAY_15 = 15, _("15")
61
+ DAY_16 = 16, _("16")
62
+ DAY_17 = 17, _("17")
63
+ DAY_18 = 18, _("18")
64
+ DAY_19 = 19, _("19")
65
+ DAY_20 = 20, _("20")
66
+ DAY_21 = 21, _("21")
67
+ DAY_22 = 22, _("22")
68
+ DAY_23 = 23, _("23")
69
+ DAY_24 = 24, _("24")
70
+ DAY_25 = 25, _("25")
71
+ DAY_26 = 26, _("26")
72
+ DAY_27 = 27, _("27")
73
+ DAY_28 = 28, _("28")
74
+ DAY_29 = 29, _("29")
75
+ DAY_30 = 30, _("30")
76
+ DAY_31 = 31, _("31")
ledger/decorators.py CHANGED
@@ -4,59 +4,15 @@ Decorators
4
4
 
5
5
  # Standard Library
6
6
  import time
7
- from functools import wraps
8
-
9
- # Django
10
- from django.core.cache import cache
11
7
 
12
8
  # Alliance Auth
13
9
  from allianceauth.services.hooks import get_extension_logger
14
10
 
15
- # Alliance Auth (External Libs)
16
- from app_utils.esi import fetch_esi_status
17
- from app_utils.logging import LoggerAddTag
18
-
19
11
  # AA Ledger
20
12
  from ledger import __title__
21
- from ledger.app_settings import IS_TESTING
22
-
23
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
24
-
25
- # Use shared ESI status route rate limit from app_settings
26
- ESI_STATUS_ROUTE_RATE_LIMIT = 5
27
- ESI_STATUS_KEY = "esi-is-available-status"
28
-
29
-
30
- def get_esi_available_cache() -> bool:
31
- """Return True if ESI availability cache is present."""
32
- if cache.get(ESI_STATUS_KEY):
33
- return True
34
- return False
35
-
36
-
37
- def when_esi_is_available(func):
38
- """
39
- Make sure the decorated task only runs when esi is available and store the result.
40
- Complete the task without running it when downtime is detected.
41
- Automatically disabled during tests.
42
- """
43
-
44
- @wraps(func)
45
- def outer(*args, **kwargs):
46
-
47
- # During tests we skip ESI checks
48
- if IS_TESTING or get_esi_available_cache():
49
- logger.debug("Skipping ESI check (testing mode or cache present).")
50
- return func(*args, **kwargs)
51
-
52
- # Check ESI status
53
- if fetch_esi_status().is_ok:
54
- logger.debug("ESI is available, proceeding.")
55
- cache.set(ESI_STATUS_KEY, "1", timeout=ESI_STATUS_ROUTE_RATE_LIMIT)
56
- return func(*args, **kwargs)
57
- return None # function will not run
13
+ from ledger.providers import AppLogger
58
14
 
59
- return outer
15
+ logger = AppLogger(get_extension_logger(__name__), __title__)
60
16
 
61
17
 
62
18
  def log_timing(logs):