aa-structures 2.11.0__tar.gz → 2.13.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 (230) hide show
  1. {aa_structures-2.11.0 → aa_structures-2.13.0}/PKG-INFO +1 -1
  2. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/__init__.py +1 -1
  3. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/main.py +76 -31
  4. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/orbital_embeds.py +1 -1
  5. aa_structures-2.13.0/structures/core/notification_embeds/skyhook_embeds.py +89 -0
  6. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/structures_embeds.py +23 -12
  7. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/tower_embeds.py +1 -1
  8. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_types.py +57 -36
  9. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/managers.py +9 -6
  10. aa_structures-2.13.0/structures/migrations/0007_add_notificationtypes_skyhook_metenox.py +149 -0
  11. aa_structures-2.13.0/structures/migrations/0008_add_notificationtypes_skyhook_metenox.py +149 -0
  12. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/notifications.py +5 -1
  13. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/notification_embeds/test_main.py +20 -0
  14. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_notification_types.py +16 -0
  15. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_notifications_discord.py +21 -0
  16. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/create_eveuniverse.py +6 -1
  17. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/entities.json +71 -1
  18. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/eveuniverse.json +6306 -5145
  19. aa_structures-2.13.0/structures/tests/testdata/generate_notifications.py +164 -0
  20. aa_structures-2.11.0/structures/tests/testdata/generate_notifications.py +0 -179
  21. {aa_structures-2.11.0 → aa_structures-2.13.0}/LICENSE +0 -0
  22. {aa_structures-2.11.0 → aa_structures-2.13.0}/README.md +0 -0
  23. {aa_structures-2.11.0 → aa_structures-2.13.0}/pyproject.toml +0 -0
  24. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/admin.py +0 -0
  25. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/app_settings.py +0 -0
  26. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/apps.py +0 -0
  27. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/auth_hooks.py +0 -0
  28. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/constants.py +0 -0
  29. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/__init__.py +0 -0
  30. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/__init__.py +0 -0
  31. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/billing_embeds.py +0 -0
  32. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/corporate_embeds.py +0 -0
  33. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/helpers.py +0 -0
  34. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/moonmining_embeds.py +0 -0
  35. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/sov_embeds.py +0 -0
  36. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_embeds/war_embeds.py +0 -0
  37. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/notification_timers.py +0 -0
  38. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/serializers.py +0 -0
  39. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/sovereignty.py +0 -0
  40. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/core/starbases.py +0 -0
  41. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/forms.py +0 -0
  42. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/helpers.py +0 -0
  43. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/de/LC_MESSAGES/django.mo +0 -0
  44. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/de/LC_MESSAGES/django.po +0 -0
  45. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/django.pot +0 -0
  46. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/en/LC_MESSAGES/django.mo +0 -0
  47. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/en/LC_MESSAGES/django.po +0 -0
  48. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/es/LC_MESSAGES/django.mo +0 -0
  49. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/es/LC_MESSAGES/django.po +0 -0
  50. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  51. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/fr_FR/LC_MESSAGES/django.po +0 -0
  52. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  53. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/it_IT/LC_MESSAGES/django.po +0 -0
  54. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ja/LC_MESSAGES/django.mo +0 -0
  55. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ja/LC_MESSAGES/django.po +0 -0
  56. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  57. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ko_KR/LC_MESSAGES/django.po +0 -0
  58. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ru/LC_MESSAGES/django.mo +0 -0
  59. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/ru/LC_MESSAGES/django.po +0 -0
  60. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/uk/LC_MESSAGES/django.mo +0 -0
  61. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/uk/LC_MESSAGES/django.po +0 -0
  62. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  63. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  64. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/management/commands/__init__.py +0 -0
  65. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/management/commands/structures_load_eve.py +0 -0
  66. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/management/commands/structures_preload_eveuniverse.py +0 -0
  67. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/management/commands/structures_update_poco_planets.py +0 -0
  68. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0001_initial_new.py +0 -0
  69. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0002_remove_eveuniverse_relation_names.py +0 -0
  70. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0003_add_localization_and_unique_key.py +0 -0
  71. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0004_improve_localization.py +0 -0
  72. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0005_add_notification_types.py +0 -0
  73. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/0006_add_ownercharacter_disabled.py +0 -0
  74. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/migrations/__init__.py +0 -0
  75. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/__init__.py +0 -0
  76. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/eveuniverse.py +0 -0
  77. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/owners.py +0 -0
  78. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/structures_1.py +0 -0
  79. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/models/structures_2.py +0 -0
  80. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/providers.py +0 -0
  81. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/css/global.css +0 -0
  82. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/css/main.css +0 -0
  83. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/css/public.css +0 -0
  84. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/css/statistics.css +0 -0
  85. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/css/structures.css +0 -0
  86. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/bars-rotate-fade-black-36.svg +0 -0
  87. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/bars-rotate-fade-white-36.svg +0 -0
  88. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/eve_symbol_128.png +0 -0
  89. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/0h.png +0 -0
  90. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/0l.png +0 -0
  91. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/0m.png +0 -0
  92. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/0r.png +0 -0
  93. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/0s.png +0 -0
  94. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/1h.png +0 -0
  95. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/1l.png +0 -0
  96. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/1m.png +0 -0
  97. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/1r.png +0 -0
  98. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/2h.png +0 -0
  99. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/2l.png +0 -0
  100. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/2m.png +0 -0
  101. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/2r.png +0 -0
  102. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/3h.png +0 -0
  103. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/3l.png +0 -0
  104. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/3m.png +0 -0
  105. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/3r.png +0 -0
  106. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/4h.png +0 -0
  107. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/4l.png +0 -0
  108. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/4m.png +0 -0
  109. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/4s.png +0 -0
  110. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/5h.png +0 -0
  111. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/5l.png +0 -0
  112. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/5m.png +0 -0
  113. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/5s.png +0 -0
  114. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/6h.png +0 -0
  115. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/6l.png +0 -0
  116. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/6m.png +0 -0
  117. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/7h.png +0 -0
  118. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/7l.png +0 -0
  119. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/7m.png +0 -0
  120. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/8h.png +0 -0
  121. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/8l.png +0 -0
  122. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/8m.png +0 -0
  123. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/blank.png +0 -0
  124. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/circle.png +0 -0
  125. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/dustwheel.png +0 -0
  126. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/h.png +0 -0
  127. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/l.png +0 -0
  128. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/m.png +0 -0
  129. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/noship.png +0 -0
  130. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/r.png +0 -0
  131. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/tyrannis.png +0 -0
  132. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/tyrannis_blue.png +0 -0
  133. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/tyrannis_darkred.png +0 -0
  134. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/tyrannis_default.png +0 -0
  135. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/panel/tyrannis_revelations.png +0 -0
  136. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/img/structures_logo.png +0 -0
  137. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/js/global.js +0 -0
  138. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/js/public.js +0 -0
  139. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/js/statistics.js +0 -0
  140. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/js/structures.js +0 -0
  141. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/vendor/datatables/plugins/dataTables.rowGroup.min.js +0 -0
  142. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/vendor/datatables/plugins/datetime.js +0 -0
  143. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/vendor/datatables/plugins/filterDropDown.min.js +0 -0
  144. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/vendor/datatables/plugins/rowGroup.bootstrap.min.css +0 -0
  145. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/static/structures/vendor/datatables/plugins/rowGroup.dataTables.min.css +0 -0
  146. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tasks.py +0 -0
  147. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/base.html +0 -0
  148. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/fitting_assets.html +0 -0
  149. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/fitting_gfx.html +0 -0
  150. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/poco_details.html +0 -0
  151. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/starbase_detail.html +0 -0
  152. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/structure_details.html +0 -0
  153. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/tab_general_detail.html +0 -0
  154. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/modals/tab_services_detail.html +0 -0
  155. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/menu.html +0 -0
  156. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/public/poco_list.html +0 -0
  157. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/statistics/structure_summary.html +0 -0
  158. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/structures/active_tags.html +0 -0
  159. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/structures/jump_gates_list.html +0 -0
  160. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/structures/poco_list.html +0 -0
  161. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/structures/starbase_list.html +0 -0
  162. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/partials/structures/structure_list.html +0 -0
  163. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/public.html +0 -0
  164. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/statistics.html +0 -0
  165. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/structures.html +0 -0
  166. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/templatetags/detail_title.html +0 -0
  167. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/templatetags/list_asset.html +0 -0
  168. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/templatetags/list_item.html +0 -0
  169. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/templatetags/list_tax_item.html +0 -0
  170. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templates/structures/templatetags/list_title.html +0 -0
  171. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templatetags/__init__.py +0 -0
  172. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/templatetags/structures.py +0 -0
  173. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/__init__.py +0 -0
  174. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/__init__.py +0 -0
  175. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/notification_embeds/__init__.py +0 -0
  176. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/notification_embeds/test_helpers.py +0 -0
  177. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_notification_structuretimers.py +0 -0
  178. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_notifications_timerboard.py +0 -0
  179. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_serializers.py +0 -0
  180. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_sovereignty.py +0 -0
  181. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/core/test_starbases.py +0 -0
  182. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/integration/__init__.py +0 -0
  183. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/integration/test_tasks.py +0 -0
  184. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/integration/test_views.py +0 -0
  185. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/__init__.py +0 -0
  186. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_eveuniverse.py +0 -0
  187. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_notifications_1.py +0 -0
  188. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_notifications_2.py +0 -0
  189. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_notifications_3.py +0 -0
  190. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_1.py +0 -0
  191. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_2.py +0 -0
  192. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_3.py +0 -0
  193. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_4.py +0 -0
  194. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_5.py +0 -0
  195. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_owners_6.py +0 -0
  196. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/models/test_structures.py +0 -0
  197. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/test_admin.py +0 -0
  198. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/test_helpers.py +0 -0
  199. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/test_managers_1.py +0 -0
  200. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/test_managers_2.py +0 -0
  201. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/test_tasks.py +0 -0
  202. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/__init__.py +0 -0
  203. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/esi_data.json +0 -0
  204. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/factories.py +0 -0
  205. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/generate_notifications_2.py +0 -0
  206. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/generate_structures.py +0 -0
  207. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/helpers.py +0 -0
  208. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/load_eveuniverse.py +0 -0
  209. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/tasks_loadtest.py +0 -0
  210. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/testdata/test_generate_structures.py +0 -0
  211. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/__init__.py +0 -0
  212. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/test_public.py +0 -0
  213. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/test_service_status.py +0 -0
  214. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/test_statistics.py +0 -0
  215. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/test_structures.py +0 -0
  216. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/tests/views/utils.py +0 -0
  217. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/urls.py +0 -0
  218. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/__init__.py +0 -0
  219. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/common.py +0 -0
  220. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/public.py +0 -0
  221. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/statistics.py +0 -0
  222. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/status.py +0 -0
  223. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/views/structures.py +0 -0
  224. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/__init__.py +0 -0
  225. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/core.py +0 -0
  226. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/managers.py +0 -0
  227. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/models.py +0 -0
  228. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/tests/__init__.py +0 -0
  229. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/tests/test_core.py +0 -0
  230. {aa_structures-2.11.0 → aa_structures-2.13.0}/structures/webhooks/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aa-structures
