aa-moonmining 2.2.2__tar.gz → 3.0.0a1__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 (153) hide show
  1. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/PKG-INFO +10 -6
  2. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/__init__.py +1 -1
  3. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/constants.py +9 -4
  4. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/core.py +5 -1
  5. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/helpers.py +2 -1
  6. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/management/commands/moonmining_calculate_all.py +2 -4
  7. aa_moonmining-3.0.0a1/moonmining/management/commands/moonmining_import_moons.py +136 -0
  8. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/management/commands/moonmining_load_eve.py +1 -3
  9. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/managers.py +3 -10
  10. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/extractions.py +1 -1
  11. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/moons.py +5 -0
  12. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/notifications.py +33 -23
  13. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/owners.py +198 -192
  14. aa_moonmining-3.0.0a1/moonmining/openapi_2025-12-16.json +32582 -0
  15. aa_moonmining-3.0.0a1/moonmining/providers.py +23 -0
  16. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tasks.py +47 -50
  17. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/moon_details_products.html +1 -1
  18. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/moons_tab.html +1 -1
  19. aa_moonmining-3.0.0a1/moonmining/tests/helpers.py +34 -0
  20. aa_moonmining-3.0.0a1/moonmining/tests/models/test_extractions.py +96 -0
  21. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/models/test_moons.py +137 -80
  22. aa_moonmining-3.0.0a1/moonmining/tests/models/test_notifications.py +161 -0
  23. aa_moonmining-3.0.0a1/moonmining/tests/models/test_owners.py +1036 -0
  24. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/test_admin.py +6 -8
  25. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/test_core.py +2 -2
  26. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/test_helpers.py +5 -3
  27. aa_moonmining-3.0.0a1/moonmining/tests/test_import_moons.py +170 -0
  28. aa_moonmining-3.0.0a1/moonmining/tests/test_integration.py +345 -0
  29. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/test_managers.py +77 -87
  30. aa_moonmining-3.0.0a1/moonmining/tests/testdata/factories.py +473 -0
  31. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/survey_data.py +1 -1
  32. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/views/test_extractions.py +68 -119
  33. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/views/test_general.py +91 -63
  34. aa_moonmining-3.0.0a1/moonmining/tests/views/test_moons.py +205 -0
  35. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/views/test_reports.py +59 -62
  36. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/views/extractions.py +1 -1
  37. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/views/general.py +1 -2
  38. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/pyproject.toml +7 -5
  39. aa_moonmining-2.2.2/moonmining/management/commands/moonmining_import_moons.py +0 -214
  40. aa_moonmining-2.2.2/moonmining/providers.py +0 -7
  41. aa_moonmining-2.2.2/moonmining/tests/helpers.py +0 -82
  42. aa_moonmining-2.2.2/moonmining/tests/models/test_extractions.py +0 -222
  43. aa_moonmining-2.2.2/moonmining/tests/models/test_notifications.py +0 -45
  44. aa_moonmining-2.2.2/moonmining/tests/models/test_owners.py +0 -736
  45. aa_moonmining-2.2.2/moonmining/tests/test_commands.py +0 -80
  46. aa_moonmining-2.2.2/moonmining/tests/test_integration.py +0 -278
  47. aa_moonmining-2.2.2/moonmining/tests/testdata/allianceauth.json +0 -113
  48. aa_moonmining-2.2.2/moonmining/tests/testdata/create_eveuniverse.py +0 -43
  49. aa_moonmining-2.2.2/moonmining/tests/testdata/esi_client_stub.py +0 -54
  50. aa_moonmining-2.2.2/moonmining/tests/testdata/eveuniverse.json +0 -41782
  51. aa_moonmining-2.2.2/moonmining/tests/testdata/factories.py +0 -538
  52. aa_moonmining-2.2.2/moonmining/tests/testdata/load_allianceauth.py +0 -62
  53. aa_moonmining-2.2.2/moonmining/tests/testdata/load_eveuniverse.py +0 -37
  54. aa_moonmining-2.2.2/moonmining/tests/testdata/notification_details.py +0 -26
  55. aa_moonmining-2.2.2/moonmining/tests/views/test_moons.py +0 -168
  56. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/LICENSE +0 -0
  57. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/README.md +0 -0
  58. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/admin.py +0 -0
  59. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/app_settings.py +0 -0
  60. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/apps.py +0 -0
  61. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/auth_hooks.py +0 -0
  62. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/forms.py +0 -0
  63. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/de/LC_MESSAGES/django.po +0 -0
  64. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/django.pot +0 -0
  65. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/en/LC_MESSAGES/django.po +0 -0
  66. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/es/LC_MESSAGES/django.po +0 -0
  67. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/fr_FR/LC_MESSAGES/django.po +0 -0
  68. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/it_IT/LC_MESSAGES/django.po +0 -0
  69. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/ja/LC_MESSAGES/django.po +0 -0
  70. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/ko_KR/LC_MESSAGES/django.po +0 -0
  71. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/ru/LC_MESSAGES/django.po +0 -0
  72. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/uk/LC_MESSAGES/django.po +0 -0
  73. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  74. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/management/commands/__init__.py +0 -0
  75. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/management/commands/moonstuff_export_moons.py +0 -0
  76. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0001_initial.py +0 -0
  77. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0002_add_mining_ledger.py +0 -0
  78. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0003_mining_ledger_reports.py +0 -0
  79. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0004_add_permission_moon_ledgers.py +0 -0
  80. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0005_make_pricing_more_flexible.py +0 -0
  81. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0006_add_labels.py +0 -0
  82. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/0007_add_localization.py +0 -0
  83. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/migrations/__init__.py +0 -0
  84. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/__init__.py +0 -0
  85. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/models/general.py +0 -0
  86. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/css/extractions.css +0 -0
  87. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/css/global.css +0 -0
  88. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/css/moonmining.css +0 -0
  89. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/css/moons.css +0 -0
  90. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/css/reports.css +0 -0
  91. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/img/Spinner-1s-64px-dark.gif +0 -0
  92. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/img/Spinner-1s-64px-light.gif +0 -0
  93. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/vendor/datatables/plugins/dataTables.rowGroup.min.js +0 -0
  94. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/vendor/datatables/plugins/datetime.js +0 -0
  95. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/vendor/datatables/plugins/filterDropDown.min.js +0 -0
  96. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/vendor/datatables/plugins/rowGroup.bootstrap.min.css +0 -0
  97. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/static/moonmining/vendor/datatables/plugins/rowGroup.dataTables.min.css +0 -0
  98. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/_generic_modal_page.html +0 -0
  99. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/base.html +0 -0
  100. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/extractions.html +0 -0
  101. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/base.html +0 -0
  102. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/content_base.html +0 -0
  103. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/extraction_details.html +0 -0
  104. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/extraction_ledger.html +0 -0
  105. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/loader_body.html +0 -0
  106. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/moon_details.html +0 -0
  107. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/modals/upload_survey.html +0 -0
  108. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/moons.html +0 -0
  109. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_details.html +0 -0
  110. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_details_head.html +0 -0
  111. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_details_head_base.html +0 -0
  112. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_details_products.html +0 -0
  113. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_ledger.html +0 -0
  114. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_ledger_characters.html +0 -0
  115. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_ledger_head.html +0 -0
  116. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extraction_ledger_ledger.html +0 -0
  117. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/extractions_tab.html +0 -0
  118. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/global_js.html +0 -0
  119. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/location.html +0 -0
  120. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/menu.html +0 -0
  121. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/moon_details.html +0 -0
  122. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/moon_details_moon.html +0 -0
  123. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/reports_ore_prices_tab.html +0 -0
  124. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/reports_owned_value_tab.html +0 -0
  125. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/reports_user_mining_tab.html +0 -0
  126. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/reports_user_uploaded_tab.html +0 -0
  127. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/upload_survey.html +0 -0
  128. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/partials/value_estimate_legend.html +0 -0
  129. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/reports.html +0 -0
  130. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templates/moonmining/tests.html +0 -0
  131. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templatetags/__init__.py +0 -0
  132. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/templatetags/moonmining.py +0 -0
  133. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/__init__.py +0 -0
  134. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/models/__init__.py +0 -0
  135. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/test_templatetags.py +0 -0
  136. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/__init__.py +0 -0
  137. /aa_moonmining-2.2.2/moonmining/tests/testdata/esi.json → /aa_moonmining-3.0.0a1/moonmining/tests/testdata/esi_examples.json +0 -0
  138. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/generate_many_moons.py +0 -0
  139. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/generate_moons.json +0 -0
  140. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/generate_moons.py +0 -0
  141. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/moon_ids.csv +0 -0
  142. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/moon_survey_input_2.txt +0 -0
  143. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/moon_survey_input_3.txt +0 -0
  144. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/testdata/moons_for_import.csv +0 -0
  145. /aa_moonmining-2.2.2/moonmining/tests/testdata/notifications_full.json → /aa_moonmining-3.0.0a1/moonmining/tests/testdata/notification_examples.json +0 -0
  146. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tests/views/__init__.py +0 -0
  147. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tools/drop_tables.sql +0 -0
  148. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/tools/esi_notes.md +0 -0
  149. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/urls.py +0 -0
  150. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/views/__init__.py +0 -0
  151. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/views/_helpers.py +0 -0
  152. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/moonmining/views/moons.py +0 -0
  153. {aa_moonmining-2.2.2 → aa_moonmining-3.0.0a1}/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.2
