firefighter-incident 0.0.1rc2__tar.gz → 0.0.2__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 (466) hide show
  1. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/PKG-INFO +13 -8
  2. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/README.md +3 -1
  3. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/_version.py +9 -4
  4. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/admin.py +31 -12
  5. firefighter_incident-0.0.2/firefighter/api/migrations/0003_alter_apitokenproxy_options.py +30 -0
  6. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/models.py +2 -2
  7. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/renderer.py +1 -1
  8. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/serializers.py +6 -4
  9. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/urls.py +13 -19
  10. firefighter_incident-0.0.2/firefighter/components/avatar/avatar.py +37 -0
  11. firefighter_incident-0.0.2/firefighter/components/card/card.py +21 -0
  12. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/export_button/export_button.html +2 -2
  13. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/export_button/export_button.py +26 -7
  14. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/form/form.html +1 -1
  15. firefighter_incident-0.0.2/firefighter/components/form/form.py +26 -0
  16. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/form_field/form_field.html +4 -4
  17. firefighter_incident-0.0.2/firefighter/components/form_field/form_field.py +34 -0
  18. firefighter_incident-0.0.2/firefighter/components/messages/messages.html +42 -0
  19. firefighter_incident-0.0.2/firefighter/components/messages/messages.py +21 -0
  20. firefighter_incident-0.0.2/firefighter/components/modal/modal.html +59 -0
  21. firefighter_incident-0.0.2/firefighter/components/modal/modal.py +35 -0
  22. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/models.py +2 -0
  23. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/service.py +3 -3
  24. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/archive_postmortems.py +7 -2
  25. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/sync_postmortems.py +1 -1
  26. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/sync_runbooks.py +3 -3
  27. firefighter_incident-0.0.2/firefighter/confluence/templates/oncall_team.xml +6 -0
  28. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/templates/pages/runbook_list.html +4 -5
  29. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/utils.py +4 -1
  30. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/filters.py +3 -2
  31. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/http_client.py +7 -9
  32. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/management/commands/task.py +1 -1
  33. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/__init__.py +1 -0
  34. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/common.py +2 -0
  35. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/logging.py +1 -1
  36. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/raid.py +3 -3
  37. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/environments/dev.py +1 -3
  38. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/environments/prod.py +1 -0
  39. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/sso.py +1 -1
  40. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/templates/admin/base.html +3 -2
  41. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/templates/admin/login.html +2 -2
  42. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/templates/admin/send_message_conversation.html +4 -4
  43. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/urls.py +7 -8
  44. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/utils.py +1 -3
  45. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/wsgi.py +2 -1
  46. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/admin.py +11 -7
  47. firefighter_incident-0.0.2/firefighter/incidents/factories.py +93 -0
  48. firefighter_incident-0.0.2/firefighter/incidents/forms/edit.py +33 -0
  49. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/update_key_events.py +1 -1
  50. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/update_roles.py +1 -1
  51. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/utils.py +3 -3
  52. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/menus.py +5 -4
  53. firefighter_incident-0.0.2/firefighter/incidents/migrations/0002_alter_severity_name_alter_user_password_featureteam.py +35 -0
  54. firefighter_incident-0.0.2/firefighter/incidents/migrations/0003_delete_featureteam.py +16 -0
  55. firefighter_incident-0.0.2/firefighter/incidents/migrations/0004_incidentupdate_environment.py +27 -0
  56. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/component.py +8 -11
  57. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/group.py +1 -0
  58. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/impact.py +8 -8
  59. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident.py +14 -11
  60. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident_cost.py +2 -2
  61. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident_membership.py +5 -5
  62. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident_update.py +14 -5
  63. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/metric_type.py +2 -2
  64. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/signals.py +0 -5
  65. firefighter_incident-0.0.2/firefighter/incidents/static/css/main.min.css +1 -0
  66. firefighter_incident-0.0.2/firefighter/incidents/static/css/tailwind.css +53 -0
  67. firefighter_incident-0.0.2/firefighter/incidents/static/js/main.min.js +15 -0
  68. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/tables.py +1 -5
  69. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/tasks/updateoncall.py +1 -3
  70. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/errors/base.html +2 -1
  71. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/filter.html +33 -33
  72. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/table/priority_column.html +1 -1
  73. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/table.html +2 -3
  74. firefighter_incident-0.0.2/firefighter/incidents/templates/incidents/widgets/form_container.html +90 -0
  75. firefighter_incident-0.0.2/firefighter/incidents/templates/incidents/widgets/grouped_checkbox_nested.html +97 -0
  76. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/index.html +3 -3
  77. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/created_at_help.html +2 -3
  78. firefighter_incident-0.0.2/firefighter/incidents/templates/layouts/partials/environment_pill.html +11 -0
  79. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/footer.html +4 -7
  80. firefighter_incident-0.0.2/firefighter/incidents/templates/layouts/partials/header.html +99 -0
  81. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/incident_card.html +6 -6
  82. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/incident_metrics.html +1 -2
  83. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/incident_timeline.html +35 -6
  84. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view.html +3 -3
  85. firefighter_incident-0.0.2/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view_modal.html +20 -0
  86. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/partial_table_list_paginated.html +8 -9
  87. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/priority_pill.html +1 -1
  88. firefighter_incident-0.0.2/firefighter/incidents/templates/layouts/partials/status_pill.html +18 -0
  89. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/table.html +3 -3
  90. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/user_card.html +3 -4
  91. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/user_tooltip.html +1 -1
  92. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/view_filters.html +9 -9
  93. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/component_detail.html +9 -9
  94. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/component_list.html +5 -7
  95. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/dashboard.html +4 -4
  96. firefighter_incident-0.0.2/firefighter/incidents/templates/pages/docs_metrics.html +86 -0
  97. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_create.html +8 -9
  98. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_detail.html +52 -46
  99. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_list.html +7 -7
  100. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_role_types_detail.html +3 -5
  101. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_role_types_list.html +3 -3
  102. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_statistics.html +10 -10
  103. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_statistics_partial.html +7 -11
  104. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/incident_update_key_events_form.html +1 -1
  105. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/pages/user_detail.html +15 -15
  106. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/docs/role_types.py +2 -1
  107. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/errors.py +15 -16
  108. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/reports.py +8 -8
  109. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/users/details.py +1 -4
  110. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/client.py +3 -3
  111. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/models.py +2 -2
  112. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/logging/custom_json_formatter.py +2 -2
  113. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/models.py +9 -1
  114. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/tasks/__init__.py +1 -0
  115. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/tasks/trigger_oncall.py +7 -9
  116. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/templates/pages/oncall_list.html +7 -7
  117. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/templates/pages/oncall_trigger.html +1 -1
  118. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view.html +3 -3
  119. firefighter_incident-0.0.2/firefighter/pagerduty/templates/partials/trigger_oncall_form_view_modal.html +19 -0
  120. firefighter_incident-0.0.2/firefighter/raid/admin.py +51 -0
  121. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/apps.py +0 -1
  122. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/client.py +12 -7
  123. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/forms.py +5 -17
  124. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/messages.py +6 -90
  125. firefighter_incident-0.0.2/firefighter/raid/migrations/0002_featureteam_remove_qualifierrotation_jira_user_and_more.py +36 -0
  126. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/models.py +28 -46
  127. firefighter_incident-0.0.2/firefighter/raid/resources.py +15 -0
  128. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/service.py +5 -28
  129. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/signals/incident_created.py +2 -13
  130. firefighter_incident-0.0.2/firefighter/raid/tasks/__init__.py +1 -0
  131. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/views/open_normal.py +1 -1
  132. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/admin.py +39 -3
  133. firefighter_incident-0.0.2/firefighter/slack/factories.py +96 -0
  134. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/messages/slack_messages.py +47 -33
  135. firefighter_incident-0.0.2/firefighter/slack/migrations/0002_usergroup_tag.py +22 -0
  136. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/conversation.py +3 -3
  137. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/incident_channel.py +2 -2
  138. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/message.py +4 -4
  139. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/sos.py +2 -2
  140. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/user_group.py +6 -0
  141. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/rules.py +3 -4
  142. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/create_incident_conversation.py +2 -1
  143. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/get_users.py +29 -3
  144. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/incident_updated.py +2 -2
  145. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/slack_app.py +18 -2
  146. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/slack_incident_context.py +8 -8
  147. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/fetch_conversations_members.py +1 -1
  148. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/send_reminders.py +1 -1
  149. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/update_usergroups_members.py +1 -1
  150. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/commands.py +3 -0
  151. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/home.py +22 -20
  152. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/__init__.py +2 -0
  153. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/base.py +2 -2
  154. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/form_utils.py +6 -10
  155. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/mixins.py +1 -2
  156. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/close.py +15 -13
  157. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/downgrade_workflow.py +13 -17
  158. firefighter_incident-0.0.2/firefighter/slack/views/modals/edit.py +117 -0
  159. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/key_event_message.py +9 -9
  160. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/open.py +15 -15
  161. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/check_current_incidents.py +3 -3
  162. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/details/critical.py +7 -5
  163. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/select_impact.py +11 -14
  164. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/set_details.py +4 -2
  165. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/types.py +1 -1
  166. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/postmortem.py +16 -20
  167. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/select.py +1 -1
  168. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/status.py +17 -21
  169. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/trigger_oncall.py +19 -21
  170. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/update.py +5 -0
  171. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/update_status.py +7 -5
  172. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/conftest.py +8 -9
  173. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_api/test_api_urls.py +4 -4
  174. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_firefighter/test_urls.py +12 -12
  175. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_forms/test_form_select_impact.py +3 -3
  176. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_forms/test_form_utils.py +4 -5
  177. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_forms/test_update_key_events.py +3 -3
  178. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_incident_urls.py +10 -10
  179. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_models/test_incident_model.py +1 -1
  180. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_utils/test_date_utils.py +3 -2
  181. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_views/test_incident_detail_view.py +3 -3
  182. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_views/test_index_view.py +6 -6
  183. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_raid/test_raid_client_users.py +12 -12
  184. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/conftest.py +6 -6
  185. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/test_models/test_conversations.py +2 -2
  186. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/test_models/test_incident_channel.py +55 -46
  187. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/test_models/test_slack_user.py +9 -9
  188. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/test_slack_utils.py +6 -6
  189. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/views/modals/test_close.py +7 -7
  190. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/views/modals/test_open.py +6 -6
  191. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/views/modals/test_send_sos.py +2 -2
  192. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/views/modals/test_status.py +2 -2
  193. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_slack/views/modals/test_update_status.py +4 -4
  194. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/manage.py +1 -0
  195. firefighter_incident-0.0.2/package-lock.json +6442 -0
  196. firefighter_incident-0.0.2/package.json +49 -0
  197. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/pyproject.toml +50 -37
  198. firefighter_incident-0.0.2/scripts/gen_credits.py +165 -0
  199. firefighter_incident-0.0.2/scripts/hatch_build.py +15 -0
  200. firefighter_incident-0.0.1rc2/firefighter/components/avatar/avatar.py +0 -20
  201. firefighter_incident-0.0.1rc2/firefighter/components/card/card.py +0 -16
  202. firefighter_incident-0.0.1rc2/firefighter/components/form/form.py +0 -23
  203. firefighter_incident-0.0.1rc2/firefighter/components/form_field/form_field.py +0 -26
  204. firefighter_incident-0.0.1rc2/firefighter/components/messages/messages.html +0 -52
  205. firefighter_incident-0.0.1rc2/firefighter/components/messages/messages.py +0 -16
  206. firefighter_incident-0.0.1rc2/firefighter/components/modal/modal.html +0 -64
  207. firefighter_incident-0.0.1rc2/firefighter/components/modal/modal.py +0 -20
  208. firefighter_incident-0.0.1rc2/firefighter/confluence/templates/oncall_team.xml +0 -6
  209. firefighter_incident-0.0.1rc2/firefighter/incidents/factories.py +0 -92
  210. firefighter_incident-0.0.1rc2/firefighter/incidents/static/css/main.min.css +0 -1
  211. firefighter_incident-0.0.1rc2/firefighter/incidents/static/css/tailwind.css +0 -69
  212. firefighter_incident-0.0.1rc2/firefighter/incidents/static/js/main.min.js +0 -15
  213. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/incidents/widgets/form_container.html +0 -91
  214. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/incidents/widgets/grouped_checkbox_nested.html +0 -97
  215. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/layouts/partials/environment_pill.html +0 -11
  216. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/layouts/partials/header.html +0 -89
  217. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view_modal.html +0 -22
  218. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/layouts/partials/status_pill.html +0 -18
  219. firefighter_incident-0.0.1rc2/firefighter/incidents/templates/pages/docs_metrics.html +0 -84
  220. firefighter_incident-0.0.1rc2/firefighter/pagerduty/templates/partials/trigger_oncall_form_view_modal.html +0 -21
  221. firefighter_incident-0.0.1rc2/firefighter/raid/admin.py +0 -125
  222. firefighter_incident-0.0.1rc2/firefighter/raid/signals/update_qualifiers_rotation.py +0 -97
  223. firefighter_incident-0.0.1rc2/firefighter/raid/tasks/__init__.py +0 -4
  224. firefighter_incident-0.0.1rc2/firefighter/raid/tasks/daily_qualifier.py +0 -67
  225. firefighter_incident-0.0.1rc2/firefighter/raid/tasks/weekly_qualifier.py +0 -63
  226. firefighter_incident-0.0.1rc2/firefighter/slack/factories.py +0 -96
  227. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/.gitignore +0 -0
  228. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/LICENSE +0 -0
  229. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/__init__.py +0 -0
  230. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/__init__.py +0 -0
  231. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/apps.py +0 -0
  232. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/authentication.py +0 -0
  233. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/migrations/0001_initial.py +0 -0
  234. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/migrations/0002_alter_apitokenproxy_options.py +0 -0
  235. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/migrations/__init__.py +0 -0
  236. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/permissions.py +0 -0
  237. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/__init__.py +0 -0
  238. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/_base.py +0 -0
  239. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/components.py +0 -0
  240. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/environments.py +0 -0
  241. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/groups.py +0 -0
  242. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/incident_cost_types.py +0 -0
  243. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/incident_costs.py +0 -0
  244. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/incidents.py +0 -0
  245. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/api/views/severities.py +0 -0
  246. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/__init__.py +0 -0
  247. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/avatar/__init__.py +0 -0
  248. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/avatar/avatar.html +0 -0
  249. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/card/__init__.py +0 -0
  250. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/card/card.html +0 -0
  251. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/export_button/__init__.py +0 -0
  252. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/form/__init__.py +0 -0
  253. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/form_field/__init__.py +0 -0
  254. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/messages/__init__.py +0 -0
  255. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/components/modal/__init__.py +0 -0
  256. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/__init__.py +0 -0
  257. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/admin.py +0 -0
  258. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/apps.py +0 -0
  259. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/client.py +0 -0
  260. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/__init__.py +0 -0
  261. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/commands/__init__.py +0 -0
  262. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/commands/sort_postmortems.py +0 -0
  263. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/commands/sort_runbooks.py +0 -0
  264. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/commands/sync_postmortems.py +0 -0
  265. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/management/commands/sync_runbooks.py +0 -0
  266. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/migrations/0001_initial_oss.py +0 -0
  267. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/migrations/__init__.py +0 -0
  268. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/serializers.py +0 -0
  269. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/signals/__init__.py +0 -0
  270. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/signals/incident_updated.py +0 -0
  271. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tables.py +0 -0
  272. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/__init__.py +0 -0
  273. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/sort_runbooks.py +0 -0
  274. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/tasks/sync_pages_content.py +0 -0
  275. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/urls.py +0 -0
  276. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/__init__.py +0 -0
  277. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/api.py +0 -0
  278. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/postmortem/__init__.py +0 -0
  279. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/postmortem/postmortem_detail.py +0 -0
  280. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/runbook/__init__.py +0 -0
  281. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/confluence/views/runbook/runbook_list.py +0 -0
  282. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/__init__.py +0 -0
  283. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/admin.py +0 -0
  284. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/apps.py +0 -0
  285. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/asgi.py +0 -0
  286. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/celery_client.py +0 -0
  287. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/fields_forms_widgets.py +0 -0
  288. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/formats/__init__.py +0 -0
  289. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/formats/en/__init__.py +0 -0
  290. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/formats/en/formats.py +0 -0
  291. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/management/__init__.py +0 -0
  292. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/management/commands/__init__.py +0 -0
  293. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/middleware.py +0 -0
  294. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/__init__.py +0 -0
  295. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/api.py +0 -0
  296. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/caches.py +0 -0
  297. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/celery.py +0 -0
  298. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/confluence.py +0 -0
  299. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/jira_app.py +0 -0
  300. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/pagerduty.py +0 -0
  301. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/components/slack.py +0 -0
  302. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/environments/__init__.py +0 -0
  303. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/settings_builder.py +0 -0
  304. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/settings/settings_utils.py +0 -0
  305. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/tables_utils.py +0 -0
  306. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/templates/robots.txt +0 -0
  307. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/firefighter/views.py +0 -0
  308. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/__init__.py +0 -0
  309. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/apps.py +0 -0
  310. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/enums.py +0 -0
  311. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/__init__.py +0 -0
  312. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/close_incident.py +0 -0
  313. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/create_incident.py +0 -0
  314. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/select_impact.py +0 -0
  315. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/forms/update_status.py +0 -0
  316. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/migrations/0001_initial_oss.py +0 -0
  317. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/migrations/__init__.py +0 -0
  318. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/__init__.py +0 -0
  319. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/environment.py +0 -0
  320. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident_cost_type.py +0 -0
  321. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/incident_role_type.py +0 -0
  322. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/milestone_type.py +0 -0
  323. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/priority.py +0 -0
  324. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/severity.py +0 -0
  325. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/models/user.py +0 -0
  326. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/css/incident.css +0 -0
  327. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/css/main.css +0 -0
  328. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/android-chrome-192x192.png +0 -0
  329. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/android-chrome-512x512.png +0 -0
  330. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/apple-touch-icon.png +0 -0
  331. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/favicon-16x16.png +0 -0
  332. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/favicon-32x32.png +0 -0
  333. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/favicon.ico +0 -0
  334. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/favicon/site.webmanifest +0 -0
  335. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/gameday.png +0 -0
  336. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/logo-firefighter.png +0 -0
  337. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/p1.png +0 -0
  338. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/p2.png +0 -0
  339. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/p3.png +0 -0
  340. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/p4.png +0 -0
  341. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/img/p5.png +0 -0
  342. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/static/js/main.js +0 -0
  343. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/tasks/__init__.py +0 -0
  344. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/table/status_column.html +0 -0
  345. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/incidents/widgets/input_option.html +0 -0
  346. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/templates/layouts/partials/priority_icon.html +0 -0
  347. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/urls.py +0 -0
  348. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/__init__.py +0 -0
  349. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/components/__init__.py +0 -0
  350. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/components/details.py +0 -0
  351. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/components/list.py +0 -0
  352. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/date_filter.py +0 -0
  353. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/date_utils.py +0 -0
  354. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/docs/__init__.py +0 -0
  355. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/docs/metrics.py +0 -0
  356. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/users/__init__.py +0 -0
  357. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/incidents/views/views.py +0 -0
  358. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/__init__.py +0 -0
  359. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/admin.py +0 -0
  360. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/apps.py +0 -0
  361. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/migrations/0001_initial_oss.py +0 -0
  362. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/migrations/__init__.py +0 -0
  363. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/tasks/__init__.py +0 -0
  364. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/tasks/sync_users_jira.py +0 -0
  365. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/types.py +0 -0
  366. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/jira_app/utils.py +0 -0
  367. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/logging/__init__.py +0 -0
  368. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/logging/pretty_formatter.py +0 -0
  369. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/__init__.py +0 -0
  370. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/admin.py +0 -0
  371. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/apps.py +0 -0
  372. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/client.py +0 -0
  373. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/forms/__init__.py +0 -0
  374. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/forms/create_pagerduty_incident.py +0 -0
  375. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/migrations/0001_initial_oss.py +0 -0
  376. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/migrations/__init__.py +0 -0
  377. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/service.py +0 -0
  378. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/signals/__init__.py +0 -0
  379. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/signals/get_invites_from_pagerduty.py +0 -0
  380. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/signals/incident_channel_done_oncall.py +0 -0
  381. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/tasks/fetch_oncall.py +0 -0
  382. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/tasks/fetch_services.py +0 -0
  383. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/tasks/fetch_users.py +0 -0
  384. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/urls.py +0 -0
  385. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/views/__init__.py +0 -0
  386. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/views/oncall_list.py +0 -0
  387. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/pagerduty/views/oncall_trigger.py +0 -0
  388. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/__init__.py +0 -0
  389. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/migrations/0001_initial_oss.py +0 -0
  390. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/migrations/__init__.py +0 -0
  391. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/serializers.py +0 -0
  392. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/signals/__init__.py +0 -0
  393. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/signals/incident_updated.py +0 -0
  394. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/types.py +0 -0
  395. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/urls.py +0 -0
  396. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/utils.py +0 -0
  397. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/raid/views/__init__.py +0 -0
  398. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/__init__.py +0 -0
  399. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/apps.py +0 -0
  400. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/forms/__init__.py +0 -0
  401. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/forms/sos_form.py +0 -0
  402. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/management/__init__.py +0 -0
  403. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/management/commands/__init__.py +0 -0
  404. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/management/commands/generate_manifest.py +0 -0
  405. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/messages/__init__.py +0 -0
  406. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/messages/base.py +0 -0
  407. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/migrations/0001_initial_oss.py +0 -0
  408. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/migrations/__init__.py +0 -0
  409. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/__init__.py +0 -0
  410. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/models/user.py +0 -0
  411. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/__init__.py +0 -0
  412. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/handle_incident_channel_done.py +0 -0
  413. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/incident_closed.py +0 -0
  414. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/postmortem_created.py +0 -0
  415. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/signals/roles_reminders.py +0 -0
  416. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/slack_templating.py +0 -0
  417. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/__init__.py +0 -0
  418. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/reminder_postmortem.py +0 -0
  419. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/send_message.py +0 -0
  420. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/sync_users.py +0 -0
  421. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/tasks/update_users.py +0 -0
  422. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/urls.py +0 -0
  423. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/utils.py +0 -0
  424. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/__init__.py +0 -0
  425. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/__init__.py +0 -0
  426. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/actions_and_shortcuts.py +0 -0
  427. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_archive.py +0 -0
  428. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_id_changed.py +0 -0
  429. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_rename.py +0 -0
  430. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_shared.py +0 -0
  431. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_unarchive.py +0 -0
  432. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/channel_unshared.py +0 -0
  433. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/member_joined_channel.py +0 -0
  434. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/member_left_channel.py +0 -0
  435. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/message.py +0 -0
  436. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/message_deleted.py +0 -0
  437. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/events/reaction_added.py +0 -0
  438. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/__init__.py +0 -0
  439. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/base_mixins.py +0 -0
  440. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/base_modal/modal_utils.py +0 -0
  441. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/__init__.py +0 -0
  442. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/opening/details/__init__.py +0 -0
  443. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/send_sos.py +0 -0
  444. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/modals/update_roles.py +0 -0
  445. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter/slack/views/views.py +0 -0
  446. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/components.json +0 -0
  447. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/environments.json +0 -0
  448. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/groups.json +0 -0
  449. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/impact_level.json +0 -0
  450. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/impact_type.json +0 -0
  451. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/incident_role_type.json +0 -0
  452. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/metric_type.json +0 -0
  453. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/milestone_type.json +0 -0
  454. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/priorities.json +0 -0
  455. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/incidents/severities.json +0 -0
  456. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_fixtures/raid/area.json +0 -0
  457. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/__init__.py +0 -0
  458. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_api/test_api_landbot.py +0 -0
  459. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_confluence/test_confluence_utils.py +0 -0
  460. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_firefighter/test_firefighter_utils.py +0 -0
  461. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_firefighter/test_logging.py +0 -0
  462. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_incidents/test_models/test_migrations/test_incident_migrations.py +0 -0
  463. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_raid/test_raid_transitions.py +0 -0
  464. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/firefighter_tests/test_raid/test_raid_utils.py +0 -0
  465. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/gunicorn.conf.py +0 -0
  466. {firefighter_incident-0.0.1rc2 → firefighter_incident-0.0.2}/main.py +0 -0