3
- Version: 2.11.0
3
+ Version: 2.13.0
4
4
  Summary: App for managing Eve Online structures with Alliance Auth.
5
5
  Author-email: Erik Kalkoken <kalkoken87@gmail.com>
6
6
  Requires-Python: >=3.8
@@ -3,5 +3,5 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "structures.apps.StructuresConfig"
5
5
 
6
- __version__ = "2.11.0"
6
+ __version__ = "2.13.0"
7
7
  __title__ = "Structures"
@@ -10,6 +10,8 @@ import dhooks_lite
10
10
  from django.conf import settings
11
11
  from django.utils.translation import gettext as _
12
12
 
13
+ from allianceauth.services.hooks import get_extension_logger
14
+ from app_utils.logging import LoggerAddTag
13
15
  from app_utils.urls import reverse_absolute, static_file_absolute_url
14
16
 
15
17
  from structures import __title__
@@ -17,7 +19,9 @@ from structures.core.notification_types import NotificationType
17
19
  from structures.helpers import get_or_create_eve_entity, is_absolute_url
18
20
  from structures.models.notifications import Notification, NotificationBase, Webhook
19
21
 
20
- from .helpers import target_datetime_formatted
22
+ from .helpers import gen_alliance_link, gen_corporation_link, target_datetime_formatted
23
+
24
+ logger = LoggerAddTag(get_extension_logger(__name__), __title__)
21
25
 