3
+ Version: 3.0.0a1
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
@@ -8,29 +8,33 @@ Description-Content-Type: text/markdown
8
8
  Classifier: Environment :: Web Environment
9
9
  Classifier: Framework :: Django
10
10
  Classifier: Framework :: Django :: 4.2
11
+ Classifier: Framework :: Django :: 5.2
11
12
  Classifier: Intended Audience :: End Users/Desktop
12
13
  Classifier: License :: OSI Approved :: MIT License
13
14
  Classifier: Operating System :: OS Independent
14
15
  Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3.8
16
- Classifier: Programming Language :: Python :: 3.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
20
19
  Classifier: Topic :: Internet :: WWW/HTTP
21
20
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
21
  License-File: LICENSE
23
- Requires-Dist: allianceauth-app-utils>=1.27
24
- Requires-Dist: allianceauth>=4,<5
22
+ Requires-Dist: allianceauth-app-utils>=1.31.0a1
23
+ Requires-Dist: allianceauth>=4,<6
24
+ Requires-Dist: django-esi>=8,<10
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>=2.0.0a5
28
28
  Requires-Dist: django-navhelper
29
29
  Requires-Dist: PyYAML
30
+ Requires-Dist: coverage ; extra == "test"
31
+ Requires-Dist: factory_boy ; extra == "test"
32
+ Requires-Dist: pook ; extra == "test"
30
33
  Project-URL: Changelog, https://gitlab.com/ErikKalkoken/aa-moonmining/-/blob/master/CHANGELOG.md
