django-esi 8.0.0b1__py3-none-any.whl → 8.0.0b2__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.
Potentially problematic release.
This version of django-esi might be problematic. Click here for more details.
- {django_esi-8.0.0b1.dist-info → django_esi-8.0.0b2.dist-info}/METADATA +3 -2
- {django_esi-8.0.0b1.dist-info → django_esi-8.0.0b2.dist-info}/RECORD +46 -45
- esi/__init__.py +1 -1
- esi/aiopenapi3/plugins.py +12 -2
- esi/clients.py +41 -1
- esi/decorators.py +26 -10
- esi/exceptions.py +7 -3
- esi/helpers.py +1 -0
- esi/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
- esi/locale/cs_CZ/LC_MESSAGES/django.po +2 -2
- esi/locale/de/LC_MESSAGES/django.mo +0 -0
- esi/locale/de/LC_MESSAGES/django.po +2 -2
- esi/locale/en/LC_MESSAGES/django.mo +0 -0
- esi/locale/en/LC_MESSAGES/django.po +2 -2
- esi/locale/es/LC_MESSAGES/django.mo +0 -0
- esi/locale/es/LC_MESSAGES/django.po +2 -2
- esi/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
- esi/locale/fr_FR/LC_MESSAGES/django.po +2 -2
- esi/locale/it_IT/LC_MESSAGES/django.mo +0 -0
- esi/locale/it_IT/LC_MESSAGES/django.po +2 -2
- esi/locale/ja/LC_MESSAGES/django.mo +0 -0
- esi/locale/ja/LC_MESSAGES/django.po +2 -2
- esi/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
- esi/locale/ko_KR/LC_MESSAGES/django.po +2 -2
- esi/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
- esi/locale/nl_NL/LC_MESSAGES/django.po +2 -2
- esi/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
- esi/locale/pl_PL/LC_MESSAGES/django.po +2 -2
- esi/locale/ru/LC_MESSAGES/django.mo +0 -0
- esi/locale/ru/LC_MESSAGES/django.po +2 -2
- esi/locale/sk/LC_MESSAGES/django.mo +0 -0
- esi/locale/sk/LC_MESSAGES/django.po +2 -2
- esi/locale/uk/LC_MESSAGES/django.mo +0 -0
- esi/locale/uk/LC_MESSAGES/django.po +2 -2
- esi/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- esi/locale/zh_Hans/LC_MESSAGES/django.po +2 -2
- esi/managers.pyi +3 -0
- esi/openapi_clients.py +139 -31
- esi/rate_limiting.py +50 -21
- esi/signals.py +21 -0
- esi/tests/__init__.py +30 -8
- esi/tests/test_decorators.py +61 -1
- esi/tests/test_openapi.json +65 -2
- esi/tests/test_openapi.py +387 -47
- {django_esi-8.0.0b1.dist-info → django_esi-8.0.0b2.dist-info}/WHEEL +0 -0
- {django_esi-8.0.0b1.dist-info → django_esi-8.0.0b2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-esi
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.0b2
|
|
4
4
|
Summary: Django app for accessing the EVE Swagger Interface (ESI).
|
|
5
5
|
Keywords: eveonline
|
|
6
6
|
Author-email: Alliance Auth <adarnof@gmail.com>
|
|
@@ -9,7 +9,6 @@ Description-Content-Type: text/markdown
|
|
|
9
9
|
Classifier: Environment :: Web Environment
|
|
10
10
|
Classifier: Framework :: Django
|
|
11
11
|
Classifier: Framework :: Django :: 4.2
|
|
12
|
-
Classifier: Framework :: Django :: 5.1
|
|
13
12
|
Classifier: Framework :: Django :: 5.2
|
|
14
13
|
Classifier: Intended Audience :: Developers
|
|
15
14
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
@@ -28,8 +27,10 @@ Requires-Dist: aiopenapi3
|
|
|
28
27
|
Requires-Dist: bravado>=10.6,<12
|
|
29
28
|
Requires-Dist: celery>=4.0.2
|
|
30
29
|
Requires-Dist: django>=4.2,<6
|
|
30
|
+
Requires-Dist: django-redis>=5.2
|
|
31
31
|
Requires-Dist: httpx[brotli, http2, zstd]
|
|
32
32
|
Requires-Dist: jsonschema<4
|
|
33
|
+
Requires-Dist: pydantic>=2.12.3
|
|
33
34
|
Requires-Dist: python-jose>=3.3
|
|
34
35
|
Requires-Dist: requests>=2.26
|
|
35
36
|
Requires-Dist: requests-oauthlib>=0.8
|
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
esi/__init__.py,sha256=
|
|
1
|
+
esi/__init__.py,sha256=LAZyiO_5dNVnNVqzSKrR9GaxMevoW_XH4GLTr0VO4pQ,204
|
|
2
2
|
esi/admin.py,sha256=9i68WwW_gR0zsGhJKTWK2yMEi44EkhpAaOW0LDpVfM8,1176
|
|
3
3
|
esi/app_settings.py,sha256=2Jp_1myzKCL8A20RYvwQnQd04Ds_CBGsCqwDtsrYf0M,4289
|
|
4
4
|
esi/apps.py,sha256=HIu1niTkOXYmCzMVAjYcaFhHrrXeBbHvui6I44OCHXw,280
|
|
5
5
|
esi/checks.py,sha256=31puQdsrpRUJB-kedp2k7Evo0x2knTWQPZsCUUrJ3dY,1912
|
|
6
|
-
esi/clients.py,sha256=
|
|
7
|
-
esi/decorators.py,sha256=
|
|
6
|
+
esi/clients.py,sha256=kFEV9T2GcfWRBhEM7njeantRR8g96LsXo6HNWeQCyoQ,25281
|
|
7
|
+
esi/decorators.py,sha256=OGGpbYaVZESk2BA9o69gBoBAdWUEGP1pUKohAEoykiM,10055
|
|
8
8
|
esi/errors.py,sha256=KfFtgX8Mys4uMoQtco0n_pQeaM83yVrRSyW6StXuUjo,308
|
|
9
|
-
esi/exceptions.py,sha256
|
|
10
|
-
esi/helpers.py,sha256=
|
|
9
|
+
esi/exceptions.py,sha256=-6aAr1JNEeOcVcVteDvSPopQkv5kGEj5sjnUlcJWTZQ,1506
|
|
10
|
+
esi/helpers.py,sha256=GZoDNTjZ0adW1ukhuGY1o58s_sZbvjhbVaJS95wZKpg,2207
|
|
11
11
|
esi/managers.py,sha256=zdri1aSJrSX9W_kwzbXq44CAAhdufikoOViaJntA41A,11443
|
|
12
|
-
esi/managers.pyi,sha256=
|
|
12
|
+
esi/managers.pyi,sha256=3_GxkRNXK3OzvaTrgW31Syhsns1UBKjr669iFKuhxQE,2065
|
|
13
13
|
esi/models.py,sha256=MEY8jmHGwA8ZJjq37h-vC8LnOVn_Mnv5Gw0NoI9tkXk,11484
|
|
14
|
-
esi/openapi_clients.py,sha256=
|
|
15
|
-
esi/rate_limiting.py,sha256=
|
|
14
|
+
esi/openapi_clients.py,sha256=hMeFzsovT_tC4x8f9a6u4LaUnL2QIKsKZILGlsCAWEg,45525
|
|
15
|
+
esi/rate_limiting.py,sha256=0lbFyRWbw2dPjJLXMEix8PDNh7nuAw8INaGf2cQaFDU,3353
|
|
16
|
+
esi/signals.py,sha256=JQbkrL9l0EbKoB1EgFl8CwFBlZ2GmWBM5HUp3Rc1uYw,512
|
|
16
17
|
esi/stubs.py,sha256=UakysEAq5V454oKbxyEUewncr5sCFZCgwHFh0SJvU3Y,30
|
|
17
18
|
esi/stubs.pyi,sha256=ua9zHzZtrWct1mj_UV1pN7HJyA2RxqWPYapL7DQMRYA,244089
|
|
18
19
|
esi/tasks.py,sha256=TaE_Q03oLk1ohkPw8KknXpIK-nY47C-oaGUUu4nr8pw,2658
|
|
19
20
|
esi/urls.py,sha256=B4EnmT-MZzs4F8a9ORK1ejAHbpGRN_V4TKks8ww3JGE,151
|
|
20
21
|
esi/views.py,sha256=cq2JkqSAwx-Nqi3amRUA9CKLu3ZLQYHSAH8c8g7xIQ4,3917
|
|
21
|
-
esi/aiopenapi3/plugins.py,sha256=
|
|
22
|
-
esi/locale/cs_CZ/LC_MESSAGES/django.mo,sha256=
|
|
23
|
-
esi/locale/cs_CZ/LC_MESSAGES/django.po,sha256=
|
|
24
|
-
esi/locale/de/LC_MESSAGES/django.mo,sha256=
|
|
25
|
-
esi/locale/de/LC_MESSAGES/django.po,sha256=
|
|
26
|
-
esi/locale/en/LC_MESSAGES/django.mo,sha256=
|
|
27
|
-
esi/locale/en/LC_MESSAGES/django.po,sha256=
|
|
28
|
-
esi/locale/es/LC_MESSAGES/django.mo,sha256=
|
|
29
|
-
esi/locale/es/LC_MESSAGES/django.po,sha256=
|
|
30
|
-
esi/locale/fr_FR/LC_MESSAGES/django.mo,sha256=
|
|
31
|
-
esi/locale/fr_FR/LC_MESSAGES/django.po,sha256=
|
|
32
|
-
esi/locale/it_IT/LC_MESSAGES/django.mo,sha256=
|
|
33
|
-
esi/locale/it_IT/LC_MESSAGES/django.po,sha256=
|
|
34
|
-
esi/locale/ja/LC_MESSAGES/django.mo,sha256=
|
|
35
|
-
esi/locale/ja/LC_MESSAGES/django.po,sha256=
|
|
36
|
-
esi/locale/ko_KR/LC_MESSAGES/django.mo,sha256=
|
|
37
|
-
esi/locale/ko_KR/LC_MESSAGES/django.po,sha256=
|
|
38
|
-
esi/locale/nl_NL/LC_MESSAGES/django.mo,sha256=
|
|
39
|
-
esi/locale/nl_NL/LC_MESSAGES/django.po,sha256=
|
|
40
|
-
esi/locale/pl_PL/LC_MESSAGES/django.mo,sha256=
|
|
41
|
-
esi/locale/pl_PL/LC_MESSAGES/django.po,sha256=
|
|
42
|
-
esi/locale/ru/LC_MESSAGES/django.mo,sha256=
|
|
43
|
-
esi/locale/ru/LC_MESSAGES/django.po,sha256=
|
|
44
|
-
esi/locale/sk/LC_MESSAGES/django.mo,sha256=
|
|
45
|
-
esi/locale/sk/LC_MESSAGES/django.po,sha256=
|
|
46
|
-
esi/locale/uk/LC_MESSAGES/django.mo,sha256=
|
|
47
|
-
esi/locale/uk/LC_MESSAGES/django.po,sha256
|
|
48
|
-
esi/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=
|
|
49
|
-
esi/locale/zh_Hans/LC_MESSAGES/django.po,sha256=
|
|
22
|
+
esi/aiopenapi3/plugins.py,sha256=YpDn5cRLi6t9dtpnmSHo-Wl6Or4R0LRQY22ZKWLFolk,8269
|
|
23
|
+
esi/locale/cs_CZ/LC_MESSAGES/django.mo,sha256=3a89M28nD3rnPeG3u0p9XZrasew2oDpvg0dRhlwW5l4,391
|
|
24
|
+
esi/locale/cs_CZ/LC_MESSAGES/django.po,sha256=4-C8ELza_J3-ExnfMx1-XD1l6LA01IYxLeKra1FID4A,1317
|
|
25
|
+
esi/locale/de/LC_MESSAGES/django.mo,sha256=a9XLVfAxszxPY0DQegtSG6VJzV5QhdXZH1LdZa8t7Kw,874
|
|
26
|
+
esi/locale/de/LC_MESSAGES/django.po,sha256=QWBbIAxSEPEGZ2y2G3Ox8sw7ye3WrZBG-bigZFS__ZA,1563
|
|
27
|
+
esi/locale/en/LC_MESSAGES/django.mo,sha256=AcLiFv8Ch9eSXQY4XXFJILtnWuMW5xsTc41U7bf02Zw,434
|
|
28
|
+
esi/locale/en/LC_MESSAGES/django.po,sha256=UoFGhStLCb53j8jFDZFj2RPnRzZK31x2If-unnXrUcI,1364
|
|
29
|
+
esi/locale/es/LC_MESSAGES/django.mo,sha256=PUG8ZeipGOVYeOHzwum1CmgPLfOO0T2Fbw0w0XoRMxE,791
|
|
30
|
+
esi/locale/es/LC_MESSAGES/django.po,sha256=2iMKh-JyFqKJzdFWP90qwaG6YZ9PNP-JpeaOEI4gAlM,1567
|
|
31
|
+
esi/locale/fr_FR/LC_MESSAGES/django.mo,sha256=IVLtTvbYL1RSC2TUmQaS8XHqqq-nAieJ7y1iU2K5GEg,697
|
|
32
|
+
esi/locale/fr_FR/LC_MESSAGES/django.po,sha256=zohifdzM0Id0eD-tDsAUfSv6ivhlIR09IqjlUhQPZU0,1576
|
|
33
|
+
esi/locale/it_IT/LC_MESSAGES/django.mo,sha256=74zINJDrN03tah_3hs5OxtrqOwGGCQqJHj0Q_fdZkRg,931
|
|
34
|
+
esi/locale/it_IT/LC_MESSAGES/django.po,sha256=k-SUOUQUWoIVzZjQDPJZPDnyHznBVDsv__OAy9-qFgc,1623
|
|
35
|
+
esi/locale/ja/LC_MESSAGES/django.mo,sha256=3UhDTEtBm6XdY_NBtNGwpoKQvzgPJVc-E4bBST4LuXg,761
|
|
36
|
+
esi/locale/ja/LC_MESSAGES/django.po,sha256=zWf0y38JbzlVVaENvK16emzSlFGdTwM2b9ap4NOWsE8,1536
|
|
37
|
+
esi/locale/ko_KR/LC_MESSAGES/django.mo,sha256=wUhdQt0lbIhzilvTIF2u2CLqx25IUQIs_I2dok5ldT0,800
|
|
38
|
+
esi/locale/ko_KR/LC_MESSAGES/django.po,sha256=YPTvyMEmJPdvCwPuJYZb0hU4-LEoF9Cd_gLt8J4SA1s,1571
|
|
39
|
+
esi/locale/nl_NL/LC_MESSAGES/django.mo,sha256=3a89M28nD3rnPeG3u0p9XZrasew2oDpvg0dRhlwW5l4,391
|
|
40
|
+
esi/locale/nl_NL/LC_MESSAGES/django.po,sha256=4-C8ELza_J3-ExnfMx1-XD1l6LA01IYxLeKra1FID4A,1317
|
|
41
|
+
esi/locale/pl_PL/LC_MESSAGES/django.mo,sha256=3a89M28nD3rnPeG3u0p9XZrasew2oDpvg0dRhlwW5l4,391
|
|
42
|
+
esi/locale/pl_PL/LC_MESSAGES/django.po,sha256=4-C8ELza_J3-ExnfMx1-XD1l6LA01IYxLeKra1FID4A,1317
|
|
43
|
+
esi/locale/ru/LC_MESSAGES/django.mo,sha256=fpU4q7cD7UUd7EXqxSkRinujmqaHw56mJilBeA-6JlU,1128
|
|
44
|
+
esi/locale/ru/LC_MESSAGES/django.po,sha256=1UrIOg2Ff4IaKnApdXULs__XcgRHYC0-I7R4qxNdC_A,1878
|
|
45
|
+
esi/locale/sk/LC_MESSAGES/django.mo,sha256=U1ACkWEmbwABZ7SoLiRyE7a2exXUoezT-F3mwIJ2se0,509
|
|
46
|
+
esi/locale/sk/LC_MESSAGES/django.po,sha256=g3DYCmxk_L7Q8V_BHgcAdQp4Ct5e6hPlrUiTDakNwO0,1442
|
|
47
|
+
esi/locale/uk/LC_MESSAGES/django.mo,sha256=M94bI7wiqPEHODk0MiuXvcvwkHsbJjml-JNtXKwBw5Q,656
|
|
48
|
+
esi/locale/uk/LC_MESSAGES/django.po,sha256=1ylXyZuZZx6ZNdLVfvm7mROkjs9VqUYpgK5m_4qR948,1595
|
|
49
|
+
esi/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=P-oIXYliRFn9qWM1cBbBbkg0bnLN_pKTfHLiwlPN2xw,735
|
|
50
|
+
esi/locale/zh_Hans/LC_MESSAGES/django.po,sha256=AN10U8DZ0LsIN8_TmVHDXbgZM34nGmZ3ouM-55OVyi8,1511
|
|
50
51
|
esi/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
52
|
esi/management/commands/generate_esi_stubs.py,sha256=dunWHFSRb6NFu5emeDdskqIt3YqnEqQLBiuNERMkdmE,9798
|
|
52
53
|
esi/management/commands/migrate_to_ssov2.py,sha256=x9W4xaefrNoG_dNscHIWrWTRk4SuVGIW0s44q2QBN9k,6427
|
|
@@ -71,7 +72,7 @@ esi/static/esi/img/EVE_SSO_Login_Buttons_Small_White.png,sha256=al3NRjIngZtrNzEx
|
|
|
71
72
|
esi/templates/esi/select_token.html,sha256=qofOjKWHco_sSuoEJoLRsXP_doK_barHvkF7h5LLxjY,6941
|
|
72
73
|
esi/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
73
74
|
esi/templatetags/scope_tags.py,sha256=5-7vEwe-B91xo7oSnn-tSuudHSJCoGIhbddDpNrqUnw,167
|
|
74
|
-
esi/tests/__init__.py,sha256=
|
|
75
|
+
esi/tests/__init__.py,sha256=yecRpeG9tsVnyeKm6jEo2QcO2QeYJF_vOT5ACzfNSec,3704
|
|
75
76
|
esi/tests/client_authed_pilot.py,sha256=GN0J59TcscHM9HZH6OaPODM9Zel3mvObjJ4Dmmzc2j8,1622
|
|
76
77
|
esi/tests/client_public_pilot.py,sha256=u6P-qbdYSvQ6A_MJqt8Jrkswt-u-FlvYDKtCvA5-PMo,1252
|
|
77
78
|
esi/tests/factories.py,sha256=2pjkSYKDfO50bzX1nNcUHz_FAAJs7k07u7R8om6AlP0,1375
|
|
@@ -79,19 +80,19 @@ esi/tests/factories_2.py,sha256=25NqVe9zzHkl4U1EN3R7pjdN2ahIBXxrrJhQzZhvw58,1972
|
|
|
79
80
|
esi/tests/jwt_factory.py,sha256=0Jj9TjEv18h2XVsRpYc7BWHr3CPtQJgfKeB-9mdHevk,4919
|
|
80
81
|
esi/tests/test_checks.py,sha256=ntq2ijuJ-6pxGruNh21rM4GlXDLVm-o3sy8DrFbjwEM,1846
|
|
81
82
|
esi/tests/test_clients.py,sha256=qoiv3OztuhjizNknZplJhwnMzAlX689MGad4Azu809M,44163
|
|
82
|
-
esi/tests/test_decorators.py,sha256=
|
|
83
|
+
esi/tests/test_decorators.py,sha256=XvnubUR7ue3tG2chc2rSMw737tCN6r7SYxf-V8KJED8,16595
|
|
83
84
|
esi/tests/test_management_command.py,sha256=mtxfBtG6CHP1bTy1tJEO-djX4SQwMT3T_mqGnUIM6qs,9863
|
|
84
85
|
esi/tests/test_managers.py,sha256=CEpjXSXyVY6xxgrs0f9FnEh-KY9JPaKjKYiutXLLShE,24309
|
|
85
86
|
esi/tests/test_models.py,sha256=lDj5IcYgXHeOFTHXTsWGg13CSooFaxD0c51kJn_ytAc,13748
|
|
86
|
-
esi/tests/test_openapi.json,sha256=
|
|
87
|
-
esi/tests/test_openapi.py,sha256=
|
|
87
|
+
esi/tests/test_openapi.json,sha256=3jGT9Vo75wEOqJY1Iy4_uJSJfEs8iwSv107fIsspWM8,13901
|
|
88
|
+
esi/tests/test_openapi.py,sha256=XERYRw-cFbb2XCuW28AEybsTcT-_up9wEumcL57Nexw,22837
|
|
88
89
|
esi/tests/test_swagger.json,sha256=HOrPgbvwm5N521QNcE3baWcZJkSjmuN_VWrR06wEQoo,17241
|
|
89
90
|
esi/tests/test_swagger_full.json,sha256=JCEAZNMFhkdZhquTx4lDhrqGgCrzzzlYU64HdbEv8E4,2548369
|
|
90
91
|
esi/tests/test_tasks.py,sha256=nIvfXax_8nQCxNQeT-4TJ84i0__t1qWe155z5rnsktQ,4399
|
|
91
92
|
esi/tests/test_templatetags.py,sha256=b68JWE3HvOlr2aUisJHsTsDS4e7IMjDeqTuzMqC7Re4,517
|
|
92
93
|
esi/tests/test_views.py,sha256=Kj_f2yIpmPG0kx-lAX_sfkaHlIpgbkm02ieA1V3o-k4,13073
|
|
93
94
|
esi/tests/threading_pilot.py,sha256=ax_dEdnTNibA-UQHqbZle_2dh_3jcHKRyrYSOKuE_6U,1931
|
|
94
|
-
django_esi-8.0.
|
|
95
|
-
django_esi-8.0.
|
|
96
|
-
django_esi-8.0.
|
|
97
|
-
django_esi-8.0.
|
|
95
|
+
django_esi-8.0.0b2.dist-info/licenses/LICENSE,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
|
|
96
|
+
django_esi-8.0.0b2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
97
|
+
django_esi-8.0.0b2.dist-info/METADATA,sha256=JYa14wSYhfIBFbXE5gInFnIMEcJf2b2_21NQUQc0dq4,4815
|
|
98
|
+
django_esi-8.0.0b2.dist-info/RECORD,,
|
esi/__init__.py
CHANGED
esi/aiopenapi3/plugins.py
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import Any
|
|
3
|
+
|
|
3
4
|
from collections.abc import Generator
|
|
5
|
+
from django.conf import settings
|
|
6
|
+
|
|
4
7
|
from aiopenapi3.plugin import Document, Init
|
|
5
8
|
|
|
6
9
|
logger = logging.getLogger(__name__)
|
|
@@ -54,9 +57,16 @@ class MinifySpec(Document):
|
|
|
54
57
|
self.keep_ops = operations
|
|
55
58
|
|
|
56
59
|
def parsed(self, ctx: Document.Context) -> Document.Context:
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
|
|
61
|
+
if len(self.keep_tags) == 0 and self.keep_ops == []:
|
|
62
|
+
logger.error("No tag/path filtering supplied to ESI Client. Using all tags. This throw an error with `DEBUG=False`!", stack_info=True)
|
|
63
|
+
if not getattr(settings, "DEBUG", False):
|
|
64
|
+
# we are in production mode throw error to protect RAM.
|
|
65
|
+
raise AttributeError("No tag/path filtering supplied to ESI Client.")
|
|
66
|
+
# We are in debug mode allow an unfiltered client.
|
|
59
67
|
return ctx
|
|
68
|
+
|
|
69
|
+
# filter the client.
|
|
60
70
|
spec = ctx.document
|
|
61
71
|
|
|
62
72
|
remove_paths = set()
|
esi/clients.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
+
from timeit import default_timer
|
|
3
4
|
import warnings
|
|
4
5
|
import datetime as dt
|
|
5
6
|
from hashlib import md5
|
|
@@ -10,7 +11,7 @@ from urllib import parse as urlparse
|
|
|
10
11
|
from bravado import requests_client
|
|
11
12
|
from bravado.client import SwaggerClient
|
|
12
13
|
from bravado.exception import (
|
|
13
|
-
HTTPBadGateway, HTTPGatewayTimeout, HTTPServiceUnavailable,
|
|
14
|
+
HTTPBadGateway, HTTPGatewayTimeout, HTTPServiceUnavailable, HTTPError,
|
|
14
15
|
)
|
|
15
16
|
from bravado.http_future import HttpFuture
|
|
16
17
|
from bravado.swagger_model import Loader
|
|
@@ -22,6 +23,7 @@ from django.core.cache import cache
|
|
|
22
23
|
|
|
23
24
|
from . import __title__, __url__, __version__, app_settings
|
|
24
25
|
from .errors import TokenExpiredError
|
|
26
|
+
from .signals import esi_request_statistics
|
|
25
27
|
|
|
26
28
|
logger = logging.getLogger(__name__)
|
|
27
29
|
|
|
@@ -144,6 +146,19 @@ class CachingHttpFuture(HttpFuture):
|
|
|
144
146
|
for language in my_languages
|
|
145
147
|
}
|
|
146
148
|
|
|
149
|
+
def _send_signal(self, status_code: int, headers: dict = {}, latency: float = 0) -> None:
|
|
150
|
+
"""
|
|
151
|
+
Dispatch the esi request statistics signal
|
|
152
|
+
"""
|
|
153
|
+
esi_request_statistics.send(
|
|
154
|
+
sender=self.__class__,
|
|
155
|
+
operation=self.operation.path_name,
|
|
156
|
+
status_code=status_code,
|
|
157
|
+
headers=headers,
|
|
158
|
+
latency=latency,
|
|
159
|
+
bucket=""
|
|
160
|
+
)
|
|
161
|
+
|
|
147
162
|
def result(self, **kwargs) -> Any | tuple[Any, IncomingResponse]:
|
|
148
163
|
"""Executes the request and returns the response from ESI. Response will
|
|
149
164
|
include the requested / first page only if there are more pages available.
|
|
@@ -191,6 +206,9 @@ class CachingHttpFuture(HttpFuture):
|
|
|
191
206
|
)
|
|
192
207
|
|
|
193
208
|
if cached:
|
|
209
|
+
self._send_signal(
|
|
210
|
+
status_code=0
|
|
211
|
+
)
|
|
194
212
|
result, response = cached
|
|
195
213
|
expiry = self._time_to_expiry(str(response.headers.get('Expires')))
|
|
196
214
|
if expiry < 0:
|
|
@@ -245,6 +263,7 @@ class CachingHttpFuture(HttpFuture):
|
|
|
245
263
|
|
|
246
264
|
retries = 0
|
|
247
265
|
while retries <= max_retries:
|
|
266
|
+
_t = default_timer()
|
|
248
267
|
try:
|
|
249
268
|
if app_settings.ESI_INFO_LOGGING_ENABLED:
|
|
250
269
|
params = self.future.request.params
|
|
@@ -269,6 +288,11 @@ class CachingHttpFuture(HttpFuture):
|
|
|
269
288
|
logger.debug('ESI response content: %s', response.text)
|
|
270
289
|
break
|
|
271
290
|
except (HTTPBadGateway, HTTPGatewayTimeout, HTTPServiceUnavailable) as ex:
|
|
291
|
+
self._send_signal(
|
|
292
|
+
status_code=ex.status_code,
|
|
293
|
+
headers=ex.response.headers,
|
|
294
|
+
latency=default_timer() - _t
|
|
295
|
+
)
|
|
272
296
|
if retries < max_retries:
|
|
273
297
|
retries += 1
|
|
274
298
|
logger.warning(
|
|
@@ -285,7 +309,23 @@ class CachingHttpFuture(HttpFuture):
|
|
|
285
309
|
sleep(wait_secs)
|
|
286
310
|
else:
|
|
287
311
|
raise ex
|
|
312
|
+
except HTTPError as ex:
|
|
313
|
+
"""
|
|
314
|
+
Throw any other error into the signal
|
|
315
|
+
then just re-raise
|
|
316
|
+
"""
|
|
317
|
+
self._send_signal(
|
|
318
|
+
status_code=ex.status_code,
|
|
319
|
+
headers=ex.response.headers,
|
|
320
|
+
latency=default_timer() - _t
|
|
321
|
+
)
|
|
322
|
+
raise ex
|
|
288
323
|
|
|
324
|
+
self._send_signal(
|
|
325
|
+
status_code=response.status_code,
|
|
326
|
+
headers=response.headers,
|
|
327
|
+
latency=default_timer() - _t
|
|
328
|
+
)
|
|
289
329
|
# restore original value
|
|
290
330
|
self.request_config.also_return_response = _also_return_response
|
|
291
331
|
return result, response
|
esi/decorators.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import functools
|
|
2
1
|
import logging
|
|
3
2
|
import time
|
|
4
3
|
from functools import wraps
|
|
4
|
+
from typing import Any
|
|
5
|
+
from collections.abc import Callable
|
|
5
6
|
|
|
6
7
|
from django.core.cache import cache
|
|
7
8
|
|
|
@@ -227,12 +228,20 @@ def single_use_token(scopes='', new=False):
|
|
|
227
228
|
return decorator
|
|
228
229
|
|
|
229
230
|
|
|
230
|
-
def wait_for_esi_errorlimit_reset(cache_key="esi_error_limit_reset", poll_interval=1):
|
|
231
|
+
def wait_for_esi_errorlimit_reset(cache_key="esi_error_limit_reset", poll_interval=1) -> Callable[..., Callable[..., Any]]:
|
|
232
|
+
"""
|
|
233
|
+
Decorator to apply a polling sleep while the ESI Server/Client is in an Error Limit state
|
|
234
|
+
The preferred non-blocking method is to retry your tasks after the limit reset time has passed
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
cache_key (str, optional): NOT USUALLY CHANGED. Defaults to "esi_error_limit_reset".
|
|
238
|
+
poll_interval (int, optional): Interval in seconds to poll redis. Defaults to 1.
|
|
239
|
+
"""
|
|
231
240
|
def decorator(func):
|
|
232
241
|
def wrapper(*args, **kwargs):
|
|
233
242
|
reset = cache.get(cache_key)
|
|
234
243
|
if reset is not None:
|
|
235
|
-
|
|
244
|
+
logger.error(f"ESI Error Limited, waiting {reset}s before retrying...")
|
|
236
245
|
while cache.get(cache_key):
|
|
237
246
|
time.sleep(poll_interval)
|
|
238
247
|
return func(*args, **kwargs)
|
|
@@ -240,16 +249,23 @@ def wait_for_esi_errorlimit_reset(cache_key="esi_error_limit_reset", poll_interv
|
|
|
240
249
|
return decorator
|
|
241
250
|
|
|
242
251
|
|
|
243
|
-
def esi_rate_limiter_bucketed(
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
252
|
+
def esi_rate_limiter_bucketed(bucket: ESIRateLimitBucket, raise_on_limit: bool = True):
|
|
253
|
+
"""
|
|
254
|
+
Decorator for custom manual rate limits on some endpoints to apply a polling sleep while the bucket is exhausted.
|
|
255
|
+
MARKET_DATA_HISTORY
|
|
256
|
+
CHARACTER_CORPORATION_HISTORY
|
|
257
|
+
The preferred non-blocking method is to retry your tasks after the limit reset time has passed
|
|
258
|
+
|
|
248
259
|
|
|
260
|
+
Args:
|
|
261
|
+
bucket (ESIRateLimitBucket): The Bucket to rate limit against
|
|
262
|
+
raise_on_limit (bool, optional): Whether to raise an Exception when the limit is reached. Defaults to True.
|
|
263
|
+
"""
|
|
264
|
+
# TODO Investigate esi cache hits.
|
|
249
265
|
def decorator(func):
|
|
250
|
-
@
|
|
266
|
+
@wraps(func)
|
|
251
267
|
def wrapper(*args, **kwargs):
|
|
252
|
-
ESIRateLimits.
|
|
268
|
+
ESIRateLimits.check_decr_bucket(bucket, raise_on_limit)
|
|
253
269
|
return func(*args, **kwargs)
|
|
254
270
|
return wrapper
|
|
255
271
|
return decorator
|
esi/exceptions.py
CHANGED
|
@@ -4,10 +4,12 @@ from aiopenapi3.errors import HTTPServerError as base_HTTPServerError
|
|
|
4
4
|
from aiopenapi3.errors import HTTPClientError as base_HTTPClientError
|
|
5
5
|
from aiopenapi3.errors import HTTPError
|
|
6
6
|
|
|
7
|
+
|
|
7
8
|
class ESIErrorLimitException(Exception):
|
|
8
9
|
"""ESI Global Error Limit Exceeded
|
|
9
10
|
https://developers.eveonline.com/docs/services/esi/best-practices/#error-limit
|
|
10
11
|
"""
|
|
12
|
+
|
|
11
13
|
def __init__(self, reset=None, *args, **kwargs) -> None:
|
|
12
14
|
self.reset = reset
|
|
13
15
|
msg = kwargs.get("message") or (
|
|
@@ -18,8 +20,10 @@ class ESIErrorLimitException(Exception):
|
|
|
18
20
|
|
|
19
21
|
class ESIBucketLimitException(Exception):
|
|
20
22
|
"""Endpoint (Bucket) Specific Rate Limit Exceeded"""
|
|
21
|
-
|
|
23
|
+
|
|
24
|
+
def __init__(self, bucket, reset: float = 0, *args, **kwargs) -> None:
|
|
22
25
|
self.bucket = bucket
|
|
26
|
+
self.reset = reset
|
|
23
27
|
msg = kwargs.get("message") or f"ESI bucket limit reached for {bucket}."
|
|
24
28
|
super().__init__(msg, *args)
|
|
25
29
|
|
|
@@ -37,11 +41,11 @@ class HTTPNotModified(HTTPError):
|
|
|
37
41
|
|
|
38
42
|
@dataclasses.dataclass(repr=False)
|
|
39
43
|
class HTTPClientError(base_HTTPClientError):
|
|
40
|
-
"""
|
|
44
|
+
"""HTTP Response Code 4xx"""
|
|
41
45
|
pass
|
|
42
46
|
|
|
43
47
|
|
|
44
48
|
@dataclasses.dataclass(repr=False)
|
|
45
49
|
class HTTPServerError(base_HTTPServerError):
|
|
46
|
-
"""
|
|
50
|
+
"""HTTP Response Code 5xx"""
|
|
47
51
|
pass
|
esi/helpers.py
CHANGED
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: Peter Pfeufer, 2023\n"
|
|
17
17
|
"Language-Team: German (https://app.transifex.com/alliance-auth/teams/107430/"
|
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: trenus, 2023\n"
|
|
17
17
|
"Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2020-12-28 06:44+0000\n"
|
|
16
16
|
"Last-Translator: rockclodbuster, 2023\n"
|
|
17
17
|
"Language-Team: French (France) (https://app.transifex.com/alliance-auth/"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: Thomas Turini, 2024\n"
|
|
17
17
|
"Language-Team: Italian (Italy) (https://app.transifex.com/alliance-auth/"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: kotaneko, 2023\n"
|
|
17
17
|
"Language-Team: Japanese (https://app.transifex.com/alliance-auth/"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: Seowon Jung <seowon@hawaii.edu>, 2023\n"
|
|
17
17
|
"Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/"
|
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
#, fuzzy
|
|
11
11
|
msgid ""
|
|
12
12
|
msgstr ""
|
|
13
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
13
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
14
14
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
15
|
-
"POT-Creation-Date: 2025-10-
|
|
15
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
16
16
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
17
17
|
"Last-Translator: Gnevich <and.vareba81@gmail.com>, 2025\n"
|
|
18
18
|
"Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/"
|
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
#, fuzzy
|
|
7
7
|
msgid ""
|
|
8
8
|
msgstr ""
|
|
9
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
9
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
11
|
-
"POT-Creation-Date: 2025-10-
|
|
11
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
Binary file
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
#, fuzzy
|
|
10
10
|
msgid ""
|
|
11
11
|
msgstr ""
|
|
12
|
-
"Project-Id-Version: Django ESI 8.0.0-beta.
|
|
12
|
+
"Project-Id-Version: Django ESI 8.0.0-beta.2\n"
|
|
13
13
|
"Report-Msgid-Bugs-To: https://gitlab.com/allianceauth/django-esi/-/issues\n"
|
|
14
|
-
"POT-Creation-Date: 2025-10-
|
|
14
|
+
"POT-Creation-Date: 2025-10-31 15:18+1000\n"
|
|
15
15
|
"PO-Revision-Date: 2023-10-25 11:04+0000\n"
|
|
16
16
|
"Last-Translator: heguyChen, 2023\n"
|
|
17
17
|
"Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/"
|
esi/managers.pyi
CHANGED