aa-moonmining 2.2.1__tar.gz → 2.3.0__tar.gz

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 (142) hide show
  1. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/PKG-INFO +3 -3
  2. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/__init__.py +1 -1
  3. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tasks.py +56 -53
  4. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/reports.html +1 -1
  5. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_integration.py +18 -5
  6. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/pyproject.toml +2 -2
  7. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/LICENSE +0 -0
  8. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/README.md +0 -0
  9. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/admin.py +0 -0
  10. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/app_settings.py +0 -0
  11. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/apps.py +0 -0
  12. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/auth_hooks.py +0 -0
  13. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/constants.py +0 -0
  14. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/core.py +0 -0
  15. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/forms.py +0 -0
  16. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/helpers.py +0 -0
  17. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/de/LC_MESSAGES/django.po +0 -0
  18. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/django.pot +0 -0
  19. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/en/LC_MESSAGES/django.po +0 -0
  20. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/es/LC_MESSAGES/django.po +0 -0
  21. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/fr_FR/LC_MESSAGES/django.po +0 -0
  22. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/it_IT/LC_MESSAGES/django.po +0 -0
  23. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/ja/LC_MESSAGES/django.po +0 -0
  24. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/ko_KR/LC_MESSAGES/django.po +0 -0
  25. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/ru/LC_MESSAGES/django.po +0 -0
  26. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/uk/LC_MESSAGES/django.po +0 -0
  27. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  28. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/management/commands/__init__.py +0 -0
  29. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/management/commands/moonmining_calculate_all.py +0 -0
  30. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/management/commands/moonmining_import_moons.py +0 -0
  31. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/management/commands/moonmining_load_eve.py +0 -0
  32. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/management/commands/moonstuff_export_moons.py +0 -0
  33. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/managers.py +0 -0
  34. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0001_initial.py +0 -0
  35. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0002_add_mining_ledger.py +0 -0
  36. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0003_mining_ledger_reports.py +0 -0
  37. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0004_add_permission_moon_ledgers.py +0 -0
  38. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0005_make_pricing_more_flexible.py +0 -0
  39. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0006_add_labels.py +0 -0
  40. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/0007_add_localization.py +0 -0
  41. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/migrations/__init__.py +0 -0
  42. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/__init__.py +0 -0
  43. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/extractions.py +0 -0
  44. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/general.py +0 -0
  45. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/moons.py +0 -0
  46. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/notifications.py +0 -0
  47. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/models/owners.py +0 -0
  48. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/providers.py +0 -0
  49. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/css/extractions.css +0 -0
  50. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/css/global.css +0 -0
  51. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/css/moonmining.css +0 -0
  52. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/css/moons.css +0 -0
  53. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/css/reports.css +0 -0
  54. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/img/Spinner-1s-64px-dark.gif +0 -0
  55. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/img/Spinner-1s-64px-light.gif +0 -0
  56. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/vendor/datatables/plugins/dataTables.rowGroup.min.js +0 -0
  57. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/vendor/datatables/plugins/datetime.js +0 -0
  58. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/vendor/datatables/plugins/filterDropDown.min.js +0 -0
  59. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/vendor/datatables/plugins/rowGroup.bootstrap.min.css +0 -0
  60. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/static/moonmining/vendor/datatables/plugins/rowGroup.dataTables.min.css +0 -0
  61. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/_generic_modal_page.html +0 -0
  62. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/base.html +0 -0
  63. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/extractions.html +0 -0
  64. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/base.html +0 -0
  65. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/content_base.html +0 -0
  66. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/extraction_details.html +0 -0
  67. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/extraction_ledger.html +0 -0
  68. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/loader_body.html +0 -0
  69. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/moon_details.html +0 -0
  70. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/modals/upload_survey.html +0 -0
  71. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/moons.html +0 -0
  72. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_details.html +0 -0
  73. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_details_head.html +0 -0
  74. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_details_head_base.html +0 -0
  75. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_details_products.html +0 -0
  76. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_ledger.html +0 -0
  77. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_ledger_characters.html +0 -0
  78. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_ledger_head.html +0 -0
  79. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extraction_ledger_ledger.html +0 -0
  80. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/extractions_tab.html +0 -0
  81. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/global_js.html +0 -0
  82. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/location.html +0 -0
  83. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/menu.html +0 -0
  84. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/moon_details.html +0 -0
  85. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/moon_details_moon.html +0 -0
  86. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/moon_details_products.html +0 -0
  87. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/moons_tab.html +0 -0
  88. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/reports_ore_prices_tab.html +0 -0
  89. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/reports_owned_value_tab.html +0 -0
  90. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/reports_user_mining_tab.html +0 -0
  91. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/reports_user_uploaded_tab.html +0 -0
  92. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/upload_survey.html +0 -0
  93. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/partials/value_estimate_legend.html +0 -0
  94. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templates/moonmining/tests.html +0 -0
  95. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templatetags/__init__.py +0 -0
  96. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/templatetags/moonmining.py +0 -0
  97. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/__init__.py +0 -0
  98. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/helpers.py +0 -0
  99. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/models/__init__.py +0 -0
  100. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/models/test_extractions.py +0 -0
  101. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/models/test_moons.py +0 -0
  102. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/models/test_notifications.py +0 -0
  103. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/models/test_owners.py +0 -0
  104. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_admin.py +0 -0
  105. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_commands.py +0 -0
  106. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_core.py +0 -0
  107. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_helpers.py +0 -0
  108. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_managers.py +0 -0
  109. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/test_templatetags.py +0 -0
  110. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/__init__.py +0 -0
  111. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/allianceauth.json +0 -0
  112. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/create_eveuniverse.py +0 -0
  113. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/esi.json +0 -0
  114. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/esi_client_stub.py +0 -0
  115. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/eveuniverse.json +0 -0
  116. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/factories.py +0 -0
  117. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/generate_many_moons.py +0 -0
  118. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/generate_moons.json +0 -0
  119. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/generate_moons.py +0 -0
  120. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/load_allianceauth.py +0 -0
  121. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/load_eveuniverse.py +0 -0
  122. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/moon_ids.csv +0 -0
  123. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/moon_survey_input_2.txt +0 -0
  124. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/moon_survey_input_3.txt +0 -0
  125. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/moons_for_import.csv +0 -0
  126. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/notification_details.py +0 -0
  127. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/notifications_full.json +0 -0
  128. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/testdata/survey_data.py +0 -0
  129. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/views/__init__.py +0 -0
  130. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/views/test_extractions.py +0 -0
  131. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/views/test_general.py +0 -0
  132. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/views/test_moons.py +0 -0
  133. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tests/views/test_reports.py +0 -0
  134. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tools/drop_tables.sql +0 -0
  135. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/tools/esi_notes.md +0 -0
  136. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/urls.py +0 -0
  137. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/__init__.py +0 -0
  138. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/_helpers.py +0 -0
  139. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/extractions.py +0 -0
  140. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/general.py +0 -0
  141. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/moons.py +0 -0
  142. {aa_moonmining-2.2.1 → aa_moonmining-2.3.0}/moonmining/views/reports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aa-moonmining
