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