@@ -1,8 +1,10 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: firefighter-incident
3
- Version: 0.0.1rc2
3
+ Version: 0.0.2
4
4
  Summary: Incident Management tool made for Slack using Django
5
- Project-URL: Source, https://github.com/ManoManoTech/firefighter-incident
5
+ Project-URL: Repository, https://github.com/ManoManoTech/firefighter-incident
6
+ Project-URL: Documentation, https://manomanotech.github.io/firefighter-incident/latest/
7
+ Project-URL: Changelog, https://github.com/ManoManoTech/firefighter-incident/releases
6
8
  Author-email: Gabriel Dugny <gabriel.dugny@manomano.com>, SRE <teamsre@manomano.com>
7
9
  License: MIT License
8
10
 
@@ -36,6 +38,7 @@ Classifier: License :: OSI Approved :: MIT License
36
38
  Classifier: Programming Language :: Python :: 3
37
39
  Classifier: Programming Language :: Python :: 3 :: Only
38
40
  Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
39
42
  Classifier: Typing :: Typed
40
43
  Requires-Python: <4.0,>=3.11
41
44
  Requires-Dist: aiohttp>=3.9.1
@@ -43,13 +46,14 @@ Requires-Dist: celery[gevent,redis]>=5.3.6
43
46
  Requires-Dist: dateparser>=1.2.0