3
- Version: 2.2.1
3
+ Version: 2.3.0
4
4
  Summary: Alliance Auth app for tracking moon extractions and scouting new moons.
5
5
  Author-email: Erik Kalkoken <kaloken87@gmail.com>
6
6
  Requires-Python: >=3.8
@@ -20,11 +20,11 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Topic :: Internet :: WWW/HTTP
21
21
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
22
  License-File: LICENSE
23
- Requires-Dist: allianceauth-app-utils>=1.27
23
+ Requires-Dist: allianceauth-app-utils>=1.28
24
24
  Requires-Dist: allianceauth>=4,<5
25
25
  Requires-Dist: django-bootstrap-form
26
26
  Requires-Dist: django-datatables-view>=1.20
27
- Requires-Dist: django-eveuniverse>=1.0
27
+ Requires-Dist: django-eveuniverse>=1.6
28
28
  Requires-Dist: django-navhelper
29
29
  Requires-Dist: PyYAML
30
30
  Project-URL: Changelog, https://gitlab.com/ErikKalkoken/aa-moonmining/-/blob/master/CHANGELOG.md
@@ -3,5 +3,5 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "moonmining.apps.MoonMiningConfig"
5
5
 
6
- __version__ = "2.2.1"
6
+ __version__ = "2.3.0"
7
7
  __title__ = "Moon Mining"
@@ -1,6 +1,6 @@
1
1
  """Tasks."""
2
2
 