22
26
 
23
27
  class NotificationBaseEmbed:
@@ -73,9 +77,9 @@ class NotificationBaseEmbed:
73
77
  damage_text = " | ".join(damage_parts)
74
78
  return damage_text
75
79
 
76
- def get_aggressor_link(self) -> str:
80
+ def gen_aggressor_link(self) -> str:
77
81
  """Returns the aggressor link from a parsed_text for POS and POCOs only."""
78
- if self._data.get("aggressorAllianceID"):
82
+ if key := self._data.get("aggressorAllianceID"):
79
83
  key = "aggressorAllianceID"
80
84
  elif self._data.get("aggressorCorpID"):
81
85
  key = "aggressorCorpID"
@@ -86,6 +90,16 @@ class NotificationBaseEmbed:
86
90
  entity = get_or_create_eve_entity(id=self._data[key])
87
91
  return Webhook.create_link(entity.name, entity.profile_url)
88
92
 
93
+ def gen_attacker_link(self) -> str:
94
+ """Returns the attacker link from a parsed_text for Upwell structures only."""
95
+ if name := self._data.get("allianceName"):
96
+ return gen_alliance_link(name)
97
+
98
+ if name := self._data.get("corpName"):
99
+ return gen_corporation_link(name)
100
+
101
+ return _("(unknown)")
102
+
89
103
  def fuel_expires_target_date(self) -> str:
90
104
  """Return calculated target date when fuel expires. Returns '?' when no data."""
91
105
  if self._structure and self._structure.fuel_expires_at:
@@ -141,6 +155,20 @@ class NotificationBaseEmbed:
141
155
  footer_text += f" #{my_text}"
142
156
  footer_icon_url = footer_icon_url if is_absolute_url(footer_icon_url) else None
143
157
  footer = dhooks_lite.Footer(text=footer_text, icon_url=footer_icon_url)
158
+ max_description = dhooks_lite.Embed.MAX_DESCRIPTION
159
+ if self._description and len(self._description) > max_description:
160
+ logger.warning(
161
+ "%s: Description of notification is too long: %s",
162
+ self,
163
+ self._description,
164
+ )
165
+ self._description = self._description[:max_description]
166
+ max_title = dhooks_lite.Embed.MAX_TITLE
167
+ if self._title and len(self._title) > max_title:
168
+ logger.warning(
169
+ "%s: Title of notification is too long: %s", self, self._title
170
+ )
171
+ self._title = self._title[:max_title]
144
172
  return dhooks_lite.Embed(
145
173
  author=author,
146
174
  color=self._color,
@@ -182,6 +210,13 @@ class NotificationBaseEmbed:
182
210
  NotificationOrbitalAttacked,
183
211
  NotificationOrbitalReinforced,
184
212
  )