31
34
  Project-URL: Homepage, https://gitlab.com/ErikKalkoken/aa-moonmining
32
35
  Project-URL: Source, https://gitlab.com/ErikKalkoken/aa-moonmining
33
36
  Project-URL: Tracker, https://gitlab.com/ErikKalkoken/aa-moonmining/-/issues
37
+ Provides-Extra: test
34
38
 
35
39
  # Moon Mining
36
40
 
@@ -3,5 +3,5 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "moonmining.apps.MoonMiningConfig"
5
5
 
6
- __version__ = "2.2.2"
6
+ __version__ = "3.0.0a1"
7
7
  __title__ = "Moon Mining"
@@ -7,19 +7,24 @@ class EveCategoryId(IntEnum):
7
7
  """An Eve category ID."""
8
8
 
9
9
  ASTEROID = 25
10
+ CELESTIAL = 2
11
+ MATERIAL = 4
12
+ STRUCTURE = 65
10
13
 
11
14
 
12
15
  class EveGroupId(IntEnum):
13
16
  """An Eve group ID."""
14
17
 
15
- MOON = 8
18
+ CITADEL = 1657
19
+ COMMON_MOON_ASTEROIDS = 1920
20
+ EXCEPTIONAL_MOON_ASTEROIDS = 1923
16
21
  MINERAL = 18
