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
@@ -3,37 +3,40 @@ from django.test import TestCase
3
3
  from django.utils import timezone
4
4
 
5
5
  # AA Ledger
6
- from ledger.models.characteraudit import CharacterAudit, CharacterUpdateStatus
7
- from ledger.tests.testdata.generate_characteraudit import (
8
- add_characteraudit_character_to_user,
6
+ from ledger.models.characteraudit import CharacterOwner
7
+ from ledger.models.helpers.update_manager import CharacterUpdateSection, UpdateStatus
8
+ from ledger.tests import LedgerTestCase
9
+ from ledger.tests.testdata.utils import (
10
+ create_owner_from_user,
9
11
  create_update_status,
10
- create_user_from_evecharacter_with_access,
11
12
  )
12
- from ledger.tests.testdata.load_allianceauth import load_allianceauth
13
- from ledger.tests.testdata.load_eveentity import load_eveentity
14
- from ledger.tests.testdata.load_eveuniverse import load_eveuniverse
15
13
 
16
14
  MODULE_PATH = "ledger.managers.character_audit_manager"
17
15
 
18
16
 
19
- class TestCharacterAuditManager(TestCase):
17
+ class TestCharacterAuditManager(LedgerTestCase):
20
18
  @classmethod
21
19
  def setUpClass(cls):
22
20
  super().setUpClass()
23
- load_allianceauth()
24
- load_eveuniverse()
25
- load_eveentity()
26
- cls.user, cls.character_ownership = create_user_from_evecharacter_with_access(
27
- 1001,
28
- )
29
- cls.audit = add_characteraudit_character_to_user(cls.user, 1001)
21
+ cls.audit = create_owner_from_user(user=cls.user)
30
22
 
31
- cls.character_ownership.delete()
23
+ cls.user_character.delete()
32
24
 
33
25
  def test_disable_characters_with_no_ownership_should_disable(self):
34
- # given
35
- scetions = CharacterAudit.UpdateSection.get_sections()
36
- for section in scetions:
26
+ """
27
+ Test that characters without ownership are disabled.
28
+
29
+ This test creates a character audit entry without any associated ownership
30
+ and then calls the disable_characters_with_no_owner method. It verifies that
31
+ the character is correctly disabled.
32
+
33
+ ### Results:
34
+ - Characters without ownership are disabled.
35
+ - The method returns the correct count of disabled characters.
36
+ """
37
+ # Test Data
38
+ sections = CharacterUpdateSection.get_sections()
39
+ for section in sections:
37
40
  create_update_status(
38
41
  self.audit,
39
42
  section=section,
@@ -45,26 +48,30 @@ class TestCharacterAuditManager(TestCase):
45
48
  last_update_at=timezone.now(),
46
49
  last_update_finished_at=timezone.now(),
47
50
  )
48
-
49
- # then
50
- self.assertEqual(CharacterAudit.objects.disable_characters_with_no_owner(), 1)
51
+ # Expected Result
52
+ self.assertEqual(CharacterOwner.objects.disable_characters_with_no_owner(), 1)
53
+ self.assertFalse(CharacterOwner.objects.get(pk=self.audit.pk).active)
51
54
 
52
55
 
53
- class TestCharacterAnnotateTotalUpdateStatus(TestCase):
56
+ class TestCharacterAnnotateTotalUpdateStatus(LedgerTestCase):
54
57
  @classmethod
55
58
  def setUpClass(cls):
56
59
  super().setUpClass()
57
- load_allianceauth()
58
- load_eveuniverse()
59
- load_eveentity()
60
- cls.user, cls.character_ownership = create_user_from_evecharacter_with_access(
61
- 1001,
62
- )
63
60
 
64
61
  def test_should_be_ok(self):
65
- # given
66
- character = add_characteraudit_character_to_user(self.user, 1001)
67
- sections = CharacterAudit.UpdateSection.get_sections()
62
+ """
63
+ Test that a character with all successful updates is marked as OK.
64
+
65
+ This test creates a character audit entry with successful update statuses
66
+ for all sections and verifies that the total update status is annotated as OK.
67
+
68
+ ### Results:
69
+ - Characters with all successful updates are marked as OK.
70
+ - The method correctly annotates the total update status.
71
+ """
72
+ # Test Data
73
+ character = create_owner_from_user(user=self.user)
74
+ sections = CharacterUpdateSection.get_sections()
68
75
  for section in sections:
69
76
  create_update_status(
70
77
  character,
@@ -78,17 +85,26 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
78
85
  last_update_finished_at=timezone.now(),
79
86
  )
80
87
 
81
- # when
82
- update_status = CharacterAudit.objects.annotate_total_update_status()
88
+ # Test Action
89
+ update_status = CharacterOwner.objects.annotate_total_update_status()
83
90
  obj = update_status.first()
84
91
 
85
- # then
86
- self.assertEqual(obj.total_update_status, CharacterAudit.UpdateStatus.OK)
92
+ # Expected Result
93
+ self.assertEqual(obj.total_update_status, UpdateStatus.OK)
87
94
 
88
95
  def test_should_be_incomplete(self):
89
- # given
90
- character = add_characteraudit_character_to_user(self.user, 1001)
91
- sections = CharacterAudit.UpdateSection.get_sections()
96
+ """
97
+ Test that a character with incomplete updates is marked as INCOMPLETE.
98
+
99
+ This test creates a character audit entry with successful update statuses
100
+ for some sections and verifies that the total update status is annotated as INCOMPLETE.
101
+
102
+ ### Results:
103
+ - Characters with incomplete updates are marked as INCOMPLETE.
104
+ - The method correctly annotates the total update status."""
105
+ # Test Data
106
+ character = create_owner_from_user(user=self.user)
107
+ sections = CharacterUpdateSection.get_sections()
92
108
  for section in sections[:2]:
93
109
  create_update_status(
94
110
  character,
@@ -102,19 +118,27 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
102
118
  last_update_finished_at=timezone.now(),
103
119
  )
104
120
 
105
- # when
106
- update_status = CharacterAudit.objects.annotate_total_update_status()
121
+ # Test Action
122
+ update_status = CharacterOwner.objects.annotate_total_update_status()
107
123
  obj = update_status.first()
108
124
 
109
- # then
110
- self.assertEqual(
111
- obj.total_update_status, CharacterAudit.UpdateStatus.INCOMPLETE
112
- )
125
+ # Expected Result
126
+ self.assertEqual(obj.total_update_status, UpdateStatus.INCOMPLETE)
113
127
 
114
128
  def test_should_be_token_error(self):
115
- # given
116
- character = add_characteraudit_character_to_user(self.user, 1001)
117
- sections = CharacterAudit.UpdateSection.get_sections()
129
+ """
130
+ Test that a character with token errors is marked as TOKEN_ERROR.
131
+
132
+ This test creates a character audit entry with at least one section having
133
+ a token error and verifies that the total update status is annotated as TOKEN_ERROR.
134
+
135
+ ### Results:
136
+ - Characters with token errors are marked as TOKEN_ERROR.
137
+ - The method correctly annotates the total update status.
138
+ """
139
+ # Test Data
140
+ character = create_owner_from_user(user=self.user)
141
+ sections = CharacterUpdateSection.get_sections()
118
142
  for section in sections:
119
143
  create_update_status(
120
144
  character,
@@ -130,7 +154,7 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
130
154
 
131
155
  create_update_status(
132
156
  character,
133
- section=CharacterAudit.UpdateSection.WALLET_JOURNAL,
157
+ section=CharacterUpdateSection.WALLET_JOURNAL,
134
158
  is_success=False,
135
159
  error_message="",
136
160
  has_token_error=True,
@@ -140,19 +164,27 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
140
164
  last_update_finished_at=timezone.now(),
141
165
  )
142
166
 
143
- # when
144
- update_status = CharacterAudit.objects.annotate_total_update_status()
167
+ # Test Action
168
+ update_status = CharacterOwner.objects.annotate_total_update_status()
145
169
  obj = update_status.first()
146
170
 
147
- # then
148
- self.assertEqual(
149
- obj.total_update_status, CharacterAudit.UpdateStatus.TOKEN_ERROR
150
- )
171
+ # Expected Result
172
+ self.assertEqual(obj.total_update_status, UpdateStatus.TOKEN_ERROR)
151
173
 
152
174
  def test_should_be_disabled(self):
153
- # given
154
- character = add_characteraudit_character_to_user(self.user, 1001)
155
- sections = CharacterAudit.UpdateSection.get_sections()
175
+ """
176
+ Test that a disabled character is marked as DISABLED.
177
+
178
+ This test creates a character audit entry, marks it as inactive,
179
+ and verifies that the total update status is annotated as DISABLED.
180
+
181
+ ### Results:
182
+ - Disabled characters are marked as DISABLED.
183
+ - The method correctly annotates the total update status.
184
+ """
185
+ # Test Data
186
+ character = create_owner_from_user(user=self.user)
187
+ sections = CharacterUpdateSection.get_sections()
156
188
  for section in sections:
157
189
  create_update_status(
158
190
  character,
@@ -169,17 +201,27 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
169
201
  character.active = False
170
202
  character.save()
171
203
 
172
- # when
173
- update_status = CharacterAudit.objects.annotate_total_update_status()
204
+ # Test Action
205
+ update_status = CharacterOwner.objects.annotate_total_update_status()
174
206
  obj = update_status.first()
175
207
 
176
- # then
177
- self.assertEqual(obj.total_update_status, CharacterAudit.UpdateStatus.DISABLED)
208
+ # Expected Result
209
+ self.assertEqual(obj.total_update_status, UpdateStatus.DISABLED)
178
210
 
179
211
  def test_should_be_error(self):
180
- # given
181
- character = add_characteraudit_character_to_user(self.user, 1001)
182
- sections = CharacterAudit.UpdateSection.get_sections()
212
+ """
213
+ Test that a character with errors is marked as ERROR.
214
+
215
+ This test creates a character audit entry with failed update statuses
216
+ for all sections and verifies that the total update status is annotated as ERROR.
217
+
218
+ ### Results:
219
+ - Characters with errors are marked as ERROR.
220
+ - The method correctly annotates the total update status.
221
+ """
222
+ # Test Data
223
+ character = create_owner_from_user(user=self.user)
224
+ sections = CharacterUpdateSection.get_sections()
183
225
  for section in sections:
184
226
  create_update_status(
185
227
  character,
@@ -193,9 +235,9 @@ class TestCharacterAnnotateTotalUpdateStatus(TestCase):
193
235
  last_update_finished_at=timezone.now(),
194
236
  )
195
237
 
196
- # when
197
- update_status = CharacterAudit.objects.annotate_total_update_status()
238
+ # Test Action
239
+ update_status = CharacterOwner.objects.annotate_total_update_status()
198
240
  obj = update_status.first()
199
241
 
200
- # then
201
- self.assertEqual(obj.total_update_status, CharacterAudit.UpdateStatus.ERROR)
242
+ # Expected Result
243
+ self.assertEqual(obj.total_update_status, UpdateStatus.ERROR)
@@ -1,44 +1,41 @@
1
1
  # Standard Library
2
- from unittest.mock import patch
2
+ from unittest.mock import MagicMock, patch
3
3
 
4
4
  # Django
5
5
  from django.test import TestCase, override_settings
6
6
  from django.utils import timezone
7
7
 
8
- # Alliance Auth (External Libs)
9
- from app_utils.testing import NoSocketsTestCase
10
-
11
8
  # AA Ledger
12
9
  from ledger.models.general import EveEntity
13
- from ledger.tests.testdata.esi_stub import esi_client_stub_openapi
14
- from ledger.tests.testdata.generate_characteraudit import (
15
- create_characteraudit_from_evecharacter,
10
+ from ledger.tests import LedgerTestCase
11
+ from ledger.tests.testdata.esi_stub_openapi import EsiEndpoint, create_esi_client_stub
12
+ from ledger.tests.testdata.utils import (
13
+ create_owner_from_user,
14
+ create_wallet_journal_entry,
16
15
  )
17
- from ledger.tests.testdata.generate_walletjournal import create_wallet_journal_entry
18
- from ledger.tests.testdata.load_allianceauth import load_allianceauth
19
- from ledger.tests.testdata.load_eveentity import load_eveentity
20
- from ledger.tests.testdata.load_eveuniverse import load_eveuniverse
21
16
 
22
17
  MODULE_PATH = "ledger.managers.character_journal_manager"
23
18
 
19
+ LEDGER_CHARACTER_WALLET_JOURNAL_ENDPOINTS = [
20
+ EsiEndpoint("Wallet", "GetCharactersCharacterIdWalletJournal", "character_id"),
21
+ ]
22
+
24
23
 
25
24
  @override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
26
25
  @patch(MODULE_PATH + ".esi")
27
26
  @patch("ledger.models.general.EveEntity")
28
- class TestCharacterJournalManager(NoSocketsTestCase):
27
+ class TestCharacterJournalManager(LedgerTestCase):
28
+ """Test Character Journal Manager for Character."""
29
+
29
30
  @classmethod
30
31
  def setUpClass(cls):
31
32
  super().setUpClass()
32
- load_allianceauth()
33
- load_eveuniverse()
34
- load_eveentity()
35
- cls.audit = create_characteraudit_from_evecharacter(1001)
36
-
33
+ cls.audit = create_owner_from_user(user=cls.user)
37
34
  cls.eve_character_first_party = EveEntity.objects.get(eve_id=1001)
38
35
  cls.eve_character_second_party = EveEntity.objects.get(eve_id=1002)
39
36
 
40
37
  cls.journal_entry = create_wallet_journal_entry(
41
- journal_type="character",
38
+ owner_type="character",
42
39
  character=cls.audit,
43
40
  context_id=1,
44
41
  entry_id=10,
@@ -59,18 +56,34 @@ class TestCharacterJournalManager(NoSocketsTestCase):
59
56
  second_party=cls.eve_character_second_party,
60
57
  ref_type="player_donation",
61
58
  )
59
+ cls.token = cls.user_character.user.token_set.first()
60
+ cls.audit.get_token = MagicMock(return_value=cls.token)
62
61
 
63
62
  def test_update_wallet_journal(self, mock_eveentity, mock_esi):
64
- # given
65
- mock_esi.client = esi_client_stub_openapi
63
+ """
64
+ Test updating the wallet journal for a character.
65
+
66
+ This test mocks the ESI client and EveEntity model to simulate
67
+ fetching wallet journal entries from ESI and updating the local
68
+ database accordingly.
69
+
70
+ ### Results:
71
+ - Wallet Journal Entries (entry_id: 10, 13, 16) are created with correct data.
72
+ """
73
+ # Test Data
74
+ mock_esi.client = create_esi_client_stub(
75
+ endpoints=LEDGER_CHARACTER_WALLET_JOURNAL_ENDPOINTS
76
+ )
66
77
  mock_eveentity.objects.create_bulk_from_esi.return_value = True
67
78
 
68
79
  EveEntity.objects.create(
69
80
  eve_id=9999, name="Test Character 1", category="character"
70
81
  )
71
82
 
83
+ # Test Action
72
84
  self.audit.update_wallet_journal(force_refresh=False)
73
85
 
86
+ # Expected Results
74
87
  self.assertSetEqual(
75
88
  set(self.audit.ledger_character_journal.values_list("entry_id", flat=True)),
76
89
  {10, 13, 16},
@@ -88,20 +101,19 @@ class TestCharacterJournalManager(NoSocketsTestCase):
88
101
  self.assertEqual(obj.amount, 10000)
89
102
 
90
103
 
91
- class TestCharacterJournalManagerAnnotations(TestCase):
104
+ class TestCharacterJournalManagerAnnotations(LedgerTestCase):
105
+ """Test annotation methods in CharacterJournalManager."""
106
+
92
107
  @classmethod
93
108
  def setUpClass(cls):
94
109
  super().setUpClass()
95
- load_allianceauth()
96
- load_eveuniverse()
97
- load_eveentity()
98
- cls.audit = create_characteraudit_from_evecharacter(1001)
110
+ cls.audit = create_owner_from_user(user=cls.user)
99
111
 
100
112
  cls.eve_character_first_party = EveEntity.objects.get(eve_id=1001)
101
113
  cls.eve_character_second_party = EveEntity.objects.get(eve_id=1002)
102
114
 
103
115
  cls.journal_entry = create_wallet_journal_entry(
104
- journal_type="character",
116
+ owner_type="character",
105
117
  character=cls.audit,
106
118
  context_id=1,
107
119
  entry_id=10,
@@ -124,6 +136,7 @@ class TestCharacterJournalManagerAnnotations(TestCase):
124
136
  )
125
137
 
126
138
  def test_annotate_bounty_income(self):
139
+ """ "Test annotating bounty income."""
127
140
  qs = self.audit.ledger_character_journal.all().annotate_bounty_income()
128
141
  for obj in qs:
129
142
  self.assertTrue(
@@ -132,79 +145,8 @@ class TestCharacterJournalManagerAnnotations(TestCase):
132
145
  )
133
146
  self.assertEqual(obj.bounty_income, 0)
134
147
 
135
- def test_annotate_mission_income(self):
136
- qs = self.audit.ledger_character_journal.all().annotate_mission_income()
137
- for obj in qs:
138
- self.assertTrue(
139
- hasattr(obj, "mission_income"),
140
- "Mission income annotation should be present",
141
- )
142
- self.assertEqual(obj.mission_income, 0)
143
-
144
- def test_annotate_market_income(self):
145
- qs = self.audit.ledger_character_journal.all().annotate_market_income()
146
- for obj in qs:
147
- self.assertTrue(
148
- hasattr(obj, "market_income"),
149
- "Market income annotation should be present",
150
- )
151
- self.assertEqual(obj.market_income, 0)
152
-
153
- def test_annotate_incursion_income(self):
154
- qs = self.audit.ledger_character_journal.all().annotate_incursion_income()
155
- for obj in qs:
156
- self.assertTrue(
157
- hasattr(obj, "incursion_income"),
158
- "Incursion income annotation should be present",
159
- )
160
- self.assertEqual(obj.incursion_income, 0)
161
-
162
- def test_annotate_contract_income(self):
163
- qs = self.audit.ledger_character_journal.all().annotate_contract_income()
164
- for obj in qs:
165
- self.assertTrue(
166
- hasattr(obj, "contract_income"),
167
- "Contract income annotation should be present",
168
- )
169
- self.assertEqual(obj.contract_income, 0)
170
-
171
- def test_annotate_donation_income(self):
172
- qs = self.audit.ledger_character_journal.all().annotate_donation_income()
173
- for obj in qs:
174
- self.assertTrue(
175
- hasattr(obj, "donation_income"),
176
- "Donation income annotation should be present",
177
- )
178
- self.assertEqual(obj.donation_income, 1000.00)
179
-
180
- def test_annotate_insurance_income(self):
181
- qs = self.audit.ledger_character_journal.all().annotate_insurance_income()
182
- for obj in qs:
183
- self.assertTrue(
184
- hasattr(obj, "insurance_income"),
185
- "Insurance income annotation should be present",
186
- )
187
- self.assertEqual(obj.insurance_income, 0)
188
-
189
- def test_annotate_milestone_income(self):
190
- qs = self.audit.ledger_character_journal.all().annotate_milestone_income()
191
- for obj in qs:
192
- self.assertTrue(
193
- hasattr(obj, "milestone_income"),
194
- "Milestone income annotation should be present",
195
- )
196
- self.assertEqual(obj.milestone_income, 0)
197
-
198
- def test_annotate_daily_goal_income(self):
199
- qs = self.audit.ledger_character_journal.all().annotate_daily_goal_income()
200
- for obj in qs:
201
- self.assertTrue(
202
- hasattr(obj, "daily_goal_income"),
203
- "Daily goal income annotation should be present",
204
- )
205
- self.assertEqual(obj.daily_goal_income, 0)
206
-
207
148
  def test_annotate_miscellaneous_income(self):
149
+ """Test annotating miscellaneous income."""
208
150
  qs = self.audit.ledger_character_journal.all().annotate_miscellaneous()
209
151
  for obj in qs:
210
152
  self.assertTrue(
@@ -213,126 +155,20 @@ class TestCharacterJournalManagerAnnotations(TestCase):
213
155
  )
214
156
  self.assertEqual(obj.miscellaneous, 1000.00)
215
157
 
216
- def test_annotate_miscellaneous_exclude_donations(self):
217
- """Test including donations in miscellaneous annotation."""
218
- qs = (
219
- self.audit.ledger_character_journal.all().annotate_miscellaneous_exclude_donations()
220
- )
221
- for obj in qs:
222
- self.assertTrue(
223
- hasattr(obj, "miscellaneous"),
224
- "Miscellaneous with exclude annotation should be present",
225
- )
226
- self.assertEqual(obj.miscellaneous, 1000.00)
227
-
228
- def test_annotate_miscellaneous_exclude_donations_with_exclude(self):
229
- """Test excluding donations from miscellaneous annotation."""
230
- qs = self.audit.ledger_character_journal.all().annotate_miscellaneous_exclude_donations(
231
- exclude=1001
232
- )
233
- for obj in qs:
234
- self.assertTrue(
235
- hasattr(obj, "miscellaneous"),
236
- "Miscellaneous with exclude annotation should be present",
237
- )
238
- self.assertEqual(obj.miscellaneous, 0)
239
-
240
- def test_annotate_contract_cost(self):
241
- qs = self.audit.ledger_character_journal.all().annotate_contract_cost()
242
- for obj in qs:
243
- self.assertTrue(
244
- hasattr(obj, "contract_cost"),
245
- "Contract costs annotation should be present",
246
- )
247
- self.assertEqual(obj.contract_cost, 0)
248
-
249
- def test_annotate_market_cost(self):
250
- qs = self.audit.ledger_character_journal.all().annotate_market_cost()
251
- for obj in qs:
252
- self.assertTrue(
253
- hasattr(obj, "market_cost"),
254
- "Market costs annotation should be present",
255
- )
256
- self.assertEqual(obj.market_cost, 0)
257
-
258
- def test_annotate_asset_cost(self):
259
- qs = self.audit.ledger_character_journal.all().annotate_asset_cost()
260
- for obj in qs:
261
- self.assertTrue(
262
- hasattr(obj, "asset_cost"),
263
- "Asset costs annotation should be present",
264
- )
265
- self.assertEqual(obj.asset_cost, 0)
266
-
267
- def test_annotate_traveling_cost(self):
268
- qs = self.audit.ledger_character_journal.all().annotate_traveling_cost()
269
- for obj in qs:
270
- self.assertTrue(
271
- hasattr(obj, "traveling_cost"),
272
- "Traveling costs annotation should be present",
273
- )
274
- self.assertEqual(obj.traveling_cost, 0)
275
-
276
- def test_annotate_production_cost(self):
277
- qs = self.audit.ledger_character_journal.all().annotate_production_cost()
278
- for obj in qs:
279
- self.assertTrue(
280
- hasattr(obj, "production_cost"),
281
- "Production costs annotation should be present",
282
- )
283
- self.assertEqual(obj.production_cost, 0)
284
-
285
- def test_annotate_skill_cost(self):
286
- qs = self.audit.ledger_character_journal.all().annotate_skill_cost()
287
- for obj in qs:
288
- self.assertTrue(
289
- hasattr(obj, "skill_cost"),
290
- "Skill costs annotation should be present",
291
- )
292
- self.assertEqual(obj.skill_cost, 0)
293
-
294
- def test_annotate_insurance_cost(self):
295
- qs = self.audit.ledger_character_journal.all().annotate_insurance_cost()
296
- for obj in qs:
297
- self.assertTrue(
298
- hasattr(obj, "insurance_cost"),
299
- "Insurance costs annotation should be present",
300
- )
301
- self.assertEqual(obj.insurance_cost, 0)
302
-
303
- def test_annotate_planetary_cost(self):
304
- qs = self.audit.ledger_character_journal.all().annotate_planetary_cost()
305
- for obj in qs:
306
- self.assertTrue(
307
- hasattr(obj, "planetary_cost"),
308
- "Planetary costs annotation should be present",
309
- )
310
- self.assertEqual(obj.planetary_cost, 0)
311
-
312
- def test_annotate_lp_cost(self):
313
- qs = self.audit.ledger_character_journal.all().annotate_lp_cost()
314
- for obj in qs:
315
- self.assertTrue(
316
- hasattr(obj, "lp_cost"),
317
- "LP costs annotation should be present",
318
- )
319
- self.assertEqual(obj.lp_cost, 0)
320
158
 
159
+ class TestCharacterJournalManagerAggregate(LedgerTestCase):
160
+ """Test aggregation methods in CharacterJournalManager."""
321
161
 
322
- class TestCharacterJournalManagerAggregate(NoSocketsTestCase):
323
162
  @classmethod
324
163
  def setUpClass(cls):
325
164
  super().setUpClass()
326
- load_allianceauth()
327
- load_eveuniverse()
328
- load_eveentity()
329
- cls.audit = create_characteraudit_from_evecharacter(1001)
165
+ cls.audit = create_owner_from_user(user=cls.user)
330
166
 
331
167
  cls.eve_character_first_party = EveEntity.objects.get(eve_id=1001)
332
168
  cls.eve_character_second_party = EveEntity.objects.get(eve_id=1002)
333
169
 
334
170
  cls.journal_entry = create_wallet_journal_entry(
335
- journal_type="character",
171
+ owner_type="character",
336
172
  character=cls.audit,
337
173
  context_id=1,
338
174
  entry_id=10,
@@ -355,18 +191,22 @@ class TestCharacterJournalManagerAggregate(NoSocketsTestCase):
355
191
  )
356
192
 
357
193
  def test_aggregate_bounty(self):
194
+ """Test aggregating bounty income."""
358
195
  result = self.audit.ledger_character_journal.all().aggregate_bounty()
359
196
  self.assertEqual(result, 0)
360
197
 
361
198
  def test_aggregate_costs(self):
199
+ """Test aggregating costs."""
362
200
  result = self.audit.ledger_character_journal.all().aggregate_costs()
363
201
  self.assertEqual(result, 0)
364
202
 
365
203
  def test_aggregate_miscellaneous(self):
204
+ """Test aggregating miscellaneous income."""
366
205
  result = self.audit.ledger_character_journal.all().aggregate_miscellaneous()
367
206
  self.assertEqual(result, 1000.00)
368
207
 
369
208
  def test_aggregate_ref_type(self):
209
+ """Test aggregating by reference type."""
370
210
  result = self.audit.ledger_character_journal.all().aggregate_ref_type(
371
211
  ref_type=["player_donation"], income=True
372
212
  )