213
+ from .skyhook_embeds import (
214
+ NotificationSkyhookDeployed,
215
+ NotificationSkyhookDestroyed,
216
+ NotificationSkyhookLostShield,
217
+ NotificationSkyhookOnline,
218
+ NotificationSkyhookUnderAttack,
219
+ )
185
220
  from .sov_embeds import (
186
221
  NotificationSovAllAnchoringMsg,
187
222
  NotificationSovAllClaimAcquiredMsg,
@@ -198,6 +233,8 @@ class NotificationBaseEmbed:
198
233
  NotificationStructureJumpFuelAlert,
199
234
  NotificationStructureLostArmor,
200
235
  NotificationStructureLostShield,
236
+ NotificationStructureLowReagentsAlert,
237
+ NotificationStructureNoReagentsAlert,
201
238
  NotificationStructureOnline,
202
239
  NotificationStructureOwnershipTransferred,
203
240
  NotificationStructureRefueledExtra,
@@ -242,76 +279,84 @@ class NotificationBaseEmbed:
242
279
  NT = NotificationType
243
280
  notif_type_2_class = {
244
281
  # Billing
245
- NT.BILLING_CORP_ALL_BILL_MSG: NotificationCorpAllBillMsg,
246
282
  NT.BILLING_BILL_OUT_OF_MONEY_MSG: NotificationBillingBillOutOfMoneyMsg,
283
+ NT.BILLING_CORP_ALL_BILL_MSG: NotificationCorpAllBillMsg,
247
284
  NT.BILLING_I_HUB_BILL_ABOUT_TO_EXPIRE: NotificationBillingIHubBillAboutToExpire,
248
285
  NT.BILLING_I_HUB_DESTROYED_BY_BILL_FAILURE: NotificationBillingIHubDestroyedByBillFailure,
249
286
  # character
250
- NT.CORP_APP_NEW_MSG: NotificationCorpAppNewMsg,
287
+ NT.CHAR_APP_ACCEPT_MSG: NotificationCharAppAcceptMsg,
288
+ NT.CHAR_APP_WITHDRAW_MSG: NotificationCharAppWithdrawMsg,
289
+ NT.CHAR_LEFT_CORP_MSG: NotificationCharLeftCorpMsg,
251
290
  NT.CORP_APP_INVITED_MSG: NotificationCorpAppInvitedMsg,
291
+ NT.CORP_APP_NEW_MSG: NotificationCorpAppNewMsg,
252
292
  NT.CORP_APP_REJECT_CUSTOM_MSG: NotificationCorpAppRejectCustomMsg,
253
293
  NT.CORP_APP_REJECT_MSG: NotificationCharAppRejectMsg,
254
- NT.CHAR_APP_WITHDRAW_MSG: NotificationCharAppWithdrawMsg,
255
- NT.CHAR_APP_ACCEPT_MSG: NotificationCharAppAcceptMsg,
256
- NT.CHAR_LEFT_CORP_MSG: NotificationCharLeftCorpMsg,
257
294
  # moonmining
258
- NT.MOONMINING_EXTRACTION_STARTED: NotificationMoonminningExtractionStarted,
259
- NT.MOONMINING_EXTRACTION_FINISHED: NotificationMoonminningExtractionFinished,
260
295
  NT.MOONMINING_AUTOMATIC_FRACTURE: NotificationMoonminningAutomaticFracture,
261
296
  NT.MOONMINING_EXTRACTION_CANCELLED: NotificationMoonminningExtractionCanceled,
297
+ NT.MOONMINING_EXTRACTION_FINISHED: NotificationMoonminningExtractionFinished,
298
+ NT.MOONMINING_EXTRACTION_STARTED: NotificationMoonminningExtractionStarted,
262
299
  NT.MOONMINING_LASER_FIRED: NotificationMoonminningLaserFired,
263
300
  # Orbitals
264
301
  NT.ORBITAL_ATTACKED: NotificationOrbitalAttacked,
265
302
  NT.ORBITAL_REINFORCED: NotificationOrbitalReinforced,
266
303
  # Sov
267
- NT.SOV_ENTOSIS_CAPTURE_STARTED: NotificationSovEntosisCaptureStarted,
268
- NT.SOV_COMMAND_NODE_EVENT_STARTED: NotificationSovCommandNodeEventStarted,
304
+ NT.SOV_ALL_ANCHORING_MSG: NotificationSovAllAnchoringMsg,
269
305
  NT.SOV_ALL_CLAIM_ACQUIRED_MSG: NotificationSovAllClaimAcquiredMsg,
270
306
  NT.SOV_ALL_CLAIM_LOST_MSG: NotificationSovAllClaimLostMsg,
271
- NT.SOV_STRUCTURE_REINFORCED: NotificationSovStructureReinforced,
307
+ NT.SOV_COMMAND_NODE_EVENT_STARTED: NotificationSovCommandNodeEventStarted,
308
+ NT.SOV_ENTOSIS_CAPTURE_STARTED: NotificationSovEntosisCaptureStarted,
272
309
  NT.SOV_STRUCTURE_DESTROYED: NotificationSovStructureDestroyed,
273
- NT.SOV_ALL_ANCHORING_MSG: NotificationSovAllAnchoringMsg,
310
+ NT.SOV_STRUCTURE_REINFORCED: NotificationSovStructureReinforced,
274
311
  # Towers
275
312
  NT.TOWER_ALERT_MSG: NotificationTowerAlertMsg,
276
- NT.TOWER_RESOURCE_ALERT_MSG: NotificationTowerResourceAlertMsg,
277
313
  NT.TOWER_REFUELED_EXTRA: NotificationTowerRefueledExtra,
278
314
  NT.TOWER_REINFORCED_EXTRA: NotificationTowerReinforcedExtra,
315
+ NT.TOWER_RESOURCE_ALERT_MSG: NotificationTowerResourceAlertMsg,
316
+ # Skyhooks
317
+ NT.SKYHOOK_DEPLOYED: NotificationSkyhookDeployed,
318
+ NT.SKYHOOK_DESTROYED: NotificationSkyhookDestroyed,
319
+ NT.SKYHOOK_LOST_SHIELDS: NotificationSkyhookLostShield,
320
+ NT.SKYHOOK_ONLINE: NotificationSkyhookOnline,
321
+ NT.SKYHOOK_UNDER_ATTACK: NotificationSkyhookUnderAttack,
279
322
  # Upwell structures
280
- NT.STRUCTURE_ONLINE: NotificationStructureOnline,
323
+ NT.OWNERSHIP_TRANSFERRED: NotificationStructureOwnershipTransferred,
324
+ NT.STRUCTURE_ANCHORING: NotificationStructureAnchoring,
325
+ NT.STRUCTURE_DESTROYED: NotificationStructureDestroyed,
281
326
  NT.STRUCTURE_FUEL_ALERT: NotificationStructureFuelAlert,
282
327
  NT.STRUCTURE_JUMP_FUEL_ALERT: NotificationStructureJumpFuelAlert,
328
+ NT.STRUCTURE_LOST_ARMOR: NotificationStructureLostArmor,
329
+ NT.STRUCTURE_LOST_SHIELD: NotificationStructureLostShield,
330
+ NT.STRUCTURE_LOW_REAGENTS_ALERT: NotificationStructureLowReagentsAlert,
331
+ NT.STRUCTURE_NO_REAGENTS_ALERT: NotificationStructureNoReagentsAlert,
332
+ NT.STRUCTURE_ONLINE: NotificationStructureOnline,
283
333
  NT.STRUCTURE_REFUELED_EXTRA: NotificationStructureRefueledExtra,
334
+ NT.STRUCTURE_REINFORCEMENT_CHANGED: NotificationStructureReinforceChange,
284
335
  NT.STRUCTURE_SERVICES_OFFLINE: NotificationStructureServicesOffline,
285
- NT.STRUCTURE_WENT_LOW_POWER: NotificationStructureWentLowPower,
286
- NT.STRUCTURE_WENT_HIGH_POWER: NotificationStructureWentHighPower,
287
336
  NT.STRUCTURE_UNANCHORING: NotificationStructureUnanchoring,
288
337
  NT.STRUCTURE_UNDER_ATTACK: NotificationStructureUnderAttack,
289
- NT.STRUCTURE_LOST_SHIELD: NotificationStructureLostShield,
290
- NT.STRUCTURE_LOST_ARMOR: NotificationStructureLostArmor,
291
- NT.STRUCTURE_DESTROYED: NotificationStructureDestroyed,
292
- NT.OWNERSHIP_TRANSFERRED: NotificationStructureOwnershipTransferred,
293
- NT.STRUCTURE_ANCHORING: NotificationStructureAnchoring,
294
- NT.STRUCTURE_REINFORCEMENT_CHANGED: NotificationStructureReinforceChange,
338
+ NT.STRUCTURE_WENT_HIGH_POWER: NotificationStructureWentHighPower,
339
+ NT.STRUCTURE_WENT_LOW_POWER: NotificationStructureWentLowPower,
295
340
  # War
296
341
  NT.WAR_ACCEPTED_ALLY: NotificationAcceptedAlly,
342
+ NT.WAR_ALL_WAR_CORP_JOINED_ALLIANCE_MSG: NotificationAllWarCorpJoinedAllianceMsg,
343
+ NT.WAR_ALL_WAR_SURRENDER_MSG: NotificationAllWarSurrenderMsg,
297
344
  NT.WAR_ALLY_JOINED_WAR_AGGRESSOR_MSG: NotificationAllyJoinedWarMsg,
298
345
  NT.WAR_ALLY_JOINED_WAR_ALLY_MSG: NotificationAllyJoinedWarMsg,
299
346
  NT.WAR_ALLY_JOINED_WAR_DEFENDER_MSG: NotificationAllyJoinedWarMsg,
300
- NT.WAR_ALL_WAR_CORP_JOINED_ALLIANCE_MSG: NotificationAllWarCorpJoinedAllianceMsg,
301
- NT.WAR_ALL_WAR_SURRENDER_MSG: NotificationAllWarSurrenderMsg,
347
+ NT.WAR_CORP_WAR_SURRENDER_MSG: NotificationCorpWarSurrenderMsg,
302
348
  NT.WAR_CORPORATION_BECAME_ELIGIBLE: NotificationWarCorporationBecameEligible,
303
349
  NT.WAR_CORPORATION_NO_LONGER_ELIGIBLE: NotificationWarCorporationNoLongerEligible,
304
350
  NT.WAR_DECLARE_WAR: NotificationDeclareWar,
305
- NT.WAR_MERC_OFFERED_NEGOTIATION_MSG: NotificationMercOfferedNegotiationMsg,
306
- NT.WAR_MERC_OFFER_RETRACTED_MSG: NotificationMercOfferRetractedMsg,
307
- NT.WAR_CORP_WAR_SURRENDER_MSG: NotificationCorpWarSurrenderMsg,
308
351
  NT.WAR_HQ_REMOVED_FROM_SPACE: NotificationWarHQRemovedFromSpace,
309
- NT.WAR_OFFERED_TO_ALLY: NotificationOfferedToAlly,
352
+ NT.WAR_INVALID: NotificationWarInvalid,
353
+ NT.WAR_MERC_OFFER_RETRACTED_MSG: NotificationMercOfferRetractedMsg,
354
+ NT.WAR_MERC_OFFERED_NEGOTIATION_MSG: NotificationMercOfferedNegotiationMsg,
310
355
  NT.WAR_OFFERED_SURRENDER: NotificationOfferedSurrender,
356
+ NT.WAR_OFFERED_TO_ALLY: NotificationOfferedToAlly,
311
357
  NT.WAR_WAR_ADOPTED: NotificationWarAdopted,
312
358
  NT.WAR_WAR_DECLARED: NotificationWarDeclared,
313
359
  NT.WAR_WAR_INHERITED: NotificationWarInherited,
314
- NT.WAR_INVALID: NotificationWarInvalid,
315
360
  NT.WAR_WAR_RETRACTED_BY_CONCORD: NotificationWarRetractedByConcord,
316
361
  NT.WAR_WAR_SURRENDER_OFFER_MSG: NotificationWarSurrenderOfferMsg,
317
362
  }
@@ -31,7 +31,7 @@ class NotificationOrbitalEmbed(NotificationBaseEmbed):
31
31
  self._notification.eve_solar_system()
32
32
  )