3
- from celery import chain, shared_task
3
+ from celery import Task, chain, shared_task
4
4
 
5
5
  from django.contrib.auth.models import User
6
6
  from django.utils.timezone import now
@@ -8,7 +8,8 @@ from eveuniverse.models import EveMarketPrice
8
8
  from eveuniverse.tasks import update_unresolved_eve_entities
9
9
 
10
10
  from allianceauth.services.hooks import get_extension_logger
11
- from app_utils.esi import fetch_esi_status
11
+ from allianceauth.services.tasks import QueueOnce
12
+ from app_utils.esi import retry_task_on_esi_error_and_offline
12
13
  from app_utils.logging import LoggerAddTag
13
14
 
14
15
  from . import __title__
@@ -37,43 +38,43 @@ def run_regular_updates():
37
38
  update_owner.delay(owner_pk)
38
39
 
39
40
 
40
- @shared_task
41
- def update_owner(owner_pk):
41
+ @shared_task(base=QueueOnce, once={"keys": ["owner_pk"], "graceful": True})
42
+ def update_owner(owner_pk: int):
42
43
  """Update refineries and extractions for given owner."""
43
- if fetch_esi_status().is_ok:
44
- chain(
45
- update_refineries_from_esi_for_owner.si(owner_pk),
46
- fetch_notifications_from_esi_for_owner.si(owner_pk),
47
- update_extractions_for_owner.si(owner_pk),
48
- mark_successful_update_for_owner.si(owner_pk),
49
- ).delay()
50
- else:
51
- logger.warning("ESI ist not available. Aborting.")
44
+ chain(
45
+ update_refineries_from_esi_for_owner.si(owner_pk),
46
+ fetch_notifications_from_esi_for_owner.si(owner_pk),
47
+ update_extractions_for_owner.si(owner_pk),
48
+ mark_successful_update_for_owner.si(owner_pk),
49
+ ).delay()
52
50
 
53
51
 
54
- @shared_task
55
- def update_refineries_from_esi_for_owner(owner_pk):
52
+ @shared_task(bind=True, base=QueueOnce, once={"keys": ["owner_pk"], "graceful": True})
53
+ def update_refineries_from_esi_for_owner(self: Task, owner_pk: int):
56
54
  """Update refineries for a owner from ESI."""
57
55
  owner = Owner.objects.get(pk=owner_pk)
58
- owner.update_refineries_from_esi()
56
+ with retry_task_on_esi_error_and_offline(self):
57
+ owner.update_refineries_from_esi()
59
58
 
60
59
 
61
- @shared_task
62
- def fetch_notifications_from_esi_for_owner(owner_pk):
60
+ @shared_task(bind=True, base=QueueOnce, once={"keys": ["owner_pk"], "graceful": True})
61
+ def fetch_notifications_from_esi_for_owner(self: Task, owner_pk: int):
63
62
  """Update extractions for a owner from ESI."""
64
63
  owner = Owner.objects.get(pk=owner_pk)
65
- owner.fetch_notifications_from_esi()
64
+ with retry_task_on_esi_error_and_offline(self):
65
+ owner.fetch_notifications_from_esi()
66
66
 
67
67
 
68
- @shared_task
69
- def update_extractions_for_owner(owner_pk):
68
+ @shared_task(bind=True, base=QueueOnce, once={"keys": ["owner_pk"], "graceful": True})
69
+ def update_extractions_for_owner(self: Task, owner_pk: int):
70
70
  """Update extractions for a owner from ESI."""
71
71
  owner = Owner.objects.get(pk=owner_pk)
72
- owner.update_extractions()
72
+ with retry_task_on_esi_error_and_offline(self):
73
+ owner.update_extractions()
73
74
 
74
75
 
75
76
  @shared_task
76
- def mark_successful_update_for_owner(owner_pk):
77
+ def mark_successful_update_for_owner(owner_pk: int):
77
78
  """Mark a successful update for this corporation."""
78
79
  owner = Owner.objects.get(pk=owner_pk)
79
80
  owner.last_update_ok = True
@@ -90,48 +91,50 @@ def run_report_updates():
90
91
  update_mining_ledger_for_owner.delay(owner_pk)
91
92
 
92
93
 
