firefighter-incident 0.0.27__tar.gz → 0.0.28__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 (535) hide show
  1. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/PKG-INFO +1 -1
  2. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/_version.py +2 -2
  3. firefighter_incident-0.0.28/firefighter/jira_app/templates/jira/postmortem/impact.txt +17 -0
  4. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/messages/slack_messages.py +73 -19
  5. firefighter_incident-0.0.28/firefighter/slack/views/modals/postmortem.py +147 -0
  6. firefighter_incident-0.0.28/firefighter_tests/test_slack/views/modals/test_postmortem_modal.py +72 -0
  7. firefighter_incident-0.0.27/firefighter/jira_app/templates/jira/postmortem/impact.txt +0 -12
  8. firefighter_incident-0.0.27/firefighter/slack/views/modals/postmortem.py +0 -79
  9. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/.gitignore +0 -0
  10. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/LICENSE +0 -0
  11. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/README.md +0 -0
  12. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/__init__.py +0 -0
  13. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/__init__.py +0 -0
  14. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/admin.py +0 -0
  15. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/apps.py +0 -0
  16. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/authentication.py +0 -0
  17. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/migrations/0001_initial.py +0 -0
  18. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/migrations/0002_alter_apitokenproxy_options.py +0 -0
  19. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/migrations/0003_alter_apitokenproxy_options.py +0 -0
  20. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/migrations/__init__.py +0 -0
  21. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/models.py +0 -0
  22. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/permissions.py +0 -0
  23. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/renderer.py +0 -0
  24. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/serializers.py +0 -0
  25. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/urls.py +0 -0
  26. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/__init__.py +0 -0
  27. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/_base.py +0 -0
  28. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/components.py +0 -0
  29. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/environments.py +0 -0
  30. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/groups.py +0 -0
  31. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/incident_cost_types.py +0 -0
  32. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/incident_costs.py +0 -0
  33. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/incidents.py +0 -0
  34. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/api/views/severities.py +0 -0
  35. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/__init__.py +0 -0
  36. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/avatar/__init__.py +0 -0
  37. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/avatar/avatar.html +0 -0
  38. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/avatar/avatar.py +0 -0
  39. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/card/__init__.py +0 -0
  40. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/card/card.html +0 -0
  41. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/card/card.py +0 -0
  42. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/export_button/__init__.py +0 -0
  43. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/export_button/export_button.html +0 -0
  44. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/export_button/export_button.py +0 -0
  45. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form/__init__.py +0 -0
  46. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form/form.html +0 -0
  47. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form/form.py +0 -0
  48. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form_field/__init__.py +0 -0
  49. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form_field/form_field.html +0 -0
  50. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/form_field/form_field.py +0 -0
  51. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/messages/__init__.py +0 -0
  52. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/messages/messages.html +0 -0
  53. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/messages/messages.py +0 -0
  54. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/modal/__init__.py +0 -0
  55. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/modal/modal.html +0 -0
  56. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/components/modal/modal.py +0 -0
  57. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/__init__.py +0 -0
  58. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/admin.py +0 -0
  59. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/apps.py +0 -0
  60. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/client.py +0 -0
  61. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/__init__.py +0 -0
  62. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/commands/__init__.py +0 -0
  63. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/commands/sort_postmortems.py +0 -0
  64. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/commands/sort_runbooks.py +0 -0
  65. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/commands/sync_postmortems.py +0 -0
  66. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/management/commands/sync_runbooks.py +0 -0
  67. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/migrations/0001_initial_oss.py +0 -0
  68. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/migrations/__init__.py +0 -0
  69. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/models.py +0 -0
  70. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/serializers.py +0 -0
  71. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/service.py +0 -0
  72. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/signals/__init__.py +0 -0
  73. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/signals/incident_updated.py +0 -0
  74. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tables.py +0 -0
  75. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/__init__.py +0 -0
  76. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/archive_postmortems.py +0 -0
  77. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/sort_runbooks.py +0 -0
  78. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/sync_pages_content.py +0 -0
  79. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/sync_postmortems.py +0 -0
  80. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/tasks/sync_runbooks.py +0 -0
  81. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/templates/oncall_team.xml +0 -0
  82. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/templates/pages/runbook_list.html +0 -0
  83. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/urls.py +0 -0
  84. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/utils.py +0 -0
  85. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/__init__.py +0 -0
  86. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/api.py +0 -0
  87. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/postmortem/__init__.py +0 -0
  88. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/postmortem/postmortem_detail.py +0 -0
  89. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/runbook/__init__.py +0 -0
  90. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/confluence/views/runbook/runbook_list.py +0 -0
  91. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/__init__.py +0 -0
  92. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/admin.py +0 -0
  93. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/apps.py +0 -0
  94. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/asgi.py +0 -0
  95. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/celery_client.py +0 -0
  96. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/fields_forms_widgets.py +0 -0
  97. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/filters.py +0 -0
  98. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/formats/__init__.py +0 -0
  99. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/formats/en/__init__.py +0 -0
  100. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/formats/en/formats.py +0 -0
  101. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/http_client.py +0 -0
  102. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/management/__init__.py +0 -0
  103. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/management/commands/__init__.py +0 -0
  104. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/management/commands/task.py +0 -0
  105. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/middleware.py +0 -0
  106. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/__init__.py +0 -0
  107. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/__init__.py +0 -0
  108. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/api.py +0 -0
  109. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/caches.py +0 -0
  110. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/celery.py +0 -0
  111. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/common.py +0 -0
  112. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/confluence.py +0 -0
  113. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/jira_app.py +0 -0
  114. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/logging.py +0 -0
  115. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/pagerduty.py +0 -0
  116. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/raid.py +0 -0
  117. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/components/slack.py +0 -0
  118. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/environments/__init__.py +0 -0
  119. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/environments/dev.py +0 -0
  120. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/environments/prod.py +0 -0
  121. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/settings_builder.py +0 -0
  122. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/settings/settings_utils.py +0 -0
  123. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/sso.py +0 -0
  124. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/tables_utils.py +0 -0
  125. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/templates/admin/base.html +0 -0
  126. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/templates/admin/login.html +0 -0
  127. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/templates/admin/send_message_conversation.html +0 -0
  128. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/templates/robots.txt +0 -0
  129. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/urls.py +0 -0
  130. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/utils.py +0 -0
  131. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/views.py +0 -0
  132. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/firefighter/wsgi.py +0 -0
  133. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/__init__.py +0 -0
  134. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/admin.py +0 -0
  135. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/apps.py +0 -0
  136. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/enums.py +0 -0
  137. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/factories.py +0 -0
  138. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/__init__.py +0 -0
  139. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/close_incident.py +0 -0
  140. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/closure_reason.py +0 -0
  141. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/create_incident.py +0 -0
  142. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/edit.py +0 -0
  143. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/select_impact.py +0 -0
  144. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/unified_incident.py +0 -0
  145. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/update_key_events.py +0 -0
  146. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/update_roles.py +0 -0
  147. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/update_status.py +0 -0
  148. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/forms/utils.py +0 -0
  149. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/management/__init__.py +0 -0
  150. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/management/commands/__init__.py +0 -0
  151. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/management/commands/backdate_incident_mitigated.py +0 -0
  152. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/management/commands/test_postmortem_reminders.py +0 -0
  153. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/menus.py +0 -0
  154. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0001_initial_oss.py +0 -0
  155. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0002_alter_severity_name_alter_user_password_featureteam.py +0 -0
  156. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0003_delete_featureteam.py +0 -0
  157. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0004_incidentupdate_environment.py +0 -0
  158. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0005_enable_from_p1_to_p5_priority.py +0 -0
  159. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0006_update_group_names.py +0 -0
  160. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0007_update_component_name.py +0 -0
  161. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0008_impact_level.py +0 -0
  162. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0009_update_sla.py +0 -0
  163. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0010_update_components.py +0 -0
  164. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0011_update_incidents.py +0 -0
  165. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0012_alter_impactlevel.py +0 -0
  166. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0013_add_missing_component.py +0 -0
  167. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0014_update_components_slack_groups.py +0 -0
  168. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0015_update_impact_level.py +0 -0
  169. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0016_update_business_incidents_and_level.py +0 -0
  170. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0017_reorder_impact_types.py +0 -0
  171. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0018_update_impactlevel_names.py +0 -0
  172. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0019_set_security_components_private.py +0 -0
  173. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0020_create_incident_category_model.py +0 -0
  174. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0021_copy_component_data_to_incident_category.py +0 -0
  175. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0022_add_incident_category_fields.py +0 -0
  176. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0023_populate_incident_category_references.py +0 -0
  177. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0024_remove_component_fields_and_model.py +0 -0
  178. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0025_make_incident_category_required.py +0 -0
  179. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0026_alter_incidentcategory_options_and_more.py +0 -0
  180. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0027_add_closure_fields.py +0 -0
  181. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0028_add_closure_reason_constraint.py +0 -0
  182. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0029_add_custom_fields_to_incident.py +0 -0
  183. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/0030_add_mitigated_at_field.py +0 -0
  184. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/migrations/__init__.py +0 -0
  185. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/__init__.py +0 -0
  186. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/environment.py +0 -0
  187. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/group.py +0 -0
  188. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/impact.py +0 -0
  189. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident.py +0 -0
  190. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_category.py +0 -0
  191. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_cost.py +0 -0
  192. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_cost_type.py +0 -0
  193. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_membership.py +0 -0
  194. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_role_type.py +0 -0
  195. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/incident_update.py +0 -0
  196. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/metric_type.py +0 -0
  197. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/milestone_type.py +0 -0
  198. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/priority.py +0 -0
  199. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/severity.py +0 -0
  200. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/models/user.py +0 -0
  201. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/signals.py +0 -0
  202. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/css/incident.css +0 -0
  203. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/css/main.css +0 -0
  204. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/css/main.min.css +0 -0
  205. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/css/tailwind.css +0 -0
  206. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/android-chrome-192x192.png +0 -0
  207. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/android-chrome-512x512.png +0 -0
  208. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/apple-touch-icon.png +0 -0
  209. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/favicon-16x16.png +0 -0
  210. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/favicon-32x32.png +0 -0
  211. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/favicon.ico +0 -0
  212. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/favicon/site.webmanifest +0 -0
  213. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/gameday.png +0 -0
  214. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/logo-firefighter.png +0 -0
  215. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/p1.png +0 -0
  216. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/p2.png +0 -0
  217. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/p3.png +0 -0
  218. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/p4.png +0 -0
  219. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/img/p5.png +0 -0
  220. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/js/main.js +0 -0
  221. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/static/js/main.min.js +0 -0
  222. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/tables.py +0 -0
  223. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/tasks/__init__.py +0 -0
  224. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/tasks/updateoncall.py +0 -0
  225. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/errors/base.html +0 -0
  226. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/filter.html +0 -0
  227. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/table/priority_column.html +0 -0
  228. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/table/status_column.html +0 -0
  229. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/table.html +0 -0
  230. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/widgets/form_container.html +0 -0
  231. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/widgets/grouped_checkbox_nested.html +0 -0
  232. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/incidents/widgets/input_option.html +0 -0
  233. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/index.html +0 -0
  234. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/created_at_help.html +0 -0
  235. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/environment_pill.html +0 -0
  236. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/footer.html +0 -0
  237. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/header.html +0 -0
  238. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/incident_card.html +0 -0
  239. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/incident_metrics.html +0 -0
  240. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/incident_timeline.html +0 -0
  241. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view.html +0 -0
  242. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view_modal.html +0 -0
  243. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/partial_table_list_paginated.html +0 -0
  244. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/priority_icon.html +0 -0
  245. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/priority_pill.html +0 -0
  246. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/status_pill.html +0 -0
  247. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/table.html +0 -0
  248. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/user_card.html +0 -0
  249. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/partials/user_tooltip.html +0 -0
  250. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/layouts/view_filters.html +0 -0
  251. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/dashboard.html +0 -0
  252. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/docs_metrics.html +0 -0
  253. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_category_detail.html +0 -0
  254. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_category_list.html +0 -0
  255. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_create.html +0 -0
  256. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_detail.html +0 -0
  257. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_list.html +0 -0
  258. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_role_types_detail.html +0 -0
  259. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_role_types_list.html +0 -0
  260. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_statistics.html +0 -0
  261. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_statistics_partial.html +0 -0
  262. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/incident_update_key_events_form.html +0 -0
  263. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/templates/pages/user_detail.html +0 -0
  264. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/urls.py +0 -0
  265. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/__init__.py +0 -0
  266. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/components/__init__.py +0 -0
  267. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/components/details.py +0 -0
  268. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/components/list.py +0 -0
  269. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/date_filter.py +0 -0
  270. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/date_utils.py +0 -0
  271. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/docs/__init__.py +0 -0
  272. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/docs/metrics.py +0 -0
  273. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/docs/role_types.py +0 -0
  274. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/errors.py +0 -0
  275. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/reports.py +0 -0
  276. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/users/__init__.py +0 -0
  277. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/users/details.py +0 -0
  278. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/incidents/views/views.py +0 -0
  279. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/__init__.py +0 -0
  280. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/admin.py +0 -0
  281. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/apps.py +0 -0
  282. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/client.py +0 -0
  283. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/management/__init__.py +0 -0
  284. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/management/commands/__init__.py +0 -0
  285. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/migrations/0001_initial_oss.py +0 -0
  286. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/migrations/0002_add_jira_postmortem_model.py +0 -0
  287. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/migrations/__init__.py +0 -0
  288. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/models.py +0 -0
  289. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/service_postmortem.py +0 -0
  290. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/signals/__init__.py +0 -0
  291. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/signals/incident_key_events_updated.py +0 -0
  292. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/signals/postmortem_created.py +0 -0
  293. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/tasks/__init__.py +0 -0
  294. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/tasks/sync_users_jira.py +0 -0
  295. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/templates/jira/postmortem/incident_summary.txt +0 -0
  296. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/templates/jira/postmortem/mitigation_actions.txt +0 -0
  297. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/templates/jira/postmortem/root_causes.txt +0 -0
  298. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/templates/jira/postmortem/timeline.txt +0 -0
  299. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/types.py +0 -0
  300. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/jira_app/utils.py +0 -0
  301. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/logging/__init__.py +0 -0
  302. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/logging/custom_json_formatter.py +0 -0
  303. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/logging/pretty_formatter.py +0 -0
  304. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/__init__.py +0 -0
  305. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/admin.py +0 -0
  306. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/apps.py +0 -0
  307. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/client.py +0 -0
  308. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/forms/__init__.py +0 -0
  309. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/forms/create_pagerduty_incident.py +0 -0
  310. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/migrations/0001_initial_oss.py +0 -0
  311. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/migrations/__init__.py +0 -0
  312. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/models.py +0 -0
  313. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/service.py +0 -0
  314. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/signals/__init__.py +0 -0
  315. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/signals/get_invites_from_pagerduty.py +0 -0
  316. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/signals/incident_channel_done_oncall.py +0 -0
  317. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/tasks/__init__.py +0 -0
  318. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/tasks/fetch_oncall.py +0 -0
  319. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/tasks/fetch_services.py +0 -0
  320. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/tasks/fetch_users.py +0 -0
  321. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/tasks/trigger_oncall.py +0 -0
  322. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/templates/pages/oncall_list.html +0 -0
  323. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/templates/pages/oncall_trigger.html +0 -0
  324. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view.html +0 -0
  325. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view_modal.html +0 -0
  326. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/urls.py +0 -0
  327. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/views/__init__.py +0 -0
  328. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/views/oncall_list.py +0 -0
  329. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/pagerduty/views/oncall_trigger.py +0 -0
  330. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/__init__.py +0 -0
  331. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/admin.py +0 -0
  332. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/apps.py +0 -0
  333. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/client.py +0 -0
  334. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/forms.py +0 -0
  335. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/messages.py +0 -0
  336. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/migrations/0001_initial_oss.py +0 -0
  337. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/migrations/0002_featureteam_remove_qualifierrotation_jira_user_and_more.py +0 -0
  338. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/migrations/0003_delete_raidarea.py +0 -0
  339. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/migrations/__init__.py +0 -0
  340. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/models.py +0 -0
  341. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/resources.py +0 -0
  342. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/serializers.py +0 -0
  343. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/service.py +0 -0
  344. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/signals/__init__.py +0 -0
  345. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/signals/incident_updated.py +0 -0
  346. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/tasks/__init__.py +0 -0
  347. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/types.py +0 -0
  348. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/urls.py +0 -0
  349. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/utils.py +0 -0
  350. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/raid/views/__init__.py +0 -0
  351. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/__init__.py +0 -0
  352. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/admin.py +0 -0
  353. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/apps.py +0 -0
  354. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/factories.py +0 -0
  355. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/forms/__init__.py +0 -0
  356. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/forms/sos_form.py +0 -0
  357. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/management/__init__.py +0 -0
  358. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/management/commands/__init__.py +0 -0
  359. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/management/commands/generate_manifest.py +0 -0
  360. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/management/commands/switch_test_users.py +0 -0
  361. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/messages/__init__.py +0 -0
  362. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/messages/base.py +0 -0
  363. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0001_initial_oss.py +0 -0
  364. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0002_usergroup_tag.py +0 -0
  365. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0003_alter_usergroup_tag.py +0 -0
  366. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0004_alter_usergroup_components.py +0 -0
  367. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0005_add_incident_categories_fields.py +0 -0
  368. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0006_copy_components_to_incident_categories.py +0 -0
  369. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0007_remove_components_fields.py +0 -0
  370. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0008_alter_conversation_incident_categories_and_more.py +0 -0
  371. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/0009_add_postmortem_reminder_periodic_task.py +0 -0
  372. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/migrations/__init__.py +0 -0
  373. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/__init__.py +0 -0
  374. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/conversation.py +0 -0
  375. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/incident_channel.py +0 -0
  376. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/message.py +0 -0
  377. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/sos.py +0 -0
  378. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/user.py +0 -0
  379. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/models/user_group.py +0 -0
  380. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/rules.py +0 -0
  381. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/__init__.py +0 -0
  382. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/create_incident_conversation.py +0 -0
  383. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/get_users.py +0 -0
  384. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/handle_incident_channel_done.py +0 -0
  385. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/incident_closed.py +0 -0
  386. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/incident_updated.py +0 -0
  387. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/postmortem_created.py +0 -0
  388. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/signals/roles_reminders.py +0 -0
  389. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/slack_app.py +0 -0
  390. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/slack_incident_context.py +0 -0
  391. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/slack_templating.py +0 -0
  392. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/__init__.py +0 -0
  393. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/fetch_conversations_members.py +0 -0
  394. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/reminder_postmortem.py +0 -0
  395. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/send_message.py +0 -0
  396. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/send_postmortem_reminders.py +0 -0
  397. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/send_reminders.py +0 -0
  398. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/sync_users.py +0 -0
  399. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/update_usergroups_members.py +0 -0
  400. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/tasks/update_users.py +0 -0
  401. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/urls.py +0 -0
  402. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/utils.py +0 -0
  403. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/__init__.py +0 -0
  404. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/__init__.py +0 -0
  405. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/actions_and_shortcuts.py +0 -0
  406. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_archive.py +0 -0
  407. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_id_changed.py +0 -0
  408. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_rename.py +0 -0
  409. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_shared.py +0 -0
  410. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_unarchive.py +0 -0
  411. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/channel_unshared.py +0 -0
  412. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/commands.py +0 -0
  413. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/home.py +0 -0
  414. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/member_joined_channel.py +0 -0
  415. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/member_left_channel.py +0 -0
  416. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/message.py +0 -0
  417. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/message_deleted.py +0 -0
  418. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/events/reaction_added.py +0 -0
  419. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/__init__.py +0 -0
  420. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/__init__.py +0 -0
  421. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/base.py +0 -0
  422. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/base_mixins.py +0 -0
  423. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/form_utils.py +0 -0
  424. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/mixins.py +0 -0
  425. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/base_modal/modal_utils.py +0 -0
  426. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/close.py +0 -0
  427. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/closure_reason.py +0 -0
  428. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/downgrade_workflow.py +0 -0
  429. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/edit.py +0 -0
  430. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/key_event_message.py +0 -0
  431. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/open.py +0 -0
  432. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/__init__.py +0 -0
  433. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/check_current_incidents.py +0 -0
  434. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/details/__init__.py +0 -0
  435. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/details/unified.py +0 -0
  436. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/select_impact.py +0 -0
  437. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/set_details.py +0 -0
  438. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/opening/types.py +0 -0
  439. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/select.py +0 -0
  440. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/send_sos.py +0 -0
  441. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/status.py +0 -0
  442. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/trigger_oncall.py +0 -0
  443. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/update.py +0 -0
  444. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/update_roles.py +0 -0
  445. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/update_status.py +0 -0
  446. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/modals/utils.py +0 -0
  447. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter/slack/views/views.py +0 -0
  448. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/environments.json +0 -0
  449. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/groups.json +0 -0
  450. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/impact_level.json +0 -0
  451. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/impact_type.json +0 -0
  452. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/incident_categories.json +0 -0
  453. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/incident_role_type.json +0 -0
  454. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/metric_type.json +0 -0
  455. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/milestone_type.json +0 -0
  456. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/priorities.json +0 -0
  457. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_fixtures/incidents/severities.json +0 -0
  458. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/__init__.py +0 -0
  459. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/conftest.py +0 -0
  460. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_api/test_api_landbot.py +0 -0
  461. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_api/test_api_urls.py +0 -0
  462. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_api/test_renderer.py +0 -0
  463. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_confluence/test_confluence_utils.py +0 -0
  464. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_firefighter/test_firefighter_utils.py +0 -0
  465. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_firefighter/test_logging.py +0 -0
  466. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_firefighter/test_sso.py +0 -0
  467. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_firefighter/test_urls.py +0 -0
  468. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_enums.py +0 -0
  469. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/conftest.py +0 -0
  470. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_closure_reason.py +0 -0
  471. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_form_select_impact.py +0 -0
  472. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_form_utils.py +0 -0
  473. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form.py +0 -0
  474. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form_integration.py +0 -0
  475. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form_p4_p5.py +0 -0
  476. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_update_key_events.py +0 -0
  477. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_update_status_workflow.py +0 -0
  478. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_forms/test_workflow_transitions.py +0 -0
  479. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_incident_urls.py +0 -0
  480. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_models/test_incident_category.py +0 -0
  481. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_models/test_incident_model.py +0 -0
  482. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_models/test_migrations/test_incident_migrations.py +0 -0
  483. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_utils/test_date_utils.py +0 -0
  484. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_views/test_incident_detail_view.py +0 -0
  485. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_incidents/test_views/test_index_view.py +0 -0
  486. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/__init__.py +0 -0
  487. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/conftest.py +0 -0
  488. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_incident_key_events_sync.py +0 -0
  489. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_jira_client_watchers.py +0 -0
  490. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_models.py +0 -0
  491. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_postmortem_issue_link.py +0 -0
  492. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_postmortem_service.py +0 -0
  493. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_jira_app/test_timeline_template.py +0 -0
  494. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/conftest.py +0 -0
  495. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_alert_p4_p5.py +0 -0
  496. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_client.py +0 -0
  497. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_client_users.py +0 -0
  498. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_forms.py +0 -0
  499. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_models.py +0 -0
  500. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_serializers.py +0 -0
  501. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_service.py +0 -0
  502. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_signals.py +0 -0
  503. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_transitions.py +0 -0
  504. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_utils.py +0 -0
  505. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_raid_views.py +0 -0
  506. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_raid/test_zendesk_integration.py +0 -0
  507. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/conftest.py +0 -0
  508. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/messages/__init__.py +0 -0
  509. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/messages/test_slack_messages.py +0 -0
  510. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_conversation_tags.py +0 -0
  511. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_models/test_conversations.py +0 -0
  512. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_models/test_incident_channel.py +0 -0
  513. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_models/test_slack_user.py +0 -0
  514. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_signals_downgrade.py +0 -0
  515. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/test_slack_utils.py +0 -0
  516. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/conftest.py +0 -0
  517. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_close.py +0 -0
  518. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_closure_reason_modal.py +0 -0
  519. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_edit.py +0 -0
  520. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_form_utils_multiple_choice.py +0 -0
  521. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_key_event_message.py +0 -0
  522. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_open.py +0 -0
  523. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_opening_unified.py +0 -0
  524. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_send_sos.py +0 -0
  525. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_status.py +0 -0
  526. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_update_status.py +0 -0
  527. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/firefighter_tests/test_slack/views/modals/test_utils.py +0 -0
  528. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/gunicorn.conf.py +0 -0
  529. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/main.py +0 -0
  530. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/manage.py +0 -0
  531. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/package-lock.json +0 -0
  532. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/package.json +0 -0
  533. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/pyproject.toml +0 -0
  534. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/scripts/gen_credits.py +0 -0
  535. {firefighter_incident-0.0.27 → firefighter_incident-0.0.28}/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.27