33
33
  self._owner_link = gen_corporation_link(str(notification.owner))
34
- self._aggressor_link = self.get_aggressor_link()
34
+ self._aggressor_link = self.gen_aggressor_link()
35
35
  self._thumbnail = dhooks_lite.Thumbnail(
36
36
  self._structure_type.icon_url(size=self.ICON_DEFAULT_SIZE)
37
37
  )
@@ -0,0 +1,89 @@
1
+ """Skyhook embeds."""
2
+
3
+ # pylint: disable=missing-class-docstring
4
+
5
+ import dhooks_lite
6
+
7
+ from django.utils.translation import gettext as _
8
+
9
+ from app_utils.datetime import ldap_time_2_datetime
10
+
11
+ from structures.models import Notification, Webhook
12
+
13
+ from .helpers import (
14
+ gen_corporation_link,
15
+ gen_solar_system_text,
16
+ target_datetime_formatted,
17
+ )
18
+ from .main import NotificationBaseEmbed
19
+
20
+
21
+ class NotificationSkyhookEmbed(NotificationBaseEmbed):
22
+ """Base class for most structure related notification embeds."""
23
+
24
+ def __init__(self, n: Notification) -> None:
25
+ super().__init__(n)
26
+ type_ = n.eve_structure_type("typeID")
27
+ solar_system = n.eve_solar_system("solarsystemID")
28
+ self._description = _(
29
+ "The %(structure_type)s at **%(planet)s** "
30
+ "in %(solar_system)s belonging to %(owner_link)s "
31
+ ) % {
32
+ "structure_type": type_,
33
+ "planet": n.eve_planet(),
34
+ "solar_system": gen_solar_system_text(solar_system),
35
+ "owner_link": gen_corporation_link(str(n.owner)),
36
+ }
37
+ self._thumbnail = dhooks_lite.Thumbnail(
38
+ type_.icon_url(size=self.ICON_DEFAULT_SIZE)
39
+ )
40
+
41
+
42
+ class NotificationSkyhookDeployed(NotificationSkyhookEmbed):
43
+ def __init__(self, n: Notification) -> None:
44
+ super().__init__(n)
45
+ self._title = _("Skyhook has started onlining")
46
+ self._description += _("has started onlining.")
47
+ self._color = Webhook.Color.INFO
48
+
49
+
50
+ class NotificationSkyhookDestroyed(NotificationSkyhookEmbed):
51
+ def __init__(self, n: Notification) -> None:
52
+ super().__init__(n)
53
+ self._title = _("Skyhook destroyed")
54
+ self._description += _("has been destroyed.")
55
+ self._color = Webhook.Color.DANGER
56
+
57
+
58
+ class NotificationSkyhookLostShield(NotificationSkyhookEmbed):
59
+ def __init__(self, n: Notification) -> None:
60
+ super().__init__(n)
61
+ self._title = _("Skyhook lost shield")
62
+ timer_ends_at = ldap_time_2_datetime(self._data["timestamp"])
63
+ self._description += _(
64
+ "has lost its shields and is now in reinforcement state until : %s"
65
+ ) % target_datetime_formatted(timer_ends_at)
66
+ self._color = Webhook.Color.DANGER
67
+
68
+
69
+ class NotificationSkyhookOnline(NotificationSkyhookEmbed):
70
+ def __init__(self, n: Notification) -> None:
71
+ super().__init__(n)
72
+ self._title = _("Skyhook online")
73
+ self._description += _("is now online.")
74
+ self._color = Webhook.Color.SUCCESS
75
+
76
+
77
+ class NotificationSkyhookUnderAttack(NotificationSkyhookEmbed):
78
+ def __init__(self, n: Notification) -> None:
79
+ super().__init__(n)
80
+ self._title = _("Skyhook under attack")
81
+ self._description += _(
82
+ "is under attack by %(attacker)s.\n"
83
+ "%(damage_text)s"
84
+ % {
85
+ "attacker": self.gen_attacker_link(),
86
+ "damage_text": self.compile_damage_text("Percentage"),
87
+ }
88
+ )
89
+ self._color = Webhook.Color.DANGER
@@ -14,7 +14,6 @@ from structures.helpers import get_or_create_eve_entity, get_or_create_eve_type
14
14
  from structures.models import Notification, Structure, Webhook
