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
@@ -0,0 +1,601 @@
1
+ # Standard Library
2
+ import datetime as dt
3
+ import random
4
+ import string
5
+
6
+ # Django
7
+ from django.contrib.auth.models import User
8
+
9
+ # Alliance Auth
10
+ from allianceauth.authentication.backends import StateBackend
11
+ from allianceauth.authentication.models import CharacterOwnership
12
+ from allianceauth.eveonline.models import EveCharacter
13
+ from allianceauth.tests.auth_utils import AuthUtils
14
+ from esi.models import Scope, Token
15
+
16
+ # Alliance Auth (External Libs)
17
+ from eveuniverse.models import EveEntity, EvePlanet, EveSolarSystem, EveType
18
+
19
+ # AA Ledger
20
+ from ledger.models.characteraudit import (
21
+ CharacterMiningLedger,
22
+ CharacterOwner,
23
+ CharacterUpdateStatus,
24
+ CharacterWalletJournalEntry,
25
+ )
26
+ from ledger.models.corporationaudit import (
27
+ CorporationOwner,
28
+ CorporationUpdateStatus,
29
+ CorporationWalletDivision,
30
+ CorporationWalletJournalEntry,
31
+ )
32
+ from ledger.models.planetary import CharacterPlanet, CharacterPlanetDetails
33
+
34
+
35
+ def dt_eveformat(my_dt: dt.datetime) -> str:
36
+ """Convert datetime to EVE Online ISO format (YYYY-MM-DDTHH:MM:SS)
37
+
38
+ Args:
39
+ my_dt (datetime): Input datetime
40
+ Returns:
41
+ str: datetime in EVE Online ISO format
42
+ """
43
+
44
+ my_dt_2 = dt.datetime(
45
+ my_dt.year, my_dt.month, my_dt.day, my_dt.hour, my_dt.minute, my_dt.second
46
+ )
47
+
48
+ return my_dt_2.isoformat()
49
+
50
+
51
+ def random_string(char_count: int) -> str:
52
+ """returns a random string of given length"""
53
+ return "".join(
54
+ random.choice(string.ascii_uppercase + string.digits) for _ in range(char_count)
55
+ )
56
+
57
+
58
+ def _generate_token(
59
+ character_id: int,
60
+ character_name: str,
61
+ owner_hash: str | None = None,
62
+ access_token: str = "access_token",
63
+ refresh_token: str = "refresh_token",
64
+ scopes: list | None = None,
65
+ timestamp_dt: dt.datetime | None = None,
66
+ expires_in: int = 1200,
67
+ ) -> dict:
68
+ """Generates the input to create a new SSO test token.
69
+
70
+ Args:
71
+ character_id (int): Character ID
72
+ character_name (str): Character Name
73
+ owner_hash (Optional[str], optional): Character Owner Hash. Defaults to None.
74
+ access_token (str, optional): Access Token string. Defaults to "access_token".
75
+ refresh_token (str, optional): Refresh Token string. Defaults to "refresh_token".
76
+ scopes (Optional[list], optional): List of scope names. Defaults to None.
77
+ timestamp_dt (Optional[dt.datetime], optional): Timestamp datetime. Defaults to None.
78
+ expires_in (int, optional): Expiry time in seconds. Defaults to 1200
79
+ Returns:
80
+ dict: The generated token dict
81
+ """
82
+ if timestamp_dt is None:
83
+ timestamp_dt = dt.datetime.utcnow()
84
+ if scopes is None:
85
+ scopes = [
86
+ "esi-mail.read_mail.v1",
87
+ "esi-wallet.read_character_wallet.v1",
88
+ "esi-universe.read_structures.v1",
89
+ ]
90
+ if owner_hash is None:
91
+ owner_hash = random_string(28)
92
+ token = {
93
+ "access_token": access_token,
94
+ "token_type": "Bearer",
95
+ "expires_in": expires_in,
96
+ "refresh_token": refresh_token,
97
+ "timestamp": int(timestamp_dt.timestamp()),
98
+ "CharacterID": character_id,
99
+ "CharacterName": character_name,
100
+ "ExpiresOn": dt_eveformat(timestamp_dt + dt.timedelta(seconds=expires_in)),
101
+ "Scopes": " ".join(list(scopes)),
102
+ "TokenType": "Character",
103
+ "CharacterOwnerHash": owner_hash,
104
+ "IntellectualProperty": "EVE",
105
+ }
106
+ return token
107
+
108
+
109
+ def _store_as_Token(token: dict, user: object) -> Token:
110
+ """Stores a generated token dict as Token object for given user
111
+
112
+ Args:
113
+ token (dict): Generated token dict
114
+ user (User): Alliance Auth User
115
+ Returns:
116
+ Token: The created Token object
117
+ """
118
+ character_tokens = user.token_set.filter(character_id=token["CharacterID"])
119
+ if character_tokens.exists():
120
+ token["CharacterOwnerHash"] = character_tokens.first().character_owner_hash
121
+ obj = Token.objects.create(
122
+ access_token=token["access_token"],
123
+ refresh_token=token["refresh_token"],
124
+ user=user,
125
+ character_id=token["CharacterID"],
126
+ character_name=token["CharacterName"],
127
+ token_type=token["TokenType"],
128
+ character_owner_hash=token["CharacterOwnerHash"],
129
+ )
130
+ for scope_name in token["Scopes"].split(" "):
131
+ scope, _ = Scope.objects.get_or_create(name=scope_name)
132
+ obj.scopes.add(scope)
133
+ return obj
134
+
135
+
136
+ def add_new_token(
137
+ user: User,
138
+ character: EveCharacter,
139
+ scopes: list[str] | None = None,
140
+ owner_hash: str | None = None,
141
+ ) -> Token:
142
+ """Generate a new token for a user based on a character and makes the given user it's owner.
143
+
144
+ Args:
145
+ user: Alliance Auth User
146
+ character: EveCharacter to create the token for
147
+ scopes: list of scope names
148
+ owner_hash: optional owner hash to use for the token
149
+ Returns:
150
+ Token: The created Token object
151
+ """
152
+ return _store_as_Token(
153
+ _generate_token(
154
+ character_id=character.character_id,
155
+ character_name=character.character_name,
156
+ owner_hash=owner_hash,
157
+ scopes=scopes,
158
+ ),
159
+ user,
160
+ )
161
+
162
+
163
+ def add_character_to_user(
164
+ user: User,
165
+ character: EveCharacter,
166
+ is_main: bool = False,
167
+ scopes: list[str] | None = None,
168
+ disconnect_signals: bool = False,
169
+ ) -> CharacterOwnership:
170
+ """Add an existing :class:`EveCharacter` to a User, optionally as main character.
171
+
172
+ Args:
173
+ user (User): The User to whom the EveCharacter will be added.
174
+ character (EveCharacter): The EveCharacter to add to the User.
175
+ is_main (bool, optional): Whether to set the EveCharacter as the User's main
176
+ character. Defaults to ``False``.
177
+ scopes (list[str] | None, optional): List of scope names to assign to the
178
+ character's token. If ``None``, defaults to `["publicData"]`. Defaults to ``None``.
179
+ disconnect_signals (bool, optional): Whether to disconnect signals during
180
+ the addition. Defaults to ``False``.
181
+ Returns:
182
+ CharacterOwnership: The created CharacterOwnership instance.
183
+ """
184
+
185
+ if not scopes:
186
+ scopes = ["publicData"]
187
+
188
+ if disconnect_signals:
189
+ AuthUtils.disconnect_signals()
190
+
191
+ add_new_token(user, character, scopes)
192
+
193
+ if is_main:
194
+ user.profile.main_character = character
195
+ user.profile.save()
196
+ user.save()
197
+
198
+ if disconnect_signals:
199
+ AuthUtils.connect_signals()
200
+
201
+ return CharacterOwnership.objects.get(user=user, character=character)
202
+
203
+
204
+ def create_user_from_evecharacter(
205
+ character_id: int,
206
+ permissions: list[str] | None = None,
207
+ scopes: list[str] | None = None,
208
+ ) -> tuple[User, CharacterOwnership]:
209
+ """Create new allianceauth user from EveCharacter object.
210
+
211
+ Args:
212
+ character_id (int): ID of eve character
213
+ permissions (list[str] | None): list of permission names, e.g. `"my_app.my_permission"`
214
+ scopes (list[str] | None): list of scope names
215
+ Returns:
216
+ tuple(User, CharacterOwnership): Created Alliance Auth User and CharacterOwnership
217
+ """
218
+ auth_character = EveCharacter.objects.get(character_id=character_id)
219
+ user = AuthUtils.create_user(auth_character.character_name.replace(" ", "_"))
220
+ character_ownership = add_character_to_user(
221
+ user, auth_character, is_main=True, scopes=scopes
222
+ )
223
+ if permissions:
224
+ for permission_name in permissions:
225
+ user = AuthUtils.add_permission_to_user_by_name(permission_name, user)
226
+ return user, character_ownership
227
+
228
+
229
+ def add_permission_to_user(
230
+ user: User,
231
+ permissions: list[str] | None = None,
232
+ ) -> User:
233
+ """Add permission to existing allianceauth user.
234
+ Args:
235
+ user (User): Alliance Auth User
236
+ permissions (list[str] | None): list of permission names, e.g. `"my_app.my_permission"`
237
+ Returns:
238
+ User: Updated Alliance Auth User
239
+ """
240
+ if permissions:
241
+ for permission_name in permissions:
242
+ user = AuthUtils.add_permission_to_user_by_name(permission_name, user)
243
+ return user
244
+ raise ValueError("No permissions provided to add to user.")
245
+
246
+
247
+ def create_ledger_owner(
248
+ eve_character: EveCharacter, owner_type="character", **kwargs
249
+ ) -> CharacterOwner | CorporationOwner:
250
+ """
251
+ Create a Ledger Owner (CharacterOwner or CorporationOwner) from an EveCharacter.
252
+ The type of owner created depends on the owner_type parameter.
253
+ Args:
254
+ eve_character (EveCharacter): The EveCharacter to create the owner from.
255
+ owner_type (str, optional): Type of owner, either "character" or "corporation"
256
+ Returns:
257
+ (CharacterOwner or CorporationOwner): The created ledger owner.
258
+
259
+ """
260
+ if owner_type == "character":
261
+ defaults = {
262
+ "character_name": eve_character.character_name,
263
+ }
264
+ defaults.update(kwargs)
265
+ owner = CharacterOwner.objects.get_or_create(
266
+ eve_character=eve_character,
267
+ defaults=defaults,
268
+ )[0]
269
+ return owner
270
+ if owner_type == "corporation":
271
+ defaults = {
272
+ "corporation_name": eve_character.corporation.corporation_name,
273
+ }
274
+ defaults.update(kwargs)
275
+ owner = CorporationOwner.objects.get_or_create(
276
+ eve_corporation=eve_character.corporation,
277
+ defaults=defaults,
278
+ )[0]
279
+ return owner
280
+ raise ValueError("owner_type must be either 'character' or 'corporation'")
281
+
282
+
283
+ def create_update_status(
284
+ owner: CharacterOwner,
285
+ section: str,
286
+ error_message="",
287
+ owner_type="character",
288
+ **kwargs,
289
+ ) -> CharacterUpdateStatus | CorporationUpdateStatus:
290
+ """
291
+ Create an Update Status for a CharacterOwner or CorporationOwner.
292
+ The type of update status created depends on the owner_type parameter.
293
+
294
+ Args:
295
+ owner (CharacterOwner | CorporationOwner): The owner for whom to create the update status.
296
+ section (str): The section for the update status.
297
+ error_message (str, optional): The error message for the update status.
298
+ tax_type (str, optional): Type of tax owner, either "corporation" or "alliance"
299
+ **kwargs: Additional fields for the Update Status
300
+ Returns:
301
+ (CharacterUpdateStatus or CorporationUpdateStatus): The created update status.
302
+ """
303
+ params = {
304
+ "owner": owner,
305
+ "section": section,
306
+ "error_message": error_message,
307
+ }
308
+ params.update(kwargs)
309
+ if owner_type == "corporation":
310
+ update_status = CorporationUpdateStatus(**params)
311
+ else:
312
+ update_status = CharacterUpdateStatus(**params)
313
+ update_status.save()
314
+ return update_status
315
+
316
+
317
+ def create_owner_from_user(
318
+ user: User, owner_type="character", **kwargs
319
+ ) -> CharacterOwner | CorporationOwner:
320
+ """
321
+ Create a CharacterOwner or CorporationOwner from a user.
322
+ The type of owner created depends on the owner_type parameter.
323
+
324
+ Args:
325
+ user (User): The user to create the owner from.
326
+ owner_type (str): Type of owner, either "character" or "corporation"
327
+ """
328
+ eve_character = user.profile.main_character
329
+ if not eve_character:
330
+ raise ValueError("User needs to have a main character.")
331
+
332
+ return create_ledger_owner(eve_character, owner_type=owner_type, **kwargs)
333
+
334
+
335
+ def create_owner_from_evecharacter(
336
+ character_id: int, owner_type="character", **kwargs
337
+ ) -> CharacterOwner | CorporationOwner:
338
+ """
339
+ Create a CharacterOwner or CorporationOwner from an existing EveCharacter.
340
+ The type of owner created depends on the owner_type parameter.
341
+
342
+ Args:
343
+ character_id (int): ID of the EveCharacter to create the owner from.
344
+ owner_type (str): Type of owner, either "character" or "corporation"
345
+ Returns:
346
+ CharacterOwner | CorporationOwner: The created ledger owner.
347
+ """
348
+
349
+ _, character_ownership = create_user_from_evecharacter_with_access(
350
+ character_id, disconnect_signals=True
351
+ )
352
+ return create_ledger_owner(
353
+ character_ownership.character, owner_type=owner_type, **kwargs
354
+ )
355
+
356
+
357
+ def create_user_from_evecharacter_with_access(
358
+ character_id: int, disconnect_signals: bool = True, owner_type="character"
359
+ ) -> tuple[User, CharacterOwnership]:
360
+ """
361
+ Create user with basic access from an existing EveCharacter and use it as main.
362
+
363
+ Args:
364
+ character_id (int): ID of eve character
365
+ disconnect_signals (bool, optional): Whether to disconnect signals during user creation. Defaults to True.
366
+ owner_type (str, optional): Type of owner, either "character" or "corporation"
367
+ Returns:
368
+ tuple(User, CharacterOwnership): Created Alliance Auth User and CharacterOwnership
369
+ """
370
+ auth_character = EveCharacter.objects.get(character_id=character_id)
371
+ username = StateBackend.iterate_username(auth_character.character_name)
372
+ user = AuthUtils.create_user(username, disconnect_signals=disconnect_signals)
373
+ user = AuthUtils.add_permission_to_user_by_name(
374
+ "ledger.basic_access", user, disconnect_signals=disconnect_signals
375
+ )
376
+
377
+ if owner_type == "character":
378
+ scopes = CharacterOwner.get_esi_scopes()
379
+ else:
380
+ scopes = CorporationOwner.get_esi_scopes()
381
+
382
+ character_ownership = add_character_to_user(
383
+ user,
384
+ auth_character,
385
+ is_main=True,
386
+ scopes=scopes,
387
+ disconnect_signals=disconnect_signals,
388
+ )
389
+ return user, character_ownership
390
+
391
+
392
+ def add_new_permission_to_user(
393
+ user: User,
394
+ permission_name: str,
395
+ disconnect_signals: bool = True,
396
+ ) -> User:
397
+ """Add a new permission to an existing allianceauth user.
398
+
399
+ Args:
400
+ user (User): Alliance Auth User
401
+ permission_name (str): Permission name, e.g. `"my_app.my_permission"`
402
+ disconnect_signals (bool, optional): Whether to disconnect signals during addition. Defaults to True.
403
+ Returns:
404
+ User: Updated Alliance Auth User
405
+ """
406
+ return AuthUtils.add_permission_to_user_by_name(
407
+ permission_name, user, disconnect_signals=disconnect_signals
408
+ )
409
+
410
+
411
+ def add_auth_character_to_user(
412
+ user: User,
413
+ character_id: int,
414
+ disconnect_signals: bool = True,
415
+ owner_type="character",
416
+ ) -> CharacterOwnership:
417
+ """Add an existing :class:`EveCharacter` to a User.
418
+
419
+ Args:
420
+ user (User): Alliance Auth User
421
+ character_id (int): ID of eve character
422
+ disconnect_signals (bool, optional): Whether to disconnect signals during addition. Defaults to True.
423
+ owner_type (str, optional): Type of owner, either "character" or "corporation"
424
+ Returns:
425
+ CharacterOwnership: The created CharacterOwnership instance.
426
+ """
427
+ auth_character = EveCharacter.objects.get(character_id=character_id)
428
+
429
+ if owner_type == "character":
430
+ scopes = CharacterOwner.get_esi_scopes()
431
+ else:
432
+ scopes = CorporationOwner.get_esi_scopes()
433
+
434
+ return add_character_to_user(
435
+ user,
436
+ auth_character,
437
+ is_main=False,
438
+ scopes=scopes,
439
+ disconnect_signals=disconnect_signals,
440
+ )
441
+
442
+
443
+ def add_owner_to_user(
444
+ user: User,
445
+ character_id: int,
446
+ disconnect_signals: bool = True,
447
+ owner_type="character",
448
+ **kwargs,
449
+ ) -> CharacterOwner | CorporationOwner:
450
+ """
451
+ Add a CharacterOwner or CorporationOwner character to a user.
452
+ The type of owner created depends on the owner_type parameter.
453
+
454
+ Args:
455
+ user (User): Alliance Auth User
456
+ character_id (int): ID of eve character
457
+ disconnect_signals (bool, optional): Whether to disconnect signals during addition. Defaults to True.
458
+ owner_type (str): Type of owner, either "character" or "corporation"
459
+ Returns:
460
+ CharacterOwner | CorporationOwner: The created owner.
461
+ """
462
+ character_ownership = add_auth_character_to_user(
463
+ user,
464
+ character_id,
465
+ disconnect_signals=disconnect_signals,
466
+ )
467
+ return create_ledger_owner(
468
+ character_ownership.character, owner_type=owner_type, **kwargs
469
+ )
470
+
471
+
472
+ def create_miningledger(
473
+ character: CharacterOwner,
474
+ id: int,
475
+ date: str,
476
+ type: EveType,
477
+ system: EveSolarSystem,
478
+ quantity: int,
479
+ **kwargs,
480
+ ) -> CharacterMiningLedger:
481
+ """
482
+ Create a CharacterMiningLedger
483
+
484
+ Args:
485
+ character (CharacterOwner): The character.
486
+ id (int): The ID of the mining ledger.
487
+ date (str): The date of the mining ledger.
488
+ type (EveType): The type of the mined item.
489
+ system (EveSolarSystem): The solar system where mining took place.
490
+ quantity (int): The quantity mined.
491
+ **kwargs: Fields for the CharacterMiningLedger
492
+ Returns:
493
+ CharacterMiningLedger: The created mining ledger.
494
+ """
495
+ params = {
496
+ "character": character,
497
+ "id": id,
498
+ "date": date,
499
+ "type": type,
500
+ "system": system,
501
+ "quantity": quantity,
502
+ }
503
+ params.update(kwargs)
504
+ mining_ledger = CharacterMiningLedger(**params)
505
+ mining_ledger.save()
506
+ return mining_ledger
507
+
508
+
509
+ def create_division(
510
+ corporation: CorporationOwner, balance: float, division_id: int, **kwargs
511
+ ) -> CorporationWalletDivision:
512
+ """
513
+ Create a CorporationWalletDivision
514
+
515
+ Args:
516
+ corporation (CorporationOwner): The corporation.
517
+ balance (float): The balance of the division.
518
+ division_id (int): The division ID.
519
+ **kwargs: Fields for the CorporationWalletDivision
520
+ Returns:
521
+ CorporationWalletDivision: The created division.
522
+ """
523
+ params = {
524
+ "corporation": corporation,
525
+ "balance": balance,
526
+ "division_id": division_id,
527
+ }
528
+ params.update(kwargs)
529
+ division = CorporationWalletDivision(**params)
530
+ division.save()
531
+ return division
532
+
533
+
534
+ def create_wallet_journal_entry(
535
+ date: str,
536
+ description: str,
537
+ first_party: EveEntity,
538
+ second_party: EveEntity,
539
+ entry_id: int,
540
+ ref_type: str,
541
+ owner_type="character",
542
+ **kwargs,
543
+ ) -> CorporationWalletJournalEntry:
544
+ """
545
+ Create a CorporationWalletJournalEntry
546
+
547
+ Args:
548
+ division (CorporationWalletDivision): The division.
549
+ date (str): The date of the journal entry.
550
+ description (str): The description of the journal entry.
551
+ first_party (EveEntity): The first party entity.
552
+ second_party (EveEntity): The second party entity.
553
+ entry_id (int): The entry ID.
554
+ ref_type (str): The reference type.
555
+ **kwargs: Fields for the CorporationWalletJournalEntry
556
+ Returns:
557
+ CorporationWalletJournalEntry: The created journal entry.
558
+ """
559
+ params = {
560
+ "date": date,
561
+ "description": description,
562
+ "first_party": first_party,
563
+ "second_party": second_party,
564
+ "entry_id": entry_id,
565
+ "ref_type": ref_type,
566
+ }
567
+ params.update(kwargs)
568
+ if owner_type == "corporation":
569
+ journal_entry = CorporationWalletJournalEntry(**params)
570
+ else:
571
+ journal_entry = CharacterWalletJournalEntry(**params)
572
+ journal_entry.save()
573
+ return journal_entry
574
+
575
+
576
+ def create_character_planet(
577
+ owner: CharacterOwner, planet_id: int, **kwargs
578
+ ) -> CharacterPlanet:
579
+ """Create a CharacterPlanet from CharacterOwner and planet_id."""
580
+ params = {
581
+ "character": owner,
582
+ "eve_planet": EvePlanet.objects.get(id=planet_id),
583
+ }
584
+ params.update(kwargs)
585
+ planet = CharacterPlanet(**params)
586
+ planet.save()
587
+ return planet
588
+
589
+
590
+ def create_character_planet_details(
591
+ planet: CharacterPlanet, **kwargs
592
+ ) -> CharacterPlanetDetails:
593
+ """Create a CharacterPlanetDetails from CharacterPlanet."""
594
+ params = {
595
+ "character": planet.character,
596
+ "planet": planet,
597
+ }
598
+ params.update(kwargs)
599
+ planetdetails = CharacterPlanetDetails(**params)
600
+ planetdetails.save()
601
+ return planetdetails