3
+ Version: 0.0.28
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/
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.27'
32
- __version_tuple__ = version_tuple = (0, 0, 27)
31
+ __version__ = version = '0.0.28'
32
+ __version_tuple__ = version_tuple = (0, 0, 28)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,17 @@
1
+ h2. Impact
2
+
3
+ h3. Business Impact
4
+
5
+ *{color:red}_TODO: Describe the business impact and precise the BV daily loss._{color}*
6
+ *{color:red}_For the BV daily loss, use [this documentation|https://manomano.atlassian.net/wiki/spaces/TC/pages/4089315451/How+to+calculate+BV+loss]._{color}*
7
+
8
+ h3. User Impact
9
+
10
+ *{color:red}_TODO: Describe the impact on users._{color}*
11
+
12
+ h3. Affected Systems
13
+ {% if components %}
14
+ {% for component in components %}* {{ component.name }}
15
+ {% endfor %}
16
+ {% else %}_No components recorded._
17
+ {% endif %}
@@ -109,15 +109,36 @@ class SlackMessageIncidentPostMortemReminder(SlackMessageSurface):
109
109
  action_id=UpdateStatusModal.open_action,
110
110
  ),
111
111
  ),
112
- SectionBlock(
113
- text="2. Edit your post-mortem on Confluence",
114
- accessory=ButtonElement(
115
- text="Edit post-mortem",
116
- value=self.incident.postmortem_for.page_edit_url,
117
- url=self.incident.postmortem_for.page_edit_url,
118
- action_id="open_link",
119
- ),
120
- ),
112
+ ]
113
+
114
+ # Add post-mortem editing options based on available services
115
+ if hasattr(self.incident, "postmortem_for") and self.incident.postmortem_for:
116
+ blocks.append(
117
+ SectionBlock(
118
+ text="2. Edit your post-mortem on Confluence",
119
+ accessory=ButtonElement(
120
+ text="Edit post-mortem",
121
+ value=self.incident.postmortem_for.page_edit_url,
122
+ url=self.incident.postmortem_for.page_edit_url,
123
+ action_id="open_link",
124
+ ),
125
+ )
126
+ )
127
+ elif hasattr(self.incident, "jira_postmortem_for") and self.incident.jira_postmortem_for:
128
+ jira_pm = self.incident.jira_postmortem_for
129
+ blocks.append(
130
+ SectionBlock(
131
+ text="2. Edit your post-mortem on Jira",
132
+ accessory=ButtonElement(
133
+ text=f"Edit Jira post-mortem ({jira_pm.jira_issue_key})",
134
+ url=jira_pm.issue_url,
135
+ action_id="open_link",
136
+ ),
137
+ )
138
+ )
139
+
140
+ # Continue with remaining steps
141
+ blocks.extend([
121
142
  SectionBlock(
122
143
  text=f"3. Submit the key events to {APP_DISPLAY_NAME}",
123
144
  **accessory_kwargs,
@@ -138,7 +159,8 @@ class SlackMessageIncidentPostMortemReminder(SlackMessageSurface):
138
159
  )
139
160
  ]
140
161
  ),