15
15
 
16
16
  from .helpers import (
17
- gen_alliance_link,
18
17
  gen_corporation_link,
19
18
  gen_solar_system_text,
20
19
  target_datetime_formatted,
@@ -165,21 +164,11 @@ class NotificationStructureUnderAttack(NotificationStructureEmbed):
165
164
  super().__init__(notification)
166
165
  self._title = _("Structure under attack")
167
166
  self._description += _("is under attack by %(attacker)s.\n%(damage_text)s") % {
168
- "attacker": self._get_attacker_link(),
167
+ "attacker": self.gen_attacker_link(),
169
168
  "damage_text": self.compile_damage_text("Percentage"),
170
169
  }
171
170
  self._color = Webhook.Color.DANGER
172
171
 
173
- def _get_attacker_link(self) -> str:
174
- """Returns the attacker link from a parsed_text for Upwell structures only."""
175
- if self._data.get("allianceName"):
176
- return gen_alliance_link(self._data["allianceName"])
177
-
178
- if self._data.get("corpName"):
179
- return gen_corporation_link(self._data["corpName"])
180
-
181
- return _("(unknown)")
182
-
183
172
 
184
173
  class NotificationStructureLostShield(NotificationStructureEmbed):
185
174
  def __init__(self, notification: Notification) -> None:
@@ -324,3 +313,25 @@ class NotificationStructureReinforceChange(NotificationBaseEmbed):
324
313
  _("\n\nChange becomes effective at %s.")
325
314
  ) % target_datetime_formatted(change_effective)
326
315
  self._color = Webhook.Color.INFO
316
+
317
+
318
+ class NotificationStructureLowReagentsAlert(NotificationStructureEmbed):
319
+ def __init__(self, notification: Notification) -> None:
320
+ super().__init__(notification)
321
+ self._title = _("Structure low on reagents")
322
+ self._description += _(
323
+ "has insufficient reagents present to support "
324
+ "one full day of moon drill activity."
325
+ )
326
+ self._color = Webhook.Color.WARNING
327
+
328
+
329
+ class NotificationStructureNoReagentsAlert(NotificationStructureEmbed):
330
+ def __init__(self, notification: Notification) -> None:
331
+ super().__init__(notification)
332
+ self._title = _("Structure out of reagents")
333
+ self._description += _(
334
+ "has run out of reagents, "
335
+ "which is preventing further moon material production."
336
+ )
337
+ self._color = Webhook.Color.DANGER
@@ -56,7 +56,7 @@ class NotificationTowerEmbed(NotificationBaseEmbed):
56
56
  class NotificationTowerAlertMsg(NotificationTowerEmbed):
57
57
  def __init__(self, notification: Notification) -> None:
58
58
  super().__init__(notification)
59
- aggressor_link = self.get_aggressor_link()
59
+ aggressor_link = self.gen_aggressor_link()
60
60
  damage_text = self.compile_damage_text("Value", 100)
61
61
  self._title = _("Starbase under attack")
62
62
  self._description += _("is under attack by %(aggressor)s.\n%(damage_text)s") % {
@@ -23,6 +23,12 @@ class NotificationType(models.TextChoices):
23
23
  )
24
24
  STRUCTURE_LOST_ARMOR = "StructureLostArmor", _("Upwell structure lost armor")
25
25
  STRUCTURE_LOST_SHIELD = "StructureLostShields", _("Upwell structure lost shields")
26
+ STRUCTURE_LOW_REAGENTS_ALERT = "StructureLowReagentsAlert", _(
27
+ "Structure low reagents alert"
28
+ )
29
+ STRUCTURE_NO_REAGENTS_ALERT = "StructureNoReagentsAlert", _(
30
+ "Structure no reagents alert"
31
+ )
26
32
  STRUCTURE_ONLINE = "StructureOnline", _("Upwell structure went online")
27
33
  STRUCTURE_REFUELED_EXTRA = "StructureRefueledExtra", _("Upwell structure refueled")
28
34
  STRUCTURE_REINFORCEMENT_CHANGED = "StructuresReinforcementChanged", _(
@@ -42,15 +48,22 @@ class NotificationType(models.TextChoices):
42
48
  "Upwell structure went low power"
43
49
  )
44
50
 
51
+ # Skyhook structures
52
+ SKYHOOK_DEPLOYED = "SkyhookDeployed", _("Skyhook deployed")
53
+ SKYHOOK_DESTROYED = "SkyhookDestroyed", _("Skyhook destroyed")
54
+ SKYHOOK_LOST_SHIELDS = "SkyhookLostShields", _("Skyhook lost shields")
55
+ SKYHOOK_ONLINE = "SkyhookOnline", _("Skyhook online")
56
+ SKYHOOK_UNDER_ATTACK = "SkyhookUnderAttack", _("Skyhook under attack")
57
+
45
58
  # customs offices
46
59
  ORBITAL_ATTACKED = "OrbitalAttacked", _("Customs office attacked")
47
60
  ORBITAL_REINFORCED = "OrbitalReinforced", _("Customs office reinforced")
48
61
 
49
62
  # starbases
50
63
  TOWER_ALERT_MSG = "TowerAlertMsg", _("Starbase attacked")