22
+ MOON = 8
23
+ MOON_MATERIALS = 427
24
+ RARE_MOON_ASTEROIDS = 1922
17
25
  REFINERY = 1406
18
26
  UBIQUITOUS_MOON_ASTEROIDS = 1884
19
- COMMON_MOON_ASTEROIDS = 1920
20
27
  UNCOMMON_MOON_ASTEROIDS = 1921
21
- RARE_MOON_ASTEROIDS = 1922
22
- EXCEPTIONAL_MOON_ASTEROIDS = 1923
23
28
 
24
29
 
25
30
  class EveTypeId(IntEnum):
@@ -100,7 +100,11 @@ class CalculatedExtractionProduct:
100
100
  @classmethod
101
101
  def create_list_from_dict(cls, ores: dict) -> List["CalculatedExtractionProduct"]:
102
102
  """Return list of newly created objs from a dict."""
103
- return [cls(ore_type_id, volume) for ore_type_id, volume in ores.items()]
103
+ lst = sorted(
104
+ [cls(ore_type_id, volume) for ore_type_id, volume in ores.items()],
105
+ key=lambda o: o.ore_type_id,
106
+ )
107
+ return lst
104
108
 
105
109
 
106
110
  @dataclass
@@ -5,6 +5,7 @@ from collections import defaultdict
5
5
  from typing import List
6
6
 
7
7
  from django.utils.html import format_html
8
+ from esi.exceptions import HTTPError
8
9
  from eveuniverse.models import EveEntity
9
10
 
10
11
  from allianceauth.authentication.models import User
@@ -29,7 +30,7 @@ def eve_entity_get_or_create_esi_safe(id):
29
30
  try:
30
31
  entity, _ = EveEntity.objects.get_or_create_esi(id=id)
31
32
  return entity
32
- except OSError:
33
+ except HTTPError:
33
34
  pass
34
35
  return None
35
36
 
@@ -2,14 +2,12 @@ import logging
2
2
 
3
3
  from django.core.management.base import BaseCommand
4
4
 
5
- from app_utils.logging import LoggerAddTag
6
-
7
- from moonmining import __title__, tasks
5
+ from moonmining import tasks
8
6
  from moonmining.models import Extraction, Moon
9
7
 
10
8
  from . import get_input
11
9
 
12
- logger = LoggerAddTag(logging.getLogger(__name__), __title__)
10
+ logger = logging.getLogger(__name__)
13
11
 
14
12
 
15
13
  class Command(BaseCommand):