141
- ]
162
+ ])
163
+
142
164
  if POSTMORTEM_HELP_URL:
143
165
  blocks.insert(
144
166
  4,
@@ -184,14 +206,30 @@ class SlackMessageIncidentFixedNextActions(SlackMessageSurface):
184
206
  ),
185
207
  ),
186
208
  DividerBlock(),
187
- ContextBlock(
188
- elements=[
189
- MarkdownTextObject(
190
- text="A post-mortem is *not* required for this incident.\nIf you want to create one, use `/incident postmortem` to create a new post-mortem page on Confluence."
191
- )
192
- ]
193
- ),
194
209
  ]
210
+
211
+ # Add post-mortem context message if any post-mortem service is enabled
212
+ enable_confluence = getattr(settings, "ENABLE_CONFLUENCE", False)
213
+ enable_jira_postmortem = getattr(settings, "ENABLE_JIRA_POSTMORTEM", False)
214
+
215
+ if enable_confluence or enable_jira_postmortem:
216
+ postmortem_text = "A post-mortem is *not* required for this incident.\nIf you want to create one, use `/incident postmortem` to create a new post-mortem page"
217
+
218
+ if enable_confluence and enable_jira_postmortem:
219
+ postmortem_text += " on Confluence or Jira."
220
+ elif enable_confluence:
221
+ postmortem_text += " on Confluence."
222
+ elif enable_jira_postmortem:
223
+ postmortem_text += " on Jira."
224
+
225
+ blocks.append(
226
+ ContextBlock(
227
+ elements=[
228
+ MarkdownTextObject(text=postmortem_text)
229
+ ]
230
+ )
231
+ )
232
+
195
233
  return blocks