93
- @shared_task
94
- def update_mining_ledger_for_owner(owner_pk):
94
+ @shared_task(bind=True, base=QueueOnce, once={"keys": ["owner_pk"], "graceful": True})
95
+ def update_mining_ledger_for_owner(self: Task, owner_pk: int):
95
96
  """Update mining ledger for a owner from ESI."""
96
- if fetch_esi_status().is_ok:
97
- owner = Owner.objects.get(pk=owner_pk)
97
+ owner = Owner.objects.get(pk=owner_pk)
98
+ with retry_task_on_esi_error_and_offline(self):
98
99
  observer_ids = owner.fetch_mining_ledger_observers_from_esi()
99
- for refinery_id in owner.refineries.filter(id__in=observer_ids).values_list(
100
- "id", flat=True
101
- ):
102
- update_mining_ledger_for_refinery.apply_async(
103
- kwargs={"refinery_id": refinery_id}, priority=TASK_PRIORITY_LOWER
104
- )
105
- else:
106
- logger.warning("ESI ist not available. Aborting.")
107
100
 
101
+ for refinery_id in owner.refineries.filter(id__in=observer_ids).values_list(
102
+ "id", flat=True
103
+ ):
104
+ update_mining_ledger_for_refinery.apply_async(
105
+ kwargs={"refinery_id": refinery_id}, priority=TASK_PRIORITY_LOWER
106
+ )
108
107
 
109
- @shared_task
110
- def update_mining_ledger_for_refinery(refinery_id):
108
+
109
+ @shared_task(
110
+ bind=True,
111
+ base=QueueOnce,
112
+ once={"keys": ["refinery_id"], "graceful": True},
113
+ )
114
+ def update_mining_ledger_for_refinery(self: Task, refinery_id: int):
111
115
  """Update mining ledger for a refinery from ESI."""
112
116
  refinery = Refinery.objects.get(id=refinery_id)
113
- refinery.update_mining_ledger_from_esi()
117
+ with retry_task_on_esi_error_and_offline(self):
118
+ refinery.update_mining_ledger_from_esi()
114
119
 
115
120
 
116
121
  @shared_task
117
122
  def run_calculated_properties_update():
118
123
  """Update the calculated properties of all moons and all extractions."""
119
- if fetch_esi_status().is_ok:
120
- chain(
121
- update_market_prices.si().set(priority=TASK_PRIORITY_LOWER),
122
- update_current_ore_prices.si().set(priority=TASK_PRIORITY_LOWER),
123
- update_moons.si().set(priority=TASK_PRIORITY_LOWER),
124
- update_extractions.si().set(priority=TASK_PRIORITY_LOWER),
125
- update_unresolved_eve_entities.si().set(priority=TASK_PRIORITY_LOWER),
126
- ).delay()
127
- else:
128
- logger.warning("ESI ist not available. Aborting.")
124
+ chain(
125
+ update_market_prices.si().set(priority=TASK_PRIORITY_LOWER),
126
+ update_current_ore_prices.si().set(priority=TASK_PRIORITY_LOWER),
127
+ update_moons.si().set(priority=TASK_PRIORITY_LOWER),
128
+ update_extractions.si().set(priority=TASK_PRIORITY_LOWER),
129
+ update_unresolved_eve_entities.si().set(priority=TASK_PRIORITY_LOWER),
130
+ ).delay()
129
131
 
130
132
 
131
- @shared_task
132
- def update_market_prices():
133
+ @shared_task(bind=True, base=QueueOnce)
134
+ def update_market_prices(self):
133
135
  """Update all market prices."""
134
- EveMarketPrice.objects.update_from_esi()
136
+ with retry_task_on_esi_error_and_offline(self):
137
+ EveMarketPrice.objects.update_from_esi()
135
138
 
136
139
 
137
140
  @shared_task
@@ -159,7 +162,7 @@ def update_moon_calculated_properties(moon_pk):
159
162
 
160
163
 
161
164
  @shared_task
162
- def update_moon_products_from_latest_extraction(moon_pk):
165
+ def update_moon_products_from_latest_extraction(moon_pk: int):
163
166
  """Update moon products from latest extraction."""
164
167
  moon = Moon.objects.get(pk=moon_pk)
165
168
  result = moon.update_products_from_latest_extraction(overwrite_survey=True)
@@ -189,7 +192,7 @@ def update_extractions():
189
192
 
190
193
 