51
- TOWER_RESOURCE_ALERT_MSG = "TowerResourceAlertMsg", _("Starbase fuel alert")
52
64
  TOWER_REFUELED_EXTRA = "TowerRefueledExtra", _("Starbase refueled (BETA)")
53
65
  TOWER_REINFORCED_EXTRA = "TowerReinforcedExtra", _("Starbase reinforced (BETA)")
66
+ TOWER_RESOURCE_ALERT_MSG = "TowerResourceAlertMsg", _("Starbase fuel alert")
54
67
 
55
68
  # moon mining
56
69
  MOONMINING_AUTOMATIC_FRACTURE = "MoonminingAutomaticFracture", _(
@@ -121,7 +134,7 @@ class NotificationType(models.TextChoices):
121
134
  )
122
135
  WAR_OFFERED_SURRENDER = "OfferedSurrender", _("War offered surrender")
123
136
  WAR_OFFERED_TO_ALLY = "OfferedToAlly", _("War offered to become ally")
124
- WAR_WAR_ADOPTED = "WarAdopted", _("War adopted")
137
+ WAR_WAR_ADOPTED = "WarAdopted", _("War adopted") # FIXME: Should be "WarAdopted "
125
138
  WAR_WAR_DECLARED = "WarDeclared", _("War declared")
126
139
  WAR_WAR_INHERITED = "WarInherited", _("War inherited")