44
47
  Requires-Dist: ddtrace<2.4.0,>=2.3.3
45
48
  Requires-Dist: django-celery-beat>=2.5.0
46
- Requires-Dist: django-components>=0.29
49
+ Requires-Dist: django-components>=0.101
47
50
  Requires-Dist: django-filter>=23.4
48
51
  Requires-Dist: django-htmx>=1.17.2
52
+ Requires-Dist: django-import-export>=4.0.0
49
53
  Requires-Dist: django-oauth2-authcodeflow>=1.0.1
50
54
  Requires-Dist: django-redis>=5.4.0
51
55
  Requires-Dist: django-simple-menu>=2.1.3
52
- Requires-Dist: django-stubs-ext>=4.2.5
56
+ Requires-Dist: django-stubs-ext~=5.1.1
53
57
  Requires-Dist: django-tables2>=2.6.0
54
58
  Requires-Dist: django-taggit>=5.0.1
55
59
  Requires-Dist: django-widget-tweaks>=1.5.0
@@ -61,8 +65,7 @@ Requires-Dist: drf-spectacular>=0.26.5
61
65
  Requires-Dist: drf-standardized-errors>=0.12.6
62
66
  Requires-Dist: gunicorn>=21.2.0
63
67
  Requires-Dist: httpx>=0.25.2