191
194
  @shared_task
192
- def update_extraction_calculated_properties(extraction_pk):
195
+ def update_extraction_calculated_properties(extraction_pk: int):
193
196
  """Update all calculated properties for given extraction."""
194
197
  extraction = Extraction.objects.get(pk=extraction_pk)
195
198
  extraction.update_calculated_properties()
@@ -262,7 +262,7 @@
262
262
 
263
263
  {% block extra_css %}
264
264
  {{ block.super }}
265
- <link rel="stylesheet" href="https://cdn.datatables.net/rowgroup/1.6.0/css/rowGroup.dataTables.min.css" type="text/css">
265
+ <link rel="stylesheet" href="{% static 'moonmining/vendor/datatables/plugins/rowGroup.dataTables.min.css' %}" type="text/css">
266
266
  <link href="{% static 'moonmining/css/reports.css' %}" type="text/css" rel="stylesheet">
267
267
  {% endblock %}
268
268
 
@@ -9,11 +9,10 @@ from django.utils.timezone import now
9
9
  from django_webtest import WebTest
10
10
  from eveuniverse.models import EveMoon
11
11
 
12
- from app_utils.esi import EsiStatus
13
12
  from app_utils.testing import (
14
- NoSocketsTestCase,
15
13
  create_user_from_evecharacter,
16
14
  json_response_to_python,
15
+ reset_celery_once_locks,
17
16
  )
18
17
 
19
18
  from moonmining import tasks
@@ -60,10 +59,9 @@ class TestUI(WebTest):
60
59
  # TODO: Add more UI tests
61
60
 
62
61
 
63
- @patch(TASKS_PATH + ".fetch_esi_status", lambda: EsiStatus(True, 100, 60))
64
62
  @patch(MODELS_PATH + ".EveSolarSystem.nearest_celestial", new=nearest_celestial_stub)
65
- @override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
66
- class TestUpdateTasks(NoSocketsTestCase):
63
+ @override_settings(CELERY_ALWAYS_EAGER=True)
64
+ class TestRunRegularUpdates(TestCase):
67
65
  @classmethod
68
66
  def setUpClass(cls):
69
67
  super().setUpClass()
@@ -72,6 +70,7 @@ class TestUpdateTasks(NoSocketsTestCase):
72
70
  helpers.generate_eve_entities_from_allianceauth()
73
71
  helpers.generate_market_prices()
74
72
  _, cls.character_ownership = helpers.create_default_user_from_evecharacter(1001)
73
+ reset_celery_once_locks("moonmining")
75
74
 
76
75
  @patch(MODELS_PATH + ".esi")
77
76
  def test_should_update_all_mining_corporations(self, mock_esi):
@@ -146,6 +145,20 @@ class TestUpdateTasks(NoSocketsTestCase):
146
145
  self.assertEqual(corporation_2002.last_update_at, my_date)
147
146
  self.assertIsNone(corporation_2002.last_update_ok)
148
147
 
148
+
149
+ @patch(MODELS_PATH + ".EveSolarSystem.nearest_celestial", new=nearest_celestial_stub)
150
+ @override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
151
+ class TestUpdateOtherTasks(TestCase):
152
+ @classmethod
153
+ def setUpClass(cls):
154
+ super().setUpClass()
155
+ load_eveuniverse()
156
+ load_allianceauth()
157
+ helpers.generate_eve_entities_from_allianceauth()
158
+ helpers.generate_market_prices()
159
+ _, cls.character_ownership = helpers.create_default_user_from_evecharacter(1001)
160
+ reset_celery_once_locks("moonmining")
161
+
149
162
  @patch(MODELS_PATH + ".esi")
150
163
  def test_should_update_mining_ledgers(self, mock_esi):
151
164
  # given
@@ -26,11 +26,11 @@ classifiers = [
26
26
  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
27
27
  ]
28
28
  dependencies = [
29
- "allianceauth-app-utils>=1.27",
29
+ "allianceauth-app-utils>=1.28",
30
30
  "allianceauth>=4,<5",
31
31
  "django-bootstrap-form",
32
32
  "django-datatables-view>=1.20",
33
- "django-eveuniverse>=1.0",
33
+ "django-eveuniverse>=1.6",
34
34
  "django-navhelper",
35
35
  "PyYAML",
36
36
  ]
File without changes
File without changes