@@ -0,0 +1,136 @@
1
+ import csv
2
+ from collections import defaultdict
3
+ from pathlib import Path
4
+ from typing import Dict, List
5
+
6
+ from django.core.management.base import BaseCommand, CommandError
7
+ from eveuniverse.core.esitools import is_esi_online
8
+ from eveuniverse.models import EveMoon
9
+
10
+ from allianceauth.services.hooks import get_extension_logger
11
+
12
+ from moonmining.core import CalculatedMoonProduct
13
+ from moonmining.models import EveOreType, Moon, MoonProduct
14
+
15
+ logger = get_extension_logger(__name__)
16
+
17
+
18
+ class Command(BaseCommand):
19
+ help = "Import moons from an CSV file."
20
+
21
+ def add_arguments(self, parser):
22
+ parser.add_argument("input_file", help="Path of CSV file to be imported")
23
+ parser.add_argument(
24
+ "--overwrite-existing",
25
+ action="store_const",
26
+ const=True,
27
+ default=False,
28
+ help="When set will overwrite existing moon surveys",
29
+ )
30
+ parser.add_argument(
31
+ "--disable-esi-check",
32
+ action="store_const",
33
+ const=False,
34
+ default=False,
35
+ help="When set script will not check if ESI is online",
36
+ )
37
+
38
+ def handle(self, *args, **options):
39
+ if not options["disable_esi_check"] and not is_esi_online():
40
+ raise CommandError("ESI if offline. Aborting")
41
+
42
+ input_file = Path(options["input_file"])
43
+ if not input_file.exists():
44
+ raise CommandError(
45
+ f"Could not find a file with the path: {input_file.resolve()}"
46
+ )
47
+
48
+ moons = self.read_moons(input_file)
49
+ total = len(moons.keys())
50
+ self.stdout.write(f"Read {total:,} moons from file.")
51
+ if not options["overwrite_existing"]:
52
+ found = self.remove_existing_moons(moons)
53
+ if found > 0:
54
+ self.stdout.write(
55
+ f"Skipping update of {found:,} moons with existing surveys."
56
+ )
57
+
58
+ total_2 = len(moons.keys())
59
+ self.stdout.write(f"Starting update of {total_2:,} moons.")
60
+
61
+ try:
62
+ self.update_moons(moons)
63
+ except KeyboardInterrupt:
64
+ self.stdout.write(self.style.WARNING("Aborted"))
65
+
66
+ self.stdout.write(self.style.SUCCESS("DONE"))
67
+
68
+ def read_moons(self, input_file: Path) -> Dict[int, List[CalculatedMoonProduct]]:
69
+ self.stdout.write(f"Importing moons from: {input_file} ...")
70
+ moons: Dict[int, List[CalculatedMoonProduct]] = defaultdict(list)
71
+ with input_file.open("r", encoding="utf-8") as fp:
72
+ csv_reader = csv.DictReader(fp)
73
+ for row in csv_reader:
74
+ try:
75
+ moon_id = int(row["moon_id"])
76
+ ore_type_id = int(row["ore_type_id"])
77
+ amount = float(row["amount"])
78
+ except KeyError:
79
+ continue
80
+
81
+ product = CalculatedMoonProduct(
82
+ ore_type_id=ore_type_id,
83
+ amount=amount,
84
+ )
85
+ moons[moon_id].append(product)
86
+
87
+ if not len(moons.keys()):
88
+ raise CommandError("Could not find any moons in the input file.")
89
+
90
+ return moons
91
+
92
+ def remove_existing_moons(
93
+ self, moons: Dict[int, List[CalculatedMoonProduct]]
94
+ ) -> int:
95
+ existing = set(
96
+ Moon.objects.filter(products__isnull=False).values_list(
97
+ "eve_moon__id", flat=True
98
+ )
99
+ )
100
+ overlapping = existing.intersection(moons.keys())
101
+ removed = 0
102
+ for moon_id in overlapping:
103
+ del moons[moon_id]
104
+ removed += 1
105
+
106
+ return removed
107
+
108
+ def update_moons(self, moons: Dict[int, List[CalculatedMoonProduct]]):
109
+ amount = len(moons)
110
+ completed = 0
111
+ for eve_moon_id, products in moons.items():
112
+ created_ores = []
113
+ for p in products:
114
+ _, created = EveOreType.objects.get_or_create_esi(id=p.ore_type_id)
115
+ created_ores.append(created)
116
+ if any(created_ores):
117
+ EveOreType.objects.update_current_prices()
118
+
119
+ eve_moon, _ = EveMoon.objects.get_or_create_esi(id=eve_moon_id)
120
+ moon, _ = Moon.objects.get_or_create(eve_moon=eve_moon)
121
+
122
+ product_objects = []
123
+ for p in products:
124
+ product_objects.append(
125
+ MoonProduct(
126
+ moon_id=moon.id, ore_type_id=p.ore_type_id, amount=p.amount
127
+ )
128
+ )
129
+ moon.update_products(product_objects)
130
+
131
+ completed += 1
132
+ progress = round(completed / amount * 100, 1)
133
+ self.stdout.write(f"Updated: {str(moon):30} [Progress: {progress}%]")
134
+ logger.info(
135
+ "Added survey for moon ID %d with import command", moon.eve_moon.id
136
+ )
@@ -3,15 +3,13 @@ from eveuniverse.models import EveType
3
3
  from eveuniverse.tasks import update_or_create_eve_object