196
234
 
197
235
 
@@ -612,7 +650,23 @@ class SlackMessageIncidentPostMortemCreated(SlackMessageSurface):
612
650
  return "\n".join(parts)
613
651
 
614
652
  def get_blocks(self) -> list[Block]:
615
- return [SectionBlock(text=self.get_text())]
653
+ blocks: list[Block] = [SectionBlock(text=self.get_text())]
654
+
655
+ # Add documentation link if Jira post-mortem exists
656
+ if hasattr(self.incident, "jira_postmortem_for") and self.incident.jira_postmortem_for:
657
+ blocks.append(
658
+ SectionBlock(
659
+ text="Need guidance on how to fill Post-Mortems in Jira? See our documentation",
660
+ accessory=ButtonElement(
661
+ text="Open documentation",
662
+ url="https://manomano.atlassian.net/wiki/spaces/TC/pages/5639635000/How+to+fill+Post-Mortems+in+Jira",
663
+ value="jira_postmortem_documentation",
664
+ action_id="open_link",
665
+ ),
666
+ )
667
+ )
668
+
669
+ return blocks
616
670
 
617
671
 
618
672
  class SlackMessageIncidentPostMortemCreatedAnnouncement(SlackMessageSurface):
@@ -696,7 +750,7 @@ class SlackMessagePostMortemReminder5Days(SlackMessageSurface):
696
750
  if hasattr(self.incident, "postmortem_for"):