64
- Requires-Dist: jinja2<4.0.0,>=3.1.2
65
- Requires-Dist: jira>=3.5.2
68
+ Requires-Dist: jira<3.6.0,>=3.5.2
66
69
  Requires-Dist: markdown>=3.5.1
67
70
  Requires-Dist: nh3>=0.2.15
68
71
  Requires-Dist: pdpyras>=5.1.3
@@ -78,12 +81,14 @@ Description-Content-Type: text/markdown
78
81
 
79
82
  # FireFighter
80
83
 
81
- [![PyPI - Version](https://img.shields.io/pypi/v/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - License](https://img.shields.io/pypi/l/firefighter-incident)](https://manomanotech.github.io/firefighter-incident/latest/license/) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8170/badge)](https://www.bestpractices.dev/projects/8170) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
84
+ [![PyPI - Version](https://img.shields.io/pypi/v/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - License](https://img.shields.io/pypi/l/firefighter-incident)](https://manomanotech.github.io/firefighter-incident/latest/license/) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8170/badge)](https://www.bestpractices.dev/projects/8170) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
82
85
 
83
86
  FireFighter is ManoMano's in-house Incident Management Tool.
84
87
 
85
88
  It helps manage incidents, by automatically creating a Slack channel for communication, and much more.
86
89
 
90
+ ![Slack Bot Commands](docs/assets/screenshots/slack_bot_home.jpeg)
91
+
87
92
  __What's Incident Management?__
88
93
 
89
94
  Incident Management is a set of processes and tools to help teams detect, respond to, and resolve incidents quickly and effectively.
@@ -1,11 +1,13 @@
1
1
  # FireFighter
2
2
 
3
- [![PyPI - Version](https://img.shields.io/pypi/v/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - License](https://img.shields.io/pypi/l/firefighter-incident)](https://manomanotech.github.io/firefighter-incident/latest/license/) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8170/badge)](https://www.bestpractices.dev/projects/8170) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
3
+ [![PyPI - Version](https://img.shields.io/pypi/v/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/firefighter-incident)](https://pypi.org/project/firefighter-incident/) [![PyPI - License](https://img.shields.io/pypi/l/firefighter-incident)](https://manomanotech.github.io/firefighter-incident/latest/license/) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8170/badge)](https://www.bestpractices.dev/projects/8170) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
4
4
 
5
5
  FireFighter is ManoMano's in-house Incident Management Tool.
6
6
 
7
7
  It helps manage incidents, by automatically creating a Slack channel for communication, and much more.
8
8
 
9
+ ![Slack Bot Commands](docs/assets/screenshots/slack_bot_home.jpeg)
10
+
9
11
  __What's Incident Management?__
10
12
 
11
13
  Incident Management is a set of processes and tools to help teams detect, respond to, and resolve incidents quickly and effectively.
@@ -1,8 +1,13 @@
1
- # file generated by setuptools_scm
1
+ # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
3
6
  TYPE_CHECKING = False
4
7
  if TYPE_CHECKING:
5
- from typing import Tuple, Union
8
+ from typing import Tuple
9
+ from typing import Union
10
+
6
11
  VERSION_TUPLE = Tuple[Union[int, str], ...]
7
12
  else:
8
13
  VERSION_TUPLE = object
@@ -12,5 +17,5 @@ __version__: str
12
17
  __version_tuple__: VERSION_TUPLE
13
18
  version_tuple: VERSION_TUPLE
14
19
 
15
- __version__ = version = '0.0.1rc2'
16
- __version_tuple__ = version_tuple = (0, 0, 1)
20
+ __version__ = version = '0.0.2'
21
+ __version_tuple__ = version_tuple = (0, 0, 2)
@@ -29,7 +29,12 @@ class APITokenAdmin(TokenAdmin):
29
29
  Add supports for custom permissions.
30
30
  """
31
31
 
32
- def formfield_for_foreignkey(self, db_field: ForeignKey[Any, Any], request: HttpRequest, **kwargs: Any) -> ModelChoiceField: # type: ignore[override]
32
+ def formfield_for_foreignkey(
33
+ self,
34
+ db_field: ForeignKey[Any, Any],
35
+ request: HttpRequest, # type: ignore[override]
36
+ **kwargs: Any,
37
+ ) -> ModelChoiceField: # type: ignore[type-arg]
33
38
  """Show all or only current user depending on permissions."""
34
39
  if db_field.name == "user":
35
40
  if request.user.has_perm("api.can_add_any") or request.user.has_perm(
@@ -38,9 +43,15 @@ class APITokenAdmin(TokenAdmin):
38
43
  kwargs["queryset"] = User.objects.all()
39
44
  elif request.user.has_perm("api.can_add_own"):
40
45
  kwargs["queryset"] = User.objects.filter(id=request.user.id)
41
- return super().formfield_for_foreignkey(db_field, request, **kwargs)
42
-
43
- def get_form(self, request: HttpRequest, obj: APITokenProxy | None = None, change: bool = False, **kwargs: Any) -> type[ModelForm[APITokenProxy]]: # type: ignore[override] # noqa: FBT001, FBT002
46
+ return super().formfield_for_foreignkey(db_field, request, **kwargs) # type: ignore[return-value]
47
+
48
+ def get_form(
49
+ self,
50
+ request: HttpRequest, # type: ignore[override]
51
+ obj: APITokenProxy | None = None,
52
+ change: bool = False, # noqa: FBT001, FBT002
53
+ **kwargs: Any,
54
+ ) -> type[ModelForm[APITokenProxy]]:
44
55
  """Prefill the form with the current user."""
45
56
  form: type[ModelForm[APITokenProxy]] = super().get_form(
46
57
  request, obj, change, **kwargs
@@ -65,7 +76,11 @@ class APITokenAdmin(TokenAdmin):
65
76
  )
66
77
  return super().get_sortable_by(request)
67
78
 
68
- def has_view_permission(self, request: HttpRequest, obj: APITokenProxy | None = None) -> bool: # type: ignore[override]
79
+ def has_view_permission(
80
+ self,
81
+ request: HttpRequest, # type: ignore[override]
82
+ obj: APITokenProxy | None = None,
83
+ ) -> bool:
69
84
  if obj is None:
70
85
  return request.user.has_perm("api.can_view_any") or request.user.has_perm(
71
86
  "api.can_view_own"
@@ -81,7 +96,11 @@ class APITokenAdmin(TokenAdmin):
81
96
  "api.can_add_own"
82
97
  )
83
98
 
84
- def has_delete_permission(self, request: HttpRequest, obj: APITokenProxy | None = None) -> bool: # type: ignore[override]
99
+ def has_delete_permission(
100
+ self,
101
+ request: HttpRequest, # type: ignore[override]
102
+ obj: APITokenProxy | None = None,
103
+ ) -> bool:
85
104
  if obj is None:
86
105
  return request.user.has_perm("api.can_delete_any") or request.user.has_perm(
87
106
  "api.can_delete_own"
@@ -92,12 +111,12 @@ class APITokenAdmin(TokenAdmin):
92
111
  return bool(obj.user == request.user)
93
112
  return False
94
113
 
95
- def has_change_permission(self, request: HttpRequest, obj: APITokenProxy | None = None) -> bool: # type: ignore[override]
96
- if obj is None:
97
- return request.user.has_perm("api.can_edit_any")
98
- if request.user.has_perm("api.can_edit_any"):
99
- return True
100
- return False
114
+ def has_change_permission(
115
+ self,
116
+ request: HttpRequest, # type: ignore[override]
117
+ _obj: APITokenProxy | None = None,
118
+ ) -> bool:
119
+ return request.user.has_perm("api.can_edit_any")
101
120
 
102
121
 
103
122
  # Remove the default TokenAdmin created by DRF and replace it with our custom one.
@@ -0,0 +1,30 @@
1
+ # Generated by Django 4.2.11 on 2024-04-30 15:39
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("api", "0002_alter_apitokenproxy_options"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name="apitokenproxy",
15
+ options={
16
+ "default_permissions": [],
17
+ "permissions": [
18
+ ("can_edit_any", "Can reassign token to any user"),
19
+ ("can_add_any", "Can add token to any user"),
20
+ ("can_view_any", "Can view token of all users"),
21
+ ("can_delete_any", "Can delete token of any user"),
22
+ ("can_add_own", "Can add own tokens"),
23
+ ("can_view_own", "Can view own tokens"),
24
+ ("can_delete_own", "Can delete own tokens"),
25
+ ],
26
+ "verbose_name": "API Token",
27
+ "verbose_name_plural": "API Tokens",
28
+ },
29
+ ),
30
+ ]
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import uuid
4
3
  from typing import TYPE_CHECKING, ClassVar, Self, cast
5
4
 
6
5
  from django.conf import settings
@@ -9,6 +8,7 @@ from django_stubs_ext.db.models import TypedModelMeta
9
8
  from rest_framework.authtoken.models import Token
10
9
 
11
10
  if TYPE_CHECKING:
11
+ import uuid
12
12
  from collections.abc import Sequence
13
13
 
14
14
 
@@ -26,7 +26,7 @@ class APITokenProxy(APIToken):
26
26
 
27
27
  @property
28
28
  def pk(self: Self) -> uuid.UUID:
29
- return cast(uuid.UUID, self.user_id) # pyright: ignore[reportGeneralTypeIssues]
29
+ return cast("uuid.UUID", self.user_id) # pyright: ignore[reportGeneralTypeIssues]
30
30
 
31
31
  class Meta(TypedModelMeta):
32
32
  permissions = [
@@ -71,7 +71,7 @@ class CSVRenderer(BaseCSVRenderer):
71
71
  pass
72
72
 
73
73
  def _get_headers(
74
- self, data: Iterable[Any], header: None | list[str]
74
+ self, data: Iterable[Any], header: list[str] | None
75
75
  ) -> tuple[Iterable[Any], list[str]]:
76
76
  # If we already have a header, and it does not contain any wildcards,
77
77
  # we can use it as-is.
@@ -72,11 +72,13 @@ class GroupedModelSerializerOpenAPI(OpenApiSerializerExtension): # type: ignore
72
72
  child_schema = auto_schema.resolve_serializer(
73
73
  self.target.child_serializer, direction
74
74
  )
75
- child_schema_ref = child_schema.ref if child_schema.ref else child_schema
75
+ child_schema_ref = child_schema.ref or child_schema
76
76
  return {"type": "object", "additionalProperties": child_schema_ref}
77
77
 
78
78
  def get_name(
79
- self, auto_schema: AutoSchema, direction: Direction # noqa: ARG002
79
+ self,
80
+ auto_schema: AutoSchema, # noqa: ARG002
81
+ direction: Direction, # noqa: ARG002
80
82
  ) -> str:
81
83
  return f"GroupedModelSerializer_{self.target.child_serializer.__name__}"
82
84
 
@@ -217,12 +219,12 @@ class IncidentSerializer(TaggitSerializer, serializers.ModelSerializer[Incident]
217
219
  created_by = UserSerializer(read_only=True)
218
220
  slack_channel_name = serializers.SerializerMethodField()
219
221
 
220
- created_by_email = CreatableSlugRelatedField[User]( # type: ignore[misc]
222
+ created_by_email = CreatableSlugRelatedField[User](
221
223
  source="created_by",
222
224
  write_only=True,
223
225
  slug_field="email",
224
226
  queryset=User.objects.all(),
225
- validators=[EmailValidator()],
227
+ validators=[EmailValidator()], # type: ignore[list-item]
226
228
  )
227
229
 
228
230
  tags = TagListSerializerField(read_only=True)
@@ -54,26 +54,20 @@ urlpatterns: list[URLPattern | URLResolver] = [
54
54
  path("", include(router.urls)),
55
55
  path(
56
56
  "incidents",
57
- views.incidents.CreateIncidentViewSet.as_view(
58
- {"post": "create"}
59
- ), # pyright: ignore[reportGeneralTypeIssues]
57
+ views.incidents.CreateIncidentViewSet.as_view({"post": "create"}), # pyright: ignore[reportGeneralTypeIssues]
60
58
  name="incidents",
61
59
  ),
62
60
  ]
63
61
  if settings.FF_EXPOSE_API_DOCS:
64
- urlpatterns.extend(
65
- (
66
- path(
67
- "schema",
68
- SpectacularAPIView.as_view(), # pyright: ignore[reportGeneralTypeIssues]
69
- name="schema",
70
- ),
71
- path(
72
- "schema/swagger-ui",
73
- SpectacularSwaggerView.as_view(
74
- url_name="api:schema"
75
- ), # pyright: ignore[reportGeneralTypeIssues]
76
- name="swagger-ui",
77
- ),
78
- )
79
- )
62
+ urlpatterns.extend((
63
+ path(
64
+ "schema",
65
+ SpectacularAPIView.as_view(), # pyright: ignore[reportGeneralTypeIssues]
66
+ name="schema",
67
+ ),
68
+ path(
69
+ "schema/swagger-ui",
70
+ SpectacularSwaggerView.as_view(url_name="api:schema"), # pyright: ignore[reportGeneralTypeIssues]
71
+ name="swagger-ui",
72
+ ),
73
+ ))
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import Any, NotRequired, Required, TypedDict
5
+
6
+ from django_components import EmptyTuple, component
7
+
8
+ from firefighter.incidents.models.user import User
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class Data(TypedDict):
14
+ user: User
15
+ size_tailwind: int
16
+ size_px: int
17
+
18
+
19
+ Args = tuple[User]
20
+
21
+
22
+ class Kwargs(TypedDict, total=False):
23
+ user: Required[User]
24
+ size: NotRequired[str]
25
+
26
+
27
+ @component.register("avatar")
28
+ class Avatar(component.Component[EmptyTuple, Kwargs, Data, Any]): # type: ignore[type-var]
29
+ template_name = "avatar/avatar.html"
30
+
31
+ def get_context_data(self, user: User, **kwargs: Any) -> Data:
32
+ size_px, size_tailwind = (40, 10) if kwargs.get("size") == "md" else (80, 20)
33
+ return {
34
+ "user": user,
35
+ "size_tailwind": size_tailwind,
36
+ "size_px": size_px,
37
+ }
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import Any, NotRequired, Required, TypedDict, Unpack
5
+
6
+ from django_components import EmptyTuple, component
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ class Data(TypedDict, total=False):
12
+ id: Required[str]
13
+ card_title: NotRequired[str]
14
+
15
+
16
+ @component.register("card")
17
+ class Card(component.Component[EmptyTuple, Data, Data, Any]): # type: ignore[type-var]
18
+ template_name = "card/card.html"
19
+
20
+ def get_context_data(self, *args: Any, **kwargs: Unpack[Data]) -> Data:
21
+ return kwargs
@@ -24,8 +24,8 @@
24
24
  {% for format in formats %}
25
25
  <li>
26
26
  <button method="get" formtarget="_blank" type="submit"
27
- name="fields" value="{{format.fields}}"
28
- form="main-filter" formaction="{{format.url}}" class="" role="menuitem" tabindex="-1">{{format.label}}</button>
27
+ name="fields" value="{{format.fields}}"
28
+ form="main-filter" formaction="{{format.url}}" class="" role="menuitem" tabindex="-1">{{format.label}}</button>
29
29
  </li>
30
30
  {% endfor %}
31
31
  </ul>
@@ -1,22 +1,41 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any
3
+ from collections.abc import Mapping, Sequence
4
+ from typing import Any, NotRequired, Required, TypedDict
4
5
 
5
6
  from django.urls import reverse
6
- from django_components import component
7
+ from django_components import EmptyTuple, component
8
+
9
+
10
+ class _Format(TypedDict):
11
+ label: str
12
+ url: str
13
+ fields: str
14
+
15
+
16
+ class Data(TypedDict):
17
+ default_format: Mapping[str, Any] # _Format
18
+ formats: Sequence[Mapping[str, Any]] # list[_Format]
19
+
20
+
21
+ Args = tuple[str]
22
+
23
+
24
+ class Kwargs(TypedDict, total=False):
25
+ base_url: Required[str]
26
+ default_fmt: NotRequired[tuple[str, str | None, str | None]]
7
27
 
8
28
 
9
29
  @component.register("export_button")
10
- class ExportButton(component.Component):
30
+ class ExportButton(component.Component[EmptyTuple, Kwargs, Data, Any]): # type: ignore[type-var]
11
31
  template_name = "export_button/export_button.html"
12
32
 
13
33
  def get_context_data(
14
34
  self,
15
35
  base_url: str,
16
- *args: Any,
17
36
  default_fmt: tuple[str, str | None, str | None] | None = None,
18
37
  **kwargs: Any,
19
- ) -> dict[str, Any]:
38
+ ) -> Data:
20
39
  default_fmt = default_fmt or ("csv", None, None)
21
40
  fmts: list[tuple[str, str | None, str | None]] = [
22
41
  ("json", None, None),
@@ -28,12 +47,12 @@ class ExportButton(component.Component):
28
47
  default_format = self.make_fmt(default_fmt, base_url)
29
48
  formats = [self.make_fmt(fmt, base_url) for fmt in fmts]
30
49
 
31
- return {"default_format": default_format, "formats": formats}
50
+ return Data(default_format=default_format, formats=formats)
32
51
 
33
52
  @staticmethod
34
53
  def make_fmt(
35
54
  format_: tuple[str, str | None, str | None], base_reverse: str
36
- ) -> dict[str, str]:
55
+ ) -> _Format:
37
56
  return {
38
57
  "label": f"Export {format_[0].upper()}{' ' + format_[2] if format_[2] else ''}",
39
58
  "url": f"{reverse(base_reverse, args=[format_[0]])}",
@@ -5,7 +5,7 @@
5
5
 
6
6
  <div class="grid grid-cols-6 gap-1">
7
7
  {% for field in form %}
8
- {% component "form_field" field=field%}
8
+ {% component "form_field" field=field%}{% endcomponent %}
9
9
  {% endfor %}
10
10
  </div>
11
11
 
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import Any, NotRequired, TypedDict
5
+
6
+ from django import forms
7
+ from django_components import EmptyTuple, component
8
+ from django_components.slots import SlotContent
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class Slots(TypedDict, total=False):
14
+ form_footer: NotRequired[SlotContent[Any]]
15
+
16
+
17
+ class Data(TypedDict):
18
+ form: forms.Form
19
+
20
+
21
+ @component.register("form")
22
+ class Form(component.Component[EmptyTuple, Data, Data, Slots]): # type: ignore[type-var] # type: ignore[override]
23
+ template_name = "form/form.html"
24
+
25
+ def get_context_data(self, form: forms.Form, **kwargs: Any) -> Data: # type: ignore[override]
26
+ return Data(form=form)
@@ -10,9 +10,9 @@
10
10
 
11
11
  {% render_field field class=field_input_class class+="input input-bordered w-full" %}
12
12
  {% if field.help_text %}
13
- <label class="label">
14
- <span class="label-text-alt">{{field.help_text}}</span>
15
- </label>
16
- {% endif %}
13
+ <label class="label">
14
+ <span class="label-text-alt">{{field.help_text}}</span>
15
+ </label>
16
+ {% endif %}
17
17
  </div>
18
18
  </div>
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import (
5
+ Any,
6
+ Never,
7
+ TypedDict,
8
+ )
9
+
10
+ from django import forms
11
+ from django_components import EmptyTuple, component
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class Data(TypedDict):
17
+ field: forms.Field | forms.BoundField
18
+ field_input_class: str
19
+
20
+
21
+ class Kwargs(TypedDict, total=True):
22
+ field: forms.Field | forms.BoundField
23
+
24
+
25
+ @component.register("form_field")
26
+ class FormField(component.Component[EmptyTuple, Kwargs, Data, Any]): # type: ignore[type-var]
27
+ template_name = "form_field/form_field.html"
28
+
29
+ def get_context_data(
30
+ self, field: forms.BoundField | forms.Field, **kwargs: Never
31
+ ) -> Data:
32
+ input_class = "input input-bordered input-md"
33
+
34
+ return {"field": field, "field_input_class": input_class}
@@ -0,0 +1,42 @@
1
+ {% if messages %}
2
+ <ul class="messages">
3
+ {% for message in messages %}
4
+ {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}
5
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
6
+ <div class="alert alert-error shadow-lg">
7
+ <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
8
+ <span> {{ message }}</span>
9
+ </div>
10
+ </li>
11
+ {% elif message.level == DEFAULT_MESSAGE_LEVELS.INFO %}
12
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
13
+ <div class="alert alert-info shadow-lg">
14
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-current flex-shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
15
+ <span> {{ message }}</span>
16
+ </div>
17
+ </li>
18
+ {% elif message.level == DEFAULT_MESSAGE_LEVELS.SUCCESS %}
19
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
20
+ <div class="alert alert-success shadow-lg">
21
+ <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
22
+ <span> {{ message }}</span>
23
+ </div>
24
+ </li>
25
+ {% elif message.level == DEFAULT_MESSAGE_LEVELS.WARNING %}
26
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
27
+ <div class="alert alert-warning shadow-lg">
28
+ <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>
29
+ <span> {{ message }}</span>
30
+ </div>
31
+ </li>
32
+ {% else %}
33
+ <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
34
+ <div class="alert shadow-lg">
35
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-info flex-shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
36
+ <span> {{ message }}</span>
37
+ </div>
38
+ </li>
39
+ {% endif %}
40
+ {% endfor %}
41
+ </ul>
42
+ {% endif %}
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import Any, TypedDict
5
+
6
+ from django.contrib.messages.storage.base import BaseStorage
7
+ from django_components import EmptyTuple, component
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class Data(TypedDict):
13
+ messages: BaseStorage
14
+
15
+
16
+ @component.register("messages")
17
+ class Messages(component.Component[EmptyTuple, Data, Data, Any]): # type: ignore[type-var]
18
+ template_name = "messages/messages.html"
19
+
20
+ def get_context_data(self, messages: BaseStorage, **kwargs: Any) -> Data:
21
+ return Data(messages=messages)