4
4
 
5
5
  from allianceauth.services.hooks import get_extension_logger
6
- from app_utils.logging import LoggerAddTag
7
6
 
8
- from moonmining import __title__
9
7
  from moonmining.constants import EveCategoryId
10
8
  from moonmining.models import EveOreType
11
9
 
12
10
  from . import get_input
13
11
 
14
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
12
+ logger = get_extension_logger(__name__)
15
13
 
16
14
 
17
15
  class Command(BaseCommand):
@@ -17,9 +17,7 @@ from eveuniverse.models import EveMoon
17
17
 
18
18
  from allianceauth.notifications import notify
19
19
  from allianceauth.services.hooks import get_extension_logger
20
- from app_utils.logging import LoggerAddTag
21
20
 
22
- from . import __title__
23
21
  from .app_settings import (
24
22
  MOONMINING_REPROCESSING_YIELD,
25
23
  MOONMINING_USE_REPROCESS_PRICING,
@@ -30,7 +28,7 @@ from .helpers import eve_entity_get_or_create_esi_safe
30
28
 
31
29
  MAX_THREAD_WORKERS = 20
32
30
  BULK_BATCH_SIZE = 500
33
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
31
+ logger = get_extension_logger(__name__)
34
32
 
35
33
  SurveyProcessResult = namedtuple(
36
34
  "SurveyProcessResult", ["moon_name", "success", "error_name"]
@@ -50,11 +48,12 @@ class EveOreTypeManger(EveTypeManager):
50
48
 
51
49
  def update_current_prices(self, use_process_pricing: Optional[bool] = None):
52
50
  """Update current prices for all ores."""
53
- from .models import EveOreTypeExtras
51
+ from .models import EveOreType, EveOreTypeExtras
54
52
 
55
53
  if use_process_pricing is None:
56
54
  use_process_pricing = MOONMINING_USE_REPROCESS_PRICING
57
55
 
56
+ obj: EveOreType
58
57
  for obj in self.filter(published=True).select_related("market_price"):
59
58
  if use_process_pricing:
60
59
  price = obj.calc_refined_value_per_unit(MOONMINING_REPROCESSING_YIELD)
@@ -413,9 +412,3 @@ class ExtractionManagerBase(models.Manager):
413
412
 
414
413
 
415
414
  ExtractionManager = ExtractionManagerBase.from_queryset(ExtractionQuerySet)
416
-
417
-
418
- class RefineryManager(models.Manager):
419
- def ids(self) -> set:
420
- """Return IDs of this queryset."""
421
- return set(self.values_list("id", flat=True))
@@ -213,7 +213,7 @@ class Extraction(models.Model):
213
213
  return self.duration.total_seconds() / (60 * 60 * 24)
214
214
 
215
215
  @property
216
- def status_enum(self) -> "Extraction.Status":
216
+ def status_2(self) -> "Extraction.Status":
217
217
  """Return current status as enum type."""
218
218
  return self.Status(self.status)
219
219
 
@@ -120,6 +120,11 @@ class Moon(models.Model):
120
120
  """Return name of this moon."""
121
121
  return self.eve_moon.name.replace("Moon ", "")
122
122
 
123
+ @property
124
+ def id(self) -> int:
125
+ """Return id of this moon."""
126
+ return self.eve_moon.id
127
+
123
128
  def region(self) -> EveRegion:
124
129
  """Return region."""
125
130
  return self.solar_system().eve_constellation.eve_region
@@ -105,10 +105,10 @@ class Notification(models.Model):
105
105
 
106
106
  def to_calculated_extraction(self) -> CalculatedExtraction:
107
107
  """Generate a calculated extraction from this notification."""
108
- params = {"refinery_id": self.details["structureID"]}
109
- if self.notif_type == NotificationType.MOONMINING_EXTRACTION_STARTED:
110
- params.update(
111
- {
108
+ match self.notif_type:
109
+ case NotificationType.MOONMINING_EXTRACTION_STARTED:
110
+ params = {
111
+ "refinery_id": self.details["structureID"],
112
112
  "status": CalculatedExtraction.Status.STARTED,
113
113
  "chunk_arrival_at": ldap_time_2_datetime(self.details["readyTime"]),
114
114
  "auto_fracture_at": ldap_time_2_datetime(self.details["autoTime"]),
@@ -118,23 +118,28 @@ class Notification(models.Model):
118
118
  self.details["oreVolumeByType"]
119
119
  ),
120
120
  }
121
- )
122
- elif self.notif_type == NotificationType.MOONMINING_EXTRACTION_FINISHED:
123
- params.update(
124
- {
121
+
122
+ case NotificationType.MOONMINING_EXTRACTION_CANCELLED:
123
+ params = {
124
+ "refinery_id": self.details["structureID"],
125
+ "status": CalculatedExtraction.Status.CANCELED,
126
+ "canceled_at": self.timestamp,
127
+ "canceled_by": self.details.get("cancelledBy"),
128
+ }
129
+
130
+ case NotificationType.MOONMINING_EXTRACTION_FINISHED:
131
+ params = {
132
+ "refinery_id": self.details["structureID"],
125
133
  "status": CalculatedExtraction.Status.READY,
126
134
  "auto_fracture_at": ldap_time_2_datetime(self.details["autoTime"]),
127
135
  "products": CalculatedExtractionProduct.create_list_from_dict(
128
136
  self.details["oreVolumeByType"]
129
137
  ),
130
138
  }
131
- )
132
- elif self.notif_type in {
133
- NotificationType.MOONMINING_LASER_FIRED,
134
- NotificationType.MOONMINING_AUTOMATIC_FRACTURE,
135
- }:
136
- params.update(
137
- {
139
+
140
+ case NotificationType.MOONMINING_LASER_FIRED:
141
+ params = {
142
+ "refinery_id": self.details["structureID"],
138
143
  "fractured_by": self.details.get("firedBy"),
139
144
  "fractured_at": self.timestamp,
140
145
  "status": CalculatedExtraction.Status.COMPLETED,
@@ -142,13 +147,18 @@ class Notification(models.Model):
142
147
  self.details["oreVolumeByType"]
143
148
  ),
144
149
  }
145
- )
146
- elif self.notif_type == NotificationType.MOONMINING_EXTRACTION_CANCELLED:
147
- params.update(
148
- {
149
- "status": CalculatedExtraction.Status.CANCELED,
150
- "canceled_at": self.timestamp,
151
- "canceled_by": self.details.get("cancelledBy"),
150
+
151
+ case NotificationType.MOONMINING_AUTOMATIC_FRACTURE:
152
+ params = {
153
+ "refinery_id": self.details["structureID"],
154
+ "fractured_at": self.timestamp,
155
+ "status": CalculatedExtraction.Status.COMPLETED,
156
+ "products": CalculatedExtractionProduct.create_list_from_dict(
157
+ self.details["oreVolumeByType"]
158
+ ),
152
159
  }
153
- )
160
+
161
+ case _:
162
+ raise NotImplementedError(f"not implemented for: {self.notif_type}")
163
+
154
164
  return CalculatedExtraction(**params)