697
751
  pm_links.append(
698
752
  ButtonElement(
699
- text="Open Confluence Post-Mortem",
753
+ text="Open Post-Mortem (Confluence)",
700
754
  url=self.incident.postmortem_for.page_edit_url,
701
755
  action_id="open_link",
702
756
  )
@@ -0,0 +1,147 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from django.core.exceptions import ObjectDoesNotExist
7
+ from slack_sdk.models.blocks.block_elements import ButtonElement
8
+ from slack_sdk.models.blocks.blocks import ActionsBlock, Block, SectionBlock
9
+ from slack_sdk.models.views import View
10
+
11
+ from firefighter.confluence.models import PostMortemManager
12
+ from firefighter.incidents.models.incident import Incident
13
+ from firefighter.slack.utils import respond
14
+ from firefighter.slack.views.modals.base_modal.base import SlackModal, app
15
+ from firefighter.slack.views.modals.base_modal.mixins import (
16
+ IncidentSelectableModalMixin,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from slack_bolt.context.ack.ack import Ack
21
+
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class PostMortemModal(
27
+ IncidentSelectableModalMixin,
28
+ SlackModal,
29
+ ):
30
+ open_action: str = "open_modal_create_postmortem"
31
+ push_action: str = "push_modal_create_postmortem"
32
+ callback_id: str = "incident_create_postmortem"
33
+
34
+ def build_modal_fn(self, incident: Incident, **kwargs: Any) -> View:
35
+ blocks: list[Block] = []
36
+
37
+ # Check existing post-mortems
38
+ has_confluence = _safe_has_relation(incident, "postmortem_for")
39
+ has_jira = _safe_has_relation(incident, "jira_postmortem_for")
40
+
41
+ if has_confluence or has_jira:
42
+ blocks.append(
43
+ SectionBlock(text=f"Post-mortem(s) for incident #{incident.id}:")
44
+ )
45
+
46
+ if has_confluence:
47
+ blocks.append(
48
+ SectionBlock(
49
+ text=f"• Confluence: <{incident.postmortem_for.page_url}|View page>"
50
+ )
51
+ )
52
+
53
+ if has_jira:
54
+ blocks.append(
55
+ SectionBlock(
56
+ text=f"• Jira: <{incident.jira_postmortem_for.issue_url}|{incident.jira_postmortem_for.jira_issue_key}>"
57
+ )
58
+ )
59
+ elif incident.needs_postmortem:
60
+ blocks.append(
61
+ SectionBlock(
62
+ text=f"Post-mortem for incident #{incident.id} will be automatically created when the incident reaches MITIGATED status."
63
+ )
64
+ )
65
+ else:
66
+ blocks.extend(
67
+ [
68
+ SectionBlock(
69
+ text="P3 incident post-mortem is not mandatory. You can still have one if you think is necessary by clicking on the button below."
70
+ ),
71
+ ActionsBlock(
72
+ elements=[
73
+ ButtonElement(
74
+ text="Create post-mortem now",
75
+ action_id="incident_create_postmortem_now",
76
+ value=str(incident.id),
77
+ )
78
+ ]
79
+ ),
80
+ ]
81
+ )
82
+
83
+ return View(
84
+ type="modal",
85
+ title="Postmortem"[:24],
86
+ submit=None,
87
+ callback_id=self.callback_id,
88
+ private_metadata=str(incident.id),
89
+ blocks=blocks,
90
+ )
91
+
92
+ @staticmethod
93
+ def handle_modal_fn(ack: Ack, **_kwargs: Any) -> None:
94
+ # This modal is now read-only (no submit button)
95
+ # Post-mortems are created automatically when incident reaches MITIGATED status
96
+ ack()
97
+
98
+
99
+ @app.action("incident_create_postmortem_now")
100
+ def handle_create_postmortem_action(ack: Ack, body: dict[str, Any]) -> None:
101
+ """Create post-mortem(s) on demand from the modal (e.g. P3+ incidents)."""
102
+ ack()
103
+
104
+ incident_id = str(body.get("actions", [{}])[0].get("value", "")).strip()
105
+ try:
106
+ incident = Incident.objects.get(pk=incident_id)
107
+ except Incident.DoesNotExist:
108
+ respond(body, text=":x: Incident not found.")
109
+ return
110
+
111
+ try:
112
+ confluence_pm, jira_pm = PostMortemManager.create_postmortem_for_incident(
113
+ incident
114
+ )
115
+ except Exception:
116
+ logger.exception("Failed to create post-mortem for incident #%s", incident_id)
117
+ respond(body, text=":x: Failed to create post-mortem. Please try again.")
118
+ return
119
+
120
+ created_targets: list[str] = []
121
+ if confluence_pm:
122
+ created_targets.append("Confluence")
123
+ if jira_pm:
124
+ created_targets.append("Jira")
125
+
126
+ if created_targets:
127
+ targets = " and ".join(created_targets)
128
+ respond(body, text=f":white_check_mark: {targets} post-mortem created.")
129
+ else:
130
+ respond(body, text=":warning: No post-mortem was created.")
131
+
132
+
133
+ modal_postmortem = PostMortemModal()
134
+
135
+
136
+ def _safe_has_relation(instance: Incident, attr: str) -> bool:
137
+ """Safely check if a reverse relation exists without triggering KeyError in cache.
138
+
139
+ Django's reverse OneToOne descriptor can raise KeyError when using hasattr
140
+ on unsaved or freshly created instances. We guard against that here.
141
+ """
142
+ try:
143
+ getattr(instance, attr)
144
+ except (AttributeError, ObjectDoesNotExist, KeyError):
145
+ return False
146
+ else:
147
+ return True
@@ -0,0 +1,72 @@
1
+ from __future__ import annotations
2
+
3
+ from types import SimpleNamespace
4
+
5
+ from firefighter.slack.views.modals.postmortem import PostMortemModal
6
+
7
+
8
+ class TestPostMortemModal:
9
+ @staticmethod
10
+ def _get_text_blocks(view_dict: dict) -> list[str]:
11
+ return [
12
+ block.get("text", {}).get("text", "")
13
+ for block in view_dict.get("blocks", [])
14
+ if block.get("type") == "section"
15
+ ]
16
+
17
+ @staticmethod
18
+ def _get_action_elements(view_dict: dict) -> list[dict]:
19
+ elements: list[dict] = []
20
+ for block in view_dict.get("blocks", []):
21
+ if block.get("type") == "actions":
22
+ elements.extend(block.get("elements", []))
23
+ return elements
24
+
25
+ @staticmethod
26
+ def test_p1_p2_shows_auto_creation_message(mocker):
27
+ incident = SimpleNamespace(id=123, needs_postmortem=True)
28
+
29
+ # No existing PMs
30
+ mocker.patch(
31
+ "firefighter.slack.views.modals.postmortem._safe_has_relation",
32
+ return_value=False,
33
+ create=True,
34
+ )
35
+
36
+ view = PostMortemModal().build_modal_fn(incident)
37
+ view_dict = view.to_dict()
38
+
39
+ texts = TestPostMortemModal._get_text_blocks(view_dict)
40
+ assert any(
41
+ "automatically created when the incident reaches MITIGATED" in t
42
+ for t in texts
43
+ )
44
+ # No manual-create button for mandatory PMs
45
+ action_ids = [
46
+ el.get("action_id")
47
+ for el in TestPostMortemModal._get_action_elements(view_dict)
48
+ ]
49
+ assert "incident_create_postmortem_now" not in action_ids
50
+
51
+ @staticmethod
52
+ def test_p3_shows_optional_message_and_button(mocker):
53
+ incident = SimpleNamespace(id=456, needs_postmortem=False)
54
+
55
+ # No existing PMs
56
+ mocker.patch(
57
+ "firefighter.slack.views.modals.postmortem._safe_has_relation",
58
+ return_value=False,
59
+ create=True,
60
+ )
61
+
62
+ view = PostMortemModal().build_modal_fn(incident)
63
+ view_dict = view.to_dict()
64
+
65
+ texts = TestPostMortemModal._get_text_blocks(view_dict)
66
+ assert any("P3 incident post-mortem is not mandatory" in t for t in texts)
67
+
68
+ action_ids = [
69
+ el.get("action_id")
70
+ for el in TestPostMortemModal._get_action_elements(view_dict)
71
+ ]
72
+ assert "incident_create_postmortem_now" in action_ids
@@ -1,12 +0,0 @@
1
- h2. Impact
2
-
3
- h3. Affected Systems
4
- {% if components %}
5
- {% for component in components %}* {{ component.name }}
6
- {% endfor %}
7
- {% else %}_No components recorded._
8
- {% endif %}
9
-
10
- h3. User Impact
11
-
12
- *{color:red}_TODO: Describe the impact on users and business._{color}*
@@ -1,79 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- from typing import TYPE_CHECKING, Any
5
-
6
- from slack_sdk.models.blocks.blocks import Block, SectionBlock
7
- from slack_sdk.models.views import View
8
-
9
- from firefighter.slack.views.modals.base_modal.base import SlackModal
10
- from firefighter.slack.views.modals.base_modal.mixins import (
11
- IncidentSelectableModalMixin,
12
- )
13
-
14
- if TYPE_CHECKING:
15
- from slack_bolt.context.ack.ack import Ack
16
-
17
- from firefighter.incidents.models.incident import Incident
18
-
19
-
20
- logger = logging.getLogger(__name__)
21
-
22
-
23
- class PostMortemModal(
24
- IncidentSelectableModalMixin,
25
- SlackModal,
26
- ):
27
- open_action: str = "open_modal_create_postmortem"
28
- push_action: str = "push_modal_create_postmortem"
29
- callback_id: str = "incident_create_postmortem"
30
-
31
- def build_modal_fn(self, incident: Incident, **kwargs: Any) -> View:
32
- blocks: list[Block] = []
33
-
34
- # Check existing post-mortems
35
- has_confluence = hasattr(incident, "postmortem_for")
36
- has_jira = hasattr(incident, "jira_postmortem_for")
37
-
38
- if has_confluence or has_jira:
39
- blocks.append(
40
- SectionBlock(text=f"Post-mortem(s) for incident #{incident.id}:")
41
- )
42
-
43
- if has_confluence:
44
- blocks.append(
45
- SectionBlock(
46
- text=f"• Confluence: <{incident.postmortem_for.page_url}|View page>"
47
- )
48
- )
49
-
50
- if has_jira:
51
- blocks.append(
52
- SectionBlock(
53
- text=f"• Jira: <{incident.jira_postmortem_for.issue_url}|{incident.jira_postmortem_for.jira_issue_key}>"
54
- )
55
- )
56
- else:
57
- blocks.append(
58
- SectionBlock(
59
- text=f"Post-mortem for incident #{incident.id} will be automatically created when the incident reaches MITIGATED status."
60
- )
61
- )
62
-
63
- return View(
64
- type="modal",
65
- title="Postmortem"[:24],
66
- submit=None,
67
- callback_id=self.callback_id,
68
- private_metadata=str(incident.id),
69
- blocks=blocks,
70
- )
71
-
72
- @staticmethod
73
- def handle_modal_fn(ack: Ack, **_kwargs: Any) -> None:
74
- # This modal is now read-only (no submit button)
75
- # Post-mortems are created automatically when incident reaches MITIGATED status
76
- ack()
77
-
78
-
79
- modal_postmortem = PostMortemModal()