127
140
  WAR_WAR_RETRACTED_BY_CONCORD = "WarRetractedByConcord", _(
@@ -143,8 +156,8 @@ class NotificationType(models.TextChoices):
143
156
  CHAR_LEFT_CORP_MSG = "CharLeftCorpMsg", _("Character leaves corporation")
144
157
 
145
158
  # billing
146
- BILLING_CORP_ALL_BILL_MSG = "CorpAllBillMsg", _("Corp alliance billing message")
147
159
  BILLING_BILL_OUT_OF_MONEY_MSG = "BillOutOfMoneyMsg", _("Bill out of money")
160
+ BILLING_CORP_ALL_BILL_MSG = "CorpAllBillMsg", _("Corp alliance billing message")
148
161
  BILLING_I_HUB_BILL_ABOUT_TO_EXPIRE = (
149
162
  "InfrastructureHubBillAboutToExpire",
150
163
  _("I-HUB bill about to expire"),
@@ -173,34 +186,40 @@ class NotificationType(models.TextChoices):
173
186
  def webhook_defaults(cls) -> List["NotificationType"]:
174
187
  """List of default notifications for new webhooks."""
175
188
  return [
189
+ cls.ORBITAL_ATTACKED,
190
+ cls.ORBITAL_REINFORCED,
191
+ cls.SKYHOOK_DESTROYED,
192
+ cls.SKYHOOK_LOST_SHIELDS,
193
+ cls.SKYHOOK_ONLINE,
194
+ cls.SKYHOOK_UNDER_ATTACK,
195
+ cls.SOV_STRUCTURE_DESTROYED,
196
+ cls.SOV_STRUCTURE_REINFORCED,
176
197
  cls.STRUCTURE_ANCHORING,
177
198
  cls.STRUCTURE_DESTROYED,
178
199
  cls.STRUCTURE_FUEL_ALERT,
179
200
  cls.STRUCTURE_LOST_ARMOR,
180
201
  cls.STRUCTURE_LOST_SHIELD,
202
+ cls.STRUCTURE_LOW_REAGENTS_ALERT,
203
+ cls.STRUCTURE_NO_REAGENTS_ALERT,
181
204
  cls.STRUCTURE_ONLINE,
182
205
  cls.STRUCTURE_SERVICES_OFFLINE,
183
206
  cls.STRUCTURE_UNDER_ATTACK,
184
207
  cls.STRUCTURE_WENT_HIGH_POWER,
185
208
  cls.STRUCTURE_WENT_LOW_POWER,
186
- cls.ORBITAL_ATTACKED,
187
- cls.ORBITAL_REINFORCED,
188
209
  cls.TOWER_ALERT_MSG,
189
210
  cls.TOWER_RESOURCE_ALERT_MSG,
190
- cls.SOV_STRUCTURE_REINFORCED,
191
- cls.SOV_STRUCTURE_DESTROYED,
192
211
  ]
193
212
 
194
213
  @classmethod
195
214
  def relevant_for_timerboard(cls) -> Set["NotificationType"]:
196
215
  """Notification types that can create timers."""
197
216
  return {
198
- cls.STRUCTURE_LOST_SHIELD,
199
- cls.STRUCTURE_LOST_ARMOR,
200
- cls.ORBITAL_REINFORCED,
201
- cls.MOONMINING_EXTRACTION_STARTED,
202
217
  cls.MOONMINING_EXTRACTION_CANCELLED,
218
+ cls.MOONMINING_EXTRACTION_STARTED,
219
+ cls.ORBITAL_REINFORCED,
203
220
  cls.SOV_STRUCTURE_REINFORCED,
221
+ cls.STRUCTURE_LOST_ARMOR,
222
+ cls.STRUCTURE_LOST_SHIELD,
204
223
  cls.TOWER_REINFORCED_EXTRA,
205
224
  }
206
225
 
@@ -210,15 +229,15 @@ class NotificationType(models.TextChoices):
210
229
  return {
211
230
  # billing
212
231
  cls.BILLING_BILL_OUT_OF_MONEY_MSG,
213
- cls.BILLING_I_HUB_DESTROYED_BY_BILL_FAILURE,
214
232
  cls.BILLING_I_HUB_BILL_ABOUT_TO_EXPIRE,
233
+ cls.BILLING_I_HUB_DESTROYED_BY_BILL_FAILURE,
215
234
  # sov
216
- cls.SOV_ENTOSIS_CAPTURE_STARTED,
217
- cls.SOV_COMMAND_NODE_EVENT_STARTED,
218
235
  cls.SOV_ALL_CLAIM_ACQUIRED_MSG,
219
- cls.SOV_STRUCTURE_REINFORCED,
220
- cls.SOV_STRUCTURE_DESTROYED,
221
236
  cls.SOV_ALL_CLAIM_LOST_MSG,
237
+ cls.SOV_COMMAND_NODE_EVENT_STARTED,
238
+ cls.SOV_ENTOSIS_CAPTURE_STARTED,
239
+ cls.SOV_STRUCTURE_DESTROYED,
240
+ cls.SOV_STRUCTURE_REINFORCED,
222
241
  # cls.SOV_ALL_ANCHORING_MSG, # This notif is not broadcasted to all corporations
223
242
  # wars
224
243
  cls.WAR_ALLY_JOINED_WAR_AGGRESSOR_MSG,
@@ -238,43 +257,45 @@ class NotificationType(models.TextChoices):
238
257
  def relevant_for_moonmining(cls) -> Set["NotificationType"]:
239
258
  """Notification types about moon mining."""
240
259
  return {
241
- cls.MOONMINING_EXTRACTION_STARTED,
260
+ cls.MOONMINING_AUTOMATIC_FRACTURE,
242
261
  cls.MOONMINING_EXTRACTION_CANCELLED,
243
- cls.MOONMINING_LASER_FIRED,
244
262
  cls.MOONMINING_EXTRACTION_FINISHED,
245
- cls.MOONMINING_AUTOMATIC_FRACTURE,
263
+ cls.MOONMINING_EXTRACTION_STARTED,
264
+ cls.MOONMINING_LASER_FIRED,
246
265
  }
247
266
 
248
267
  @classmethod
249
268
  def structure_related(cls) -> Set["NotificationType"]:
250
269
  """Notification types that are related to a structure."""
251
270
  return {
252
- cls.STRUCTURE_ONLINE,
271
+ cls.MOONMINING_AUTOMATIC_FRACTURE,
272
+ cls.MOONMINING_EXTRACTION_CANCELLED,
273
+ cls.MOONMINING_EXTRACTION_FINISHED,
274
+ cls.MOONMINING_EXTRACTION_STARTED,
275
+ cls.MOONMINING_LASER_FIRED,
276
+ cls.ORBITAL_ATTACKED,
277
+ cls.ORBITAL_REINFORCED,
278
+ cls.OWNERSHIP_TRANSFERRED,
279
+ cls.STRUCTURE_ANCHORING,
280
+ cls.STRUCTURE_DESTROYED,
253
281
  cls.STRUCTURE_FUEL_ALERT,
254
282
  cls.STRUCTURE_JUMP_FUEL_ALERT,
283
+ cls.STRUCTURE_LOST_ARMOR,
284
+ cls.STRUCTURE_LOST_SHIELD,
285
+ cls.STRUCTURE_LOW_REAGENTS_ALERT,
286
+ cls.STRUCTURE_NO_REAGENTS_ALERT,
287
+ cls.STRUCTURE_ONLINE,
255
288
  cls.STRUCTURE_REFUELED_EXTRA,
289
+ cls.STRUCTURE_REINFORCEMENT_CHANGED,
256
290
  cls.STRUCTURE_SERVICES_OFFLINE,
257
- cls.STRUCTURE_WENT_LOW_POWER,
258
- cls.STRUCTURE_WENT_HIGH_POWER,
259
291
  cls.STRUCTURE_UNANCHORING,
260
292
  cls.STRUCTURE_UNDER_ATTACK,
261
- cls.STRUCTURE_LOST_SHIELD,
262
- cls.STRUCTURE_LOST_ARMOR,
263
- cls.STRUCTURE_DESTROYED,
264
- cls.OWNERSHIP_TRANSFERRED,
265
- cls.STRUCTURE_ANCHORING,
266
- cls.MOONMINING_EXTRACTION_STARTED,
267
- cls.MOONMINING_EXTRACTION_FINISHED,
268
- cls.MOONMINING_AUTOMATIC_FRACTURE,
269
- cls.MOONMINING_EXTRACTION_CANCELLED,
270
- cls.MOONMINING_LASER_FIRED,
271
- cls.STRUCTURE_REINFORCEMENT_CHANGED,
272
- cls.ORBITAL_ATTACKED,
273
- cls.ORBITAL_REINFORCED,
293
+ cls.STRUCTURE_WENT_HIGH_POWER,
294
+ cls.STRUCTURE_WENT_LOW_POWER,
274
295
  cls.TOWER_ALERT_MSG,
275
- cls.TOWER_RESOURCE_ALERT_MSG,
276
296
  cls.TOWER_REFUELED_EXTRA,
277
297
  cls.TOWER_REINFORCED_EXTRA,
298
+ cls.TOWER_RESOURCE_ALERT_MSG,
278
299
  }
279
300
 
280
301
  @classmethod
@@ -237,7 +237,7 @@ class StructureQuerySet(models.QuerySet):
237
237
 
238
238
  def select_related_defaults(self) -> models.QuerySet:
239
239
  """returns a QuerySet with the default select_related"""
240
- return self.select_related(
240
+ return self.select_related( # pylint: disable=E1102
241
241
  "owner",
242
242
  "owner__corporation",
243
243
  "owner__corporation__alliance",
@@ -383,7 +383,9 @@ class StructureManagerBase(models.Manager):
383
383
  def update_or_create_from_dict(self, structure: dict, owner) -> Tuple[Any, bool]:
384
384
  """update or create structure from given dict"""
385
385
 
386
- eve_type, _ = EveType.objects.get_or_create_esi(id=structure["type_id"])
386
+ eve_type: EveType = EveType.objects.get_or_create_esi(id=structure["type_id"])[
387
+ 0
388
+ ]
387
389
  eve_solar_system, _ = EveSolarSystem.objects.get_or_create_esi(
388
390
  id=structure["system_id"]
389
391
  )
@@ -423,10 +425,11 @@ class StructureManagerBase(models.Manager):
423
425
  if old_obj:
424
426
  obj.handle_fuel_notifications(old_obj)
425
427
 
426
- # Make sure we have dogmas loaded for this type for fittings
427
- EveType.objects.get_or_create_esi(
428
- id=structure["type_id"], enabled_sections=[EveType.Section.DOGMAS]
429
- )
428
+ # Make sure we have dogmas loaded with all upwell structures for fittings
429
+ if eve_type.eve_group.eve_category_id == EveCategoryId.STRUCTURE:
430
+ EveType.objects.get_or_create_esi(
431
+ id=structure["type_id"], enabled_sections=[EveType.Section.DOGMAS]
432
+ )
430
433
 
431
434
  self._save_related_structure_services(structure, obj)
432
435