firefighter-incident 0.0.10__tar.gz → 0.0.12__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 (455) hide show
  1. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/PKG-INFO +1 -1
  2. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/_version.py +2 -2
  3. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/tasks/trigger_oncall.py +1 -1
  4. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/client.py +2 -2
  5. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/signals/incident_created.py +1 -1
  6. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/messages/slack_messages.py +3 -3
  7. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/home.py +1 -1
  8. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/open.py +112 -62
  9. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/select_impact.py +38 -5
  10. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/views/modals/test_open.py +25 -8
  11. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/.gitignore +0 -0
  12. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/LICENSE +0 -0
  13. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/README.md +0 -0
  14. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/__init__.py +0 -0
  15. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/__init__.py +0 -0
  16. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/admin.py +0 -0
  17. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/apps.py +0 -0
  18. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/authentication.py +0 -0
  19. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/migrations/0001_initial.py +0 -0
  20. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/migrations/0002_alter_apitokenproxy_options.py +0 -0
  21. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/migrations/0003_alter_apitokenproxy_options.py +0 -0
  22. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/migrations/__init__.py +0 -0
  23. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/models.py +0 -0
  24. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/permissions.py +0 -0
  25. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/renderer.py +0 -0
  26. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/serializers.py +0 -0
  27. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/urls.py +0 -0
  28. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/__init__.py +0 -0
  29. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/_base.py +0 -0
  30. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/components.py +0 -0
  31. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/environments.py +0 -0
  32. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/groups.py +0 -0
  33. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/incident_cost_types.py +0 -0
  34. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/incident_costs.py +0 -0
  35. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/incidents.py +0 -0
  36. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/api/views/severities.py +0 -0
  37. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/__init__.py +0 -0
  38. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/avatar/__init__.py +0 -0
  39. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/avatar/avatar.html +0 -0
  40. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/avatar/avatar.py +0 -0
  41. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/card/__init__.py +0 -0
  42. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/card/card.html +0 -0
  43. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/card/card.py +0 -0
  44. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/export_button/__init__.py +0 -0
  45. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/export_button/export_button.html +0 -0
  46. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/export_button/export_button.py +0 -0
  47. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form/__init__.py +0 -0
  48. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form/form.html +0 -0
  49. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form/form.py +0 -0
  50. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form_field/__init__.py +0 -0
  51. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form_field/form_field.html +0 -0
  52. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/form_field/form_field.py +0 -0
  53. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/messages/__init__.py +0 -0
  54. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/messages/messages.html +0 -0
  55. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/messages/messages.py +0 -0
  56. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/modal/__init__.py +0 -0
  57. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/modal/modal.html +0 -0
  58. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/components/modal/modal.py +0 -0
  59. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/__init__.py +0 -0
  60. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/admin.py +0 -0
  61. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/apps.py +0 -0
  62. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/client.py +0 -0
  63. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/__init__.py +0 -0
  64. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/commands/__init__.py +0 -0
  65. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/commands/sort_postmortems.py +0 -0
  66. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/commands/sort_runbooks.py +0 -0
  67. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/commands/sync_postmortems.py +0 -0
  68. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/management/commands/sync_runbooks.py +0 -0
  69. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/migrations/0001_initial_oss.py +0 -0
  70. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/migrations/__init__.py +0 -0
  71. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/models.py +0 -0
  72. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/serializers.py +0 -0
  73. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/service.py +0 -0
  74. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/signals/__init__.py +0 -0
  75. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/signals/incident_updated.py +0 -0
  76. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tables.py +0 -0
  77. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/__init__.py +0 -0
  78. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/archive_postmortems.py +0 -0
  79. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/sort_runbooks.py +0 -0
  80. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/sync_pages_content.py +0 -0
  81. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/sync_postmortems.py +0 -0
  82. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/tasks/sync_runbooks.py +0 -0
  83. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/templates/oncall_team.xml +0 -0
  84. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/templates/pages/runbook_list.html +0 -0
  85. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/urls.py +0 -0
  86. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/utils.py +0 -0
  87. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/__init__.py +0 -0
  88. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/api.py +0 -0
  89. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/postmortem/__init__.py +0 -0
  90. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/postmortem/postmortem_detail.py +0 -0
  91. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/runbook/__init__.py +0 -0
  92. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/confluence/views/runbook/runbook_list.py +0 -0
  93. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/__init__.py +0 -0
  94. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/admin.py +0 -0
  95. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/apps.py +0 -0
  96. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/asgi.py +0 -0
  97. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/celery_client.py +0 -0
  98. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/fields_forms_widgets.py +0 -0
  99. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/filters.py +0 -0
  100. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/formats/__init__.py +0 -0
  101. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/formats/en/__init__.py +0 -0
  102. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/formats/en/formats.py +0 -0
  103. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/http_client.py +0 -0
  104. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/management/__init__.py +0 -0
  105. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/management/commands/__init__.py +0 -0
  106. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/management/commands/task.py +0 -0
  107. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/middleware.py +0 -0
  108. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/__init__.py +0 -0
  109. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/__init__.py +0 -0
  110. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/api.py +0 -0
  111. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/caches.py +0 -0
  112. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/celery.py +0 -0
  113. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/common.py +0 -0
  114. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/confluence.py +0 -0
  115. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/jira_app.py +0 -0
  116. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/logging.py +0 -0
  117. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/pagerduty.py +0 -0
  118. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/raid.py +0 -0
  119. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/components/slack.py +0 -0
  120. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/environments/__init__.py +0 -0
  121. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/environments/dev.py +0 -0
  122. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/environments/prod.py +0 -0
  123. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/settings_builder.py +0 -0
  124. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/settings/settings_utils.py +0 -0
  125. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/sso.py +0 -0
  126. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/tables_utils.py +0 -0
  127. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/templates/admin/base.html +0 -0
  128. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/templates/admin/login.html +0 -0
  129. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/templates/admin/send_message_conversation.html +0 -0
  130. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/templates/robots.txt +0 -0
  131. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/urls.py +0 -0
  132. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/utils.py +0 -0
  133. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/views.py +0 -0
  134. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/firefighter/wsgi.py +0 -0
  135. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/__init__.py +0 -0
  136. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/admin.py +0 -0
  137. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/apps.py +0 -0
  138. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/enums.py +0 -0
  139. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/factories.py +0 -0
  140. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/__init__.py +0 -0
  141. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/close_incident.py +0 -0
  142. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/create_incident.py +0 -0
  143. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/edit.py +0 -0
  144. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/select_impact.py +0 -0
  145. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/update_key_events.py +0 -0
  146. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/update_roles.py +0 -0
  147. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/update_status.py +0 -0
  148. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/forms/utils.py +0 -0
  149. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/menus.py +0 -0
  150. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0001_initial_oss.py +0 -0
  151. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0002_alter_severity_name_alter_user_password_featureteam.py +0 -0
  152. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0003_delete_featureteam.py +0 -0
  153. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0004_incidentupdate_environment.py +0 -0
  154. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0005_enable_from_p1_to_p5_priority.py +0 -0
  155. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0006_update_group_names.py +0 -0
  156. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0007_update_component_name.py +0 -0
  157. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0008_impact_level.py +0 -0
  158. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0009_update_sla.py +0 -0
  159. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0010_update_components.py +0 -0
  160. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0011_update_incidents.py +0 -0
  161. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0012_alter_impactlevel.py +0 -0
  162. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0013_add_missing_component.py +0 -0
  163. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0014_update_components_slack_groups.py +0 -0
  164. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0015_update_impact_level.py +0 -0
  165. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0016_update_business_incidents_and_level.py +0 -0
  166. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0017_reorder_impact_types.py +0 -0
  167. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/0018_update_impactlevel_names.py +0 -0
  168. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/migrations/__init__.py +0 -0
  169. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/__init__.py +0 -0
  170. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/component.py +0 -0
  171. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/environment.py +0 -0
  172. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/group.py +0 -0
  173. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/impact.py +0 -0
  174. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident.py +0 -0
  175. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident_cost.py +0 -0
  176. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident_cost_type.py +0 -0
  177. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident_membership.py +0 -0
  178. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident_role_type.py +0 -0
  179. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/incident_update.py +0 -0
  180. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/metric_type.py +0 -0
  181. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/milestone_type.py +0 -0
  182. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/priority.py +0 -0
  183. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/severity.py +0 -0
  184. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/models/user.py +0 -0
  185. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/signals.py +0 -0
  186. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/css/incident.css +0 -0
  187. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/css/main.css +0 -0
  188. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/css/main.min.css +0 -0
  189. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/css/tailwind.css +0 -0
  190. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/android-chrome-192x192.png +0 -0
  191. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/android-chrome-512x512.png +0 -0
  192. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/apple-touch-icon.png +0 -0
  193. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/favicon-16x16.png +0 -0
  194. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/favicon-32x32.png +0 -0
  195. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/favicon.ico +0 -0
  196. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/favicon/site.webmanifest +0 -0
  197. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/gameday.png +0 -0
  198. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/logo-firefighter.png +0 -0
  199. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/p1.png +0 -0
  200. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/p2.png +0 -0
  201. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/p3.png +0 -0
  202. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/p4.png +0 -0
  203. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/img/p5.png +0 -0
  204. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/js/main.js +0 -0
  205. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/static/js/main.min.js +0 -0
  206. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/tables.py +0 -0
  207. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/tasks/__init__.py +0 -0
  208. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/tasks/updateoncall.py +0 -0
  209. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/errors/base.html +0 -0
  210. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/filter.html +0 -0
  211. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/table/priority_column.html +0 -0
  212. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/table/status_column.html +0 -0
  213. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/table.html +0 -0
  214. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/widgets/form_container.html +0 -0
  215. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/widgets/grouped_checkbox_nested.html +0 -0
  216. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/incidents/widgets/input_option.html +0 -0
  217. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/index.html +0 -0
  218. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/created_at_help.html +0 -0
  219. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/environment_pill.html +0 -0
  220. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/footer.html +0 -0
  221. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/header.html +0 -0
  222. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/incident_card.html +0 -0
  223. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/incident_metrics.html +0 -0
  224. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/incident_timeline.html +0 -0
  225. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view.html +0 -0
  226. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view_modal.html +0 -0
  227. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/partial_table_list_paginated.html +0 -0
  228. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/priority_icon.html +0 -0
  229. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/priority_pill.html +0 -0
  230. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/status_pill.html +0 -0
  231. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/table.html +0 -0
  232. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/user_card.html +0 -0
  233. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/partials/user_tooltip.html +0 -0
  234. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/layouts/view_filters.html +0 -0
  235. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/component_detail.html +0 -0
  236. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/component_list.html +0 -0
  237. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/dashboard.html +0 -0
  238. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/docs_metrics.html +0 -0
  239. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_create.html +0 -0
  240. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_detail.html +0 -0
  241. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_list.html +0 -0
  242. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_role_types_detail.html +0 -0
  243. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_role_types_list.html +0 -0
  244. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_statistics.html +0 -0
  245. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_statistics_partial.html +0 -0
  246. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/incident_update_key_events_form.html +0 -0
  247. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/templates/pages/user_detail.html +0 -0
  248. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/urls.py +0 -0
  249. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/__init__.py +0 -0
  250. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/components/__init__.py +0 -0
  251. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/components/details.py +0 -0
  252. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/components/list.py +0 -0
  253. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/date_filter.py +0 -0
  254. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/date_utils.py +0 -0
  255. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/docs/__init__.py +0 -0
  256. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/docs/metrics.py +0 -0
  257. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/docs/role_types.py +0 -0
  258. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/errors.py +0 -0
  259. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/reports.py +0 -0
  260. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/users/__init__.py +0 -0
  261. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/users/details.py +0 -0
  262. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/incidents/views/views.py +0 -0
  263. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/__init__.py +0 -0
  264. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/admin.py +0 -0
  265. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/apps.py +0 -0
  266. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/client.py +0 -0
  267. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/migrations/0001_initial_oss.py +0 -0
  268. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/migrations/__init__.py +0 -0
  269. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/models.py +0 -0
  270. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/tasks/__init__.py +0 -0
  271. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/tasks/sync_users_jira.py +0 -0
  272. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/types.py +0 -0
  273. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/jira_app/utils.py +0 -0
  274. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/logging/__init__.py +0 -0
  275. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/logging/custom_json_formatter.py +0 -0
  276. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/logging/pretty_formatter.py +0 -0
  277. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/__init__.py +0 -0
  278. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/admin.py +0 -0
  279. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/apps.py +0 -0
  280. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/client.py +0 -0
  281. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/forms/__init__.py +0 -0
  282. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/forms/create_pagerduty_incident.py +0 -0
  283. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/migrations/0001_initial_oss.py +0 -0
  284. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/migrations/__init__.py +0 -0
  285. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/models.py +0 -0
  286. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/service.py +0 -0
  287. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/signals/__init__.py +0 -0
  288. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/signals/get_invites_from_pagerduty.py +0 -0
  289. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/signals/incident_channel_done_oncall.py +0 -0
  290. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/tasks/__init__.py +0 -0
  291. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/tasks/fetch_oncall.py +0 -0
  292. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/tasks/fetch_services.py +0 -0
  293. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/tasks/fetch_users.py +0 -0
  294. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/templates/pages/oncall_list.html +0 -0
  295. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/templates/pages/oncall_trigger.html +0 -0
  296. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view.html +0 -0
  297. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view_modal.html +0 -0
  298. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/urls.py +0 -0
  299. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/views/__init__.py +0 -0
  300. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/views/oncall_list.py +0 -0
  301. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/pagerduty/views/oncall_trigger.py +0 -0
  302. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/__init__.py +0 -0
  303. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/admin.py +0 -0
  304. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/apps.py +0 -0
  305. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/forms.py +0 -0
  306. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/messages.py +0 -0
  307. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/migrations/0001_initial_oss.py +0 -0
  308. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/migrations/0002_featureteam_remove_qualifierrotation_jira_user_and_more.py +0 -0
  309. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/migrations/__init__.py +0 -0
  310. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/models.py +0 -0
  311. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/resources.py +0 -0
  312. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/serializers.py +0 -0
  313. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/service.py +0 -0
  314. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/signals/__init__.py +0 -0
  315. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/signals/incident_updated.py +0 -0
  316. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/tasks/__init__.py +0 -0
  317. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/types.py +0 -0
  318. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/urls.py +0 -0
  319. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/utils.py +0 -0
  320. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/views/__init__.py +0 -0
  321. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/raid/views/open_normal.py +0 -0
  322. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/__init__.py +0 -0
  323. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/admin.py +0 -0
  324. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/apps.py +0 -0
  325. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/factories.py +0 -0
  326. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/forms/__init__.py +0 -0
  327. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/forms/sos_form.py +0 -0
  328. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/management/__init__.py +0 -0
  329. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/management/commands/__init__.py +0 -0
  330. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/management/commands/generate_manifest.py +0 -0
  331. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/messages/__init__.py +0 -0
  332. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/messages/base.py +0 -0
  333. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/migrations/0001_initial_oss.py +0 -0
  334. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/migrations/0002_usergroup_tag.py +0 -0
  335. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/migrations/0003_alter_usergroup_tag.py +0 -0
  336. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/migrations/0004_alter_usergroup_components.py +0 -0
  337. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/migrations/__init__.py +0 -0
  338. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/__init__.py +0 -0
  339. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/conversation.py +0 -0
  340. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/incident_channel.py +0 -0
  341. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/message.py +0 -0
  342. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/sos.py +0 -0
  343. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/user.py +0 -0
  344. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/models/user_group.py +0 -0
  345. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/rules.py +0 -0
  346. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/__init__.py +0 -0
  347. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/create_incident_conversation.py +0 -0
  348. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/get_users.py +0 -0
  349. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/handle_incident_channel_done.py +0 -0
  350. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/incident_closed.py +0 -0
  351. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/incident_updated.py +0 -0
  352. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/postmortem_created.py +0 -0
  353. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/signals/roles_reminders.py +0 -0
  354. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/slack_app.py +0 -0
  355. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/slack_incident_context.py +0 -0
  356. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/slack_templating.py +0 -0
  357. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/__init__.py +0 -0
  358. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/fetch_conversations_members.py +0 -0
  359. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/reminder_postmortem.py +0 -0
  360. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/send_message.py +0 -0
  361. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/send_reminders.py +0 -0
  362. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/sync_users.py +0 -0
  363. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/update_usergroups_members.py +0 -0
  364. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/tasks/update_users.py +0 -0
  365. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/urls.py +0 -0
  366. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/utils.py +0 -0
  367. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/__init__.py +0 -0
  368. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/__init__.py +0 -0
  369. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/actions_and_shortcuts.py +0 -0
  370. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_archive.py +0 -0
  371. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_id_changed.py +0 -0
  372. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_rename.py +0 -0
  373. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_shared.py +0 -0
  374. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_unarchive.py +0 -0
  375. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/channel_unshared.py +0 -0
  376. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/commands.py +0 -0
  377. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/member_joined_channel.py +0 -0
  378. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/member_left_channel.py +0 -0
  379. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/message.py +0 -0
  380. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/message_deleted.py +0 -0
  381. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/events/reaction_added.py +0 -0
  382. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/__init__.py +0 -0
  383. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/__init__.py +0 -0
  384. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/base.py +0 -0
  385. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/base_mixins.py +0 -0
  386. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/form_utils.py +0 -0
  387. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/mixins.py +0 -0
  388. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/base_modal/modal_utils.py +0 -0
  389. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/close.py +0 -0
  390. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/downgrade_workflow.py +0 -0
  391. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/edit.py +0 -0
  392. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/key_event_message.py +0 -0
  393. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/__init__.py +0 -0
  394. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/check_current_incidents.py +0 -0
  395. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/details/__init__.py +0 -0
  396. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/details/critical.py +0 -0
  397. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/set_details.py +0 -0
  398. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/opening/types.py +0 -0
  399. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/postmortem.py +0 -0
  400. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/select.py +0 -0
  401. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/send_sos.py +0 -0
  402. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/status.py +0 -0
  403. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/trigger_oncall.py +0 -0
  404. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/update.py +0 -0
  405. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/update_roles.py +0 -0
  406. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/modals/update_status.py +0 -0
  407. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter/slack/views/views.py +0 -0
  408. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/components.json +0 -0
  409. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/environments.json +0 -0
  410. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/groups.json +0 -0
  411. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/impact_level.json +0 -0
  412. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/impact_type.json +0 -0
  413. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/incident_role_type.json +0 -0
  414. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/metric_type.json +0 -0
  415. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/milestone_type.json +0 -0
  416. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/priorities.json +0 -0
  417. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/incidents/severities.json +0 -0
  418. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_fixtures/raid/area.json +0 -0
  419. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/__init__.py +0 -0
  420. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/conftest.py +0 -0
  421. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_api/test_api_landbot.py +0 -0
  422. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_api/test_api_urls.py +0 -0
  423. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_confluence/test_confluence_utils.py +0 -0
  424. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_firefighter/test_firefighter_utils.py +0 -0
  425. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_firefighter/test_logging.py +0 -0
  426. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_firefighter/test_urls.py +0 -0
  427. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_forms/test_form_select_impact.py +0 -0
  428. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_forms/test_form_utils.py +0 -0
  429. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_forms/test_update_key_events.py +0 -0
  430. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_incident_urls.py +0 -0
  431. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_models/test_incident_model.py +0 -0
  432. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_models/test_migrations/test_incident_migrations.py +0 -0
  433. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_utils/test_date_utils.py +0 -0
  434. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_views/test_incident_detail_view.py +0 -0
  435. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_incidents/test_views/test_index_view.py +0 -0
  436. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_raid/test_raid_client_users.py +0 -0
  437. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_raid/test_raid_transitions.py +0 -0
  438. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_raid/test_raid_utils.py +0 -0
  439. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/conftest.py +0 -0
  440. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/test_models/test_conversations.py +0 -0
  441. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/test_models/test_incident_channel.py +0 -0
  442. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/test_models/test_slack_user.py +0 -0
  443. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/test_slack_utils.py +0 -0
  444. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/views/modals/test_close.py +0 -0
  445. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/views/modals/test_send_sos.py +0 -0
  446. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/views/modals/test_status.py +0 -0
  447. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/firefighter_tests/test_slack/views/modals/test_update_status.py +0 -0
  448. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/gunicorn.conf.py +0 -0
  449. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/main.py +0 -0
  450. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/manage.py +0 -0
  451. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/package-lock.json +0 -0
  452. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/package.json +0 -0
  453. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/pyproject.toml +0 -0
  454. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/scripts/gen_credits.py +0 -0
  455. {firefighter_incident-0.0.10 → firefighter_incident-0.0.12}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: firefighter-incident
