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
@@ -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
  )