3
- Version: 0.0.10
3
+ Version: 0.0.12
4
4
  Summary: Incident Management tool made for Slack using Django
5
5
  Project-URL: Repository, https://github.com/ManoManoTech/firefighter-incident
6
6
  Project-URL: Documentation, https://manomanotech.github.io/firefighter-incident/latest/
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.0.10'
21
- __version_tuple__ = version_tuple = (0, 0, 10)
20
+ __version__ = version = '0.0.12'
21
+ __version_tuple__ = version_tuple = (0, 0, 12)
@@ -38,7 +38,7 @@ def trigger_oncall(
38
38
  details = f"""Triggered from {APP_DISPLAY_NAME} incident #{incident.id} {f"by {triggered_by.full_name}" if triggered_by else ""}
39
39
  Priority: {incident.priority}
40
40
  Environment: {incident.environment}
41
- Component: {incident.component}
41
+ Issue category: {incident.component.group.name} - {incident.component.name}
42
42
  FireFighter page: {incident.status_page_url + "?utm_medium=FireFighter+PagerDuty&utm_source=PagerDuty+Incident&utm_campaign=OnCall+Message+In+Channel"}
43
43
  Slack channel #{incident.slack_channel_name}: {incident.slack_channel_url}
44
44
 
@@ -65,8 +65,8 @@ class RaidJiraClient(JiraClient):
65
65
  if priority is None:
66
66
  priority_value = "-"
67
67
  else:
68
- if not 1 <= priority <= 4:
69
- raise ValueError("Priority must be between 1 and 4")
68
+ if not 1 <= priority <= 5:
69
+ raise ValueError("Priority must be between 1 and 5")
70
70
  priority_value = str(priority)
71
71
  if area:
72
72
  extra_args["customfield_10920"] = str(area)
@@ -43,7 +43,7 @@ def create_ticket(
43
43
  description=f"""{incident.description}\n
44
44
  \n
45
45
  🧯 This incident has been created for a critical incident. Links below to Slack and {APP_DISPLAY_NAME}.\n
46
- 📦 Component: {incident.component.name} ({incident.component.group.name})\n
46
+ 📦 Issue category: {incident.component.name} ({incident.component.group.name})\n
47
47
  {incident.priority.emoji} Priority: {incident.priority.name}\n""",
48
48
  assignee=None,
49
49
  reporter=account_id,
@@ -210,7 +210,7 @@ class SlackMessageIncidentDeclaredAnnouncement(SlackMessageSurface):
210
210
  def get_blocks(self) -> list[Block]:
211
211
  fields = [
212
212
  f"{self.incident.priority.emoji} *Priority:* {self.incident.priority.name}",
213
- f":package: *Component:* {self.incident.component.name}",
213
+ f":package: *Issue category:* {self.incident.component.name}",
214
214
  f":speaking_head_in_silhouette: *Opened by:* {user_slack_handle_or_name(self.incident.created_by)}",
215
215
  f":calendar: *Created at:* {date_time(self.incident.created_at)}",
216
216
  f"{SLACK_APP_EMOJI} <{self.incident.status_page_url + '?utm_medium=FireFighter+Slack&utm_source=Slack+Message&utm_campaign=Announcement+Message+In+Channel'}|*{APP_DISPLAY_NAME} Status Page*>",
@@ -270,7 +270,7 @@ class SlackMessageIncidentDeclaredAnnouncementGeneral(SlackMessageSurface):
270
270
  def get_blocks(self) -> list[Block]:
271
271
  fields = [
272
272
  f"{self.incident.priority.emoji} *Priority:* {self.incident.priority.name}",
273
- f":package: *Component:* {self.incident.component.name}",
273
+ f":package: *Issue category:* {self.incident.component.name}",
274
274
  f"{SLACK_APP_EMOJI} <{self.incident.status_page_url + '?utm_medium=FireFighter+Slack&utm_source=Slack+Message&utm_campaign=Announcement+Message+General'}|*{APP_DISPLAY_NAME} Status Page*>",
275
275
  f":speaking_head_in_silhouette: *Opened by:* {user_slack_handle_or_name(self.incident.created_by)}",
276
276
  f":calendar: *Created at:* {date_time(self.incident.created_at)}",
@@ -486,7 +486,7 @@ class SlackMessageIncidentStatusUpdated(SlackMessageSurface):
486
486
  if self.incident_update.component:
487
487
  fields.append(
488
488
  MarkdownTextObject(
489
- text=f":package: *Component:* {self.incident.component.group.name} - {self.incident.component.name}"
489
+ text=f":package: *Issue category:* {self.incident.component.group.name} - {self.incident.component.name}"
490
490
  )
491
491
  )
492
492
  if self.incident_update.environment:
@@ -148,7 +148,7 @@ def _home_incident_element(
148
148
  text=f":rotating_light: *Priority:* {incident.priority.emoji} {incident.priority.name}"
149
149
  ),
150
150
  MarkdownTextObject(
151
- text=f":package: *Component:* {incident.component.group.name} - {incident.component.name}"
151
+ text=f":package: *Issue category:* {incident.component.group.name} - {incident.component.name}"
152
152
  ),
153
153
  MarkdownTextObject(
154
154
  text=f":speaking_head_in_silhouette: *Last update:* {date_time(incident.updated_at)}"
@@ -12,7 +12,6 @@ from django.utils.translation import ngettext
12
12
  from slack_sdk.models.blocks.basic_components import MarkdownTextObject, Option
13
13
  from slack_sdk.models.blocks.block_elements import ButtonElement, StaticSelectElement
14
14
  from slack_sdk.models.blocks.blocks import (
15
- ActionsBlock,
16
15
  Block,
17
16
  ContextBlock,
18
17
  DividerBlock,
@@ -74,7 +73,9 @@ class OpenModal(SlackModal):
74
73
  # 1. Check if impact form is good
75
74
  is_impact_form_valid: bool = self._check_impact_form(open_incident_context)
76
75
 
77
- # 2. Check if we have a normal incident type
76
+ # 2. Auto-determine response type based on priority
77
+ self._auto_set_response_type(open_incident_context)
78
+
78
79
  incident_type_value: str | None = open_incident_context.get(
79
80
  "incident_type", None
80
81
  )
@@ -181,11 +182,18 @@ class OpenModal(SlackModal):
181
182
  SelectImpactModal,
182
183
  )
183
184
 
185
+ # Check if we have actual impacts (not all "NO") by checking if response_type is set
186
+ has_real_impacts = open_incident_context.get("response_type") is not None
187
+
188
+ # Show ✅ only if form is valid AND has real impacts, otherwise 📝
189
+ emoji = "✅" if impact_form_done and has_real_impacts else "📝"
190
+ button_text = "Edit impacts" if impact_form_done and has_real_impacts else "Set impacts"
191
+
184
192
  return [
185
193
  SectionBlock(
186
- text=f"{'✅' if impact_form_done else '📝'} First, define the incident impacts and priority.",
194
+ text=f"{emoji} First, define the incident impacts and priority.",
187
195
  accessory=ButtonElement(
188
- text="Edit impacts" if impact_form_done else "Set impacts",
196
+ text=button_text,
189
197
  action_id=SelectImpactModal.push_action,
190
198
  value=json.dumps(open_incident_context, cls=SlackFormJSONEncoder),
191
199
  ),
@@ -292,11 +300,11 @@ class OpenModal(SlackModal):
292
300
 
293
301
  if slack_msg is None:
294
302
  slack_msg = "> :slack: A dedicated Slack channel will be created, and responders will be invited to help.\n"
295
- text = f"> :firefighter_incident: This will trigger a critical incident response.\n{slack_msg}> :jira_new: An associated Jira ticket will also be created."
303
+ text = "> :jira_new: An associated Jira ticket will also be created."
296
304
  if not is_during_office_hours(timezone.now()):
297
305
  text += "\n> :pagerduty: If you need it, you'll be able to escalate the incident to our 24/7 on-call response teams."
298
306
  else:
299
- text = "> :raid_logo: This will trigger a normal incident response.\n> :jira_new: A Jira ticket will be created."
307
+ text = "> :jira_new: A Jira ticket will be created."
300
308
  done_review_blocks += [SectionBlock(text=text)]
301
309
 
302
310
  return done_review_blocks
@@ -371,40 +379,53 @@ class OpenModal(SlackModal):
371
379
 
372
380
  return is_valid, details_form_class, details_form
373
381
 
382
+ @staticmethod
383
+ def _auto_set_response_type(open_incident_context: OpeningData) -> None:
384
+ """Auto-determine response type based on priority from impact form."""
385
+ impact_form_data = open_incident_context.get("impact_form_data")
386
+ if not impact_form_data:
387
+ # Clear response_type and priority if no impact data
388
+ open_incident_context.pop("response_type", None)
389
+ open_incident_context.pop("priority", None)
390
+ return
391
+
392
+ impact_form = SelectImpactForm(impact_form_data)
393
+ if not impact_form.is_valid():
394
+ # Clear response_type and priority if form is invalid
395
+ open_incident_context.pop("response_type", None)
396
+ open_incident_context.pop("priority", None)
397
+ return
398
+
399
+ priority_value = impact_form.suggest_priority_from_impact()
400
+
401
+ # If no impacts are selected (all set to "NO"), don't set priority/response_type
402
+ # Priority value 6 corresponds to LevelChoices.NONE.priority
403
+ if priority_value == 6:
404
+ open_incident_context.pop("response_type", None)
405
+ open_incident_context.pop("priority", None)
406
+ return
407
+
408
+ priority = Priority.objects.get(value=priority_value)
409
+
410
+ # Set priority in context
411
+ open_incident_context["priority"] = priority
412
+
413
+ # Set response type based on priority recommendation
414
+ if priority.recommended_response_type:
415
+ open_incident_context["response_type"] = cast("ResponseType | None", priority.recommended_response_type)
416
+ else:
417
+ # Default fallback: P1/P2/P3 = critical, P4/P5 = normal
418
+ response_type = cast("ResponseType", "critical" if priority_value < 4 else "normal")
419
+ open_incident_context["response_type"] = response_type
420
+
374
421
  @staticmethod
375
422
  def _build_response_type_blocks(open_incident_context: OpeningData) -> list[Block]:
376
423
  selected_response_type = open_incident_context.get("response_type")
377
424
  if selected_response_type not in {"critical", "normal"}:
378
425
  return []
379
426
 
380
- response_types: list[ResponseType] = cast(
381
- "list[ResponseType]", INCIDENT_TYPES.keys()
382
- )
383
- elements: list[ButtonElement] = []
384
-
385
- for response_type in response_types:
386
- if response_type != selected_response_type:
387
- continue
388
-
389
- is_selected = (
390
- open_incident_context.get("response_type") == response_type
391
- or len(INCIDENT_TYPES) == 1
392
- )
393
- style: str | None = "primary" if is_selected else None
394
- text = (
395
- ":slack: Slack :jira_new: Jira ticket"
396
- if response_type == "critical"
397
- else ":jira_new: Jira ticket"
398
- )
399
- button = ButtonElement(
400
- text=text,
401
- action_id=f"incident_open_set_res_type_{response_type}",
402
- value=json.dumps(open_incident_context, cls=SlackFormJSONEncoder),
403
- style=style,
404
- )
405
- elements.append(button)
406
-
407
- blocks: list[Block] = [ActionsBlock(elements=elements)]
427
+ blocks: list[Block] = []
428
+ # No buttons needed - response type is auto-determined
408
429
  if impact_form_data := open_incident_context.get("impact_form_data"):
409
430
  impact_form = SelectImpactForm(impact_form_data)
410
431
  if impact_form.is_valid():
@@ -414,6 +435,7 @@ class OpenModal(SlackModal):
414
435
  process = ":slack: Slack :jira_new: Jira ticket" if open_incident_context.get("response_type") == "critical" else ":jira_new: Jira ticket"
415
436
 
416
437
  impact_descriptions = OpenModal._get_impact_descriptions(open_incident_context)
438
+
417
439
  blocks.append(
418
440
  ContextBlock(
419
441
  elements=[
@@ -422,12 +444,12 @@ class OpenModal(SlackModal):
422
444
  f"> ⏱️ SLA: {priority.sla}\n"
423
445
  f"> :gear: Process: {process}\n"
424
446
  f"> :pushpin: Selected impacts:\n"
425
- f"{impact_descriptions}\n"
447
+ f"{impact_descriptions}"
426
448
  + (
427
449
  (
428
- "\n> Critical incidents are for *emergency* only"
450
+ "> :warning: Critical incidents are for *emergency* only"
429
451
  + (
430
- f" <{SLACK_SEVERITY_HELP_GUIDE_URL}|learn more>"
452
+ f" <{SLACK_SEVERITY_HELP_GUIDE_URL}|more info>"
431
453
  if SLACK_SEVERITY_HELP_GUIDE_URL
432
454
  else "."
433
455
  )
@@ -459,18 +481,56 @@ class OpenModal(SlackModal):
459
481
  @staticmethod
460
482
  def _get_impact_descriptions(open_incident_context: OpeningData) -> str:
461
483
  impact_form_data = open_incident_context.get("impact_form_data", {})
484
+ if not impact_form_data:
485
+ return ""
486
+
462
487
  impact_descriptions = ""
463
- if impact_form_data:
464
- for value in impact_form_data.values():
465
- if value.name != "NO" and value.description:
466
- if hasattr(value, "impact_type_id") and value.impact_type_id:
467
- impact_type = ImpactType.objects.get(pk=value.impact_type_id)
468
- if impact_type:
469
- impact_descriptions += f"> \u00A0\u00A0 :exclamation: {impact_type} - {value}\n"
470
- for line in str(value.description).splitlines():
471
- impact_descriptions += f"> \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 {line}\n"
488
+ for field_name, original_value in impact_form_data.items():
489
+ value = original_value
490
+ # Handle case where value might be an ID instead of an object
491
+ if isinstance(value, int | str) and not hasattr(value, "name"):
492
+ # Try to get the object from the database
493
+ form = SelectImpactForm()
494
+ if field_name in form.fields:
495
+ field = form.fields[field_name]
496
+ if hasattr(field, "queryset") and field.queryset is not None:
497
+ try:
498
+ value = field.queryset.get(pk=value)
499
+ except field.queryset.model.DoesNotExist:
500
+ logger.warning(f"Could not find impact object with pk={value} for field {field_name}")
501
+ continue
502
+
503
+ description = OpenModal._format_single_impact_description(value)
504
+ if description:
505
+ impact_descriptions += description
472
506
  return impact_descriptions
473
507
 
508
+ @staticmethod
509
+ def _format_single_impact_description(value: Any) -> str:
510
+ """Format a single impact value into description text."""
511
+ # Handle object with name and description attributes (impact levels)
512
+ if hasattr(value, "name") and hasattr(value, "description"):
513
+ if value.name == "NO" or not value.description:
514
+ return ""
515
+
516
+ description = ""
517
+ # Add impact type header if available
518
+ if hasattr(value, "impact_type_id") and value.impact_type_id:
519
+ try:
520
+ impact_type = ImpactType.objects.get(pk=value.impact_type_id)
521
+ # Use value.name instead of value to avoid showing IDs
522
+ description += f"> \u00A0\u00A0 :exclamation: {impact_type} - {value.name}\n"
523
+ except ImpactType.DoesNotExist:
524
+ description += f"> \u00A0\u00A0 :exclamation: {value.name}\n"
525
+
526
+ # Add description lines
527
+ for line in str(value.description).splitlines():
528
+ description += f"> \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 • {line}\n"
529
+ return description
530
+
531
+ # Skip string values - incident_type is handled separately, not in impact descriptions
532
+ return ""
533
+
474
534
  @staticmethod
475
535
  def get_details_modal_form_class(
476
536
  open_incident_context: OpeningData,
@@ -531,21 +591,7 @@ class OpenModal(SlackModal):
531
591
  logger.exception("Error triggering incident workflow")
532
592
  # XXX warn the user via DM!
533
593
 
534
- @app.action("incident_open_set_res_type_normal")
535
- @app.action("incident_open_set_res_type_critical")
536
- @staticmethod
537
- def handle_set_incident_response_type_action(
538
- ack: Ack, body: dict[str, Any]
539
- ) -> None:
540
- action_name: str = body.get("actions", [{}])[0].get("action_id", "")
541
- action_name = action_name.replace("incident_open_set_res_type_", "")
542
- opening_data = cast(
543
- "OpeningData", json.loads(body.get("actions", [{}])[0].get("value", {})) or {}
544
- )
545
-
546
- OpenModal._update_incident_modal(
547
- action_name, "response_type", ack, body, opening_data
548
- )
594
+ # Response type buttons removed - now auto-determined based on priority
549
595
 
550
596
  @app.action("set_type")
551
597
  @staticmethod
@@ -567,7 +613,11 @@ class OpenModal(SlackModal):
567
613
  body: dict[str, Any],
568
614
  opening_data: OpeningData,
569
615
  ) -> None:
570
- data: OpeningData = {**opening_data, metadata_key: action_value} # type: ignore
616
+ # Ensure we preserve all existing data, especially impact_form_data
617
+ data: OpeningData = OpeningData()
618
+ data.update(opening_data)
619
+ data[metadata_key] = action_value
620
+
571
621
  user = get_user_from_context(body)
572
622
  view = cls().build_modal_fn(open_incident_context=data, user=user)
573
623
 
@@ -205,7 +205,16 @@ class SelectImpactModal(
205
205
  def _calculate_proposed_incident_type(
206
206
  suggested_priority_value: int,
207
207
  ) -> ResponseType:
208
- return "critical" if suggested_priority_value <= 3 else "normal"
208
+ try:
209
+ priority = Priority.objects.get(value=suggested_priority_value)
210
+ # Use priority recommendation if available
211
+ if priority.recommended_response_type:
212
+ return cast("ResponseType", priority.recommended_response_type)
213
+ except Priority.DoesNotExist:
214
+ logger.warning(f"Priority with value {suggested_priority_value} does not exist")
215
+
216
+ # Fallback logic: P1/P2/P3 = critical, P4/P5 = normal
217
+ return cast("ResponseType", "critical" if suggested_priority_value < 4 else "normal")
209
218
 
210
219
  @staticmethod
211
220
  def _update_private_metadata(
@@ -230,12 +239,36 @@ class SelectImpactModal(
230
239
  )
231
240
  except queryset.model.DoesNotExist:
232
241
  form.form.data[field_name] = None # type: ignore
242
+ suggested_priority_value = form.form.suggest_priority_from_impact()
243
+
244
+ # If no impacts are selected (all set to "NO"), don't set priority/response_type
245
+ if suggested_priority_value == 6: # LevelChoices.NONE.priority
246
+ return OpeningData(
247
+ priority=None,
248
+ response_type=None,
249
+ impact_form_data=cast("dict[str, Any]", form.form.data),
250
+ details_form_data=private_metadata_raw.get("details_form_data", {}),
251
+ incident_type=private_metadata_raw.get("incident_type"),
252
+ )
253
+
254
+ try:
255
+ priority = Priority.objects.get(value=suggested_priority_value)
256
+ except Priority.DoesNotExist as err:
257
+ logger.exception(
258
+ f"Priority with value {suggested_priority_value} does not exist"
259
+ )
260
+ # Fallback to default priority (assuming P3 exists)
261
+ fallback_priority = Priority.objects.filter(value__gte=3).first()
262
+ if not fallback_priority:
263
+ # If no priority exists, create a minimal fallback
264
+ logger.exception("No priority found in database")
265
+ raise ValueError("No priority configuration found in database") from err
266
+ priority = fallback_priority
267
+
233
268
  return OpeningData(
234
- priority=Priority.objects.get(
235
- value=form.form.suggest_priority_from_impact()
236
- ),
269
+ priority=priority,
237
270
  response_type=SelectImpactModal._calculate_proposed_incident_type(
238
- form.form.suggest_priority_from_impact()
271
+ suggested_priority_value
239
272
  ),
240
273
  impact_form_data=cast("dict[str, Any]", form.form.data),
241
274
  details_form_data=private_metadata_raw.get("details_form_data", {}),
@@ -1,12 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
- from unittest.mock import MagicMock
4
+ from unittest.mock import MagicMock, Mock, patch
5
5
 
6
6
  import pytest
7
- from slack_sdk.models.blocks.block_elements import ButtonElement
8
7
  from slack_sdk.models.blocks.blocks import (
9
- ActionsBlock,
8
+ ContextBlock,
10
9
  )
11
10
 
12
11
  from firefighter.incidents.forms.create_incident import CreateIncidentFormBase
@@ -102,14 +101,32 @@ def test_validate_details_form_invalid() -> None:
102
101
 
103
102
 
104
103
  def test_build_response_type_blocks_bis(open_incident_context: OpeningData) -> None:
104
+ # With no impact_form_data, should return empty list
105
105
  open_incident_context["response_type"] = "critical"
106
106
  blocks = OpenModal._build_response_type_blocks(open_incident_context)
107
+ assert len(blocks) == 0
107
108
 
108
- assert len(blocks) == 1
109
- first_block = blocks[0]
110
- assert isinstance(first_block, ActionsBlock)
111
- assert len(first_block.elements) == 1
112
- assert all(isinstance(element, ButtonElement) for element in first_block.elements)
109
+ # With valid impact_form_data, should return context blocks
110
+ mock_impact_form = Mock()
111
+ mock_impact_form.is_valid.return_value = True
112
+ mock_impact_form.suggest_priority_from_impact.return_value = 1
113
+
114
+ # Mock Priority object
115
+ mock_priority = Mock()
116
+ mock_priority.emoji = "🔴"
117
+ mock_priority.description = "Critical"
118
+ mock_priority.sla = "15 min"
119
+ mock_priority.recommended_response_type = None
120
+
121
+ open_incident_context["impact_form_data"] = {"test_field": "test_value"}
122
+
123
+ with patch("firefighter.slack.views.modals.open.SelectImpactForm", return_value=mock_impact_form), \
124
+ patch("firefighter.slack.views.modals.open.Priority.objects.get", return_value=mock_priority), \
125
+ patch.object(OpenModal, "_get_impact_descriptions", return_value="Test impact"):
126
+ blocks = OpenModal._build_response_type_blocks(open_incident_context)
127
+ assert len(blocks) == 1
128
+ first_block = blocks[0]
129
+ assert isinstance(first_block, ContextBlock)
113
130
 
114
131
 
115
132
  @pytest.mark.django_db