firefighter-incident 0.0.18__tar.gz → 0.0.20__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 (506) hide show
  1. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/PKG-INFO +1 -1
  2. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/_version.py +2 -2
  3. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/select_impact.py +1 -1
  4. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/client.py +17 -7
  5. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/client.py +2 -0
  6. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/forms.py +6 -2
  7. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/views/__init__.py +1 -0
  8. firefighter_incident-0.0.20/firefighter_tests/test_jira_app/__init__.py +1 -0
  9. firefighter_incident-0.0.20/firefighter_tests/test_jira_app/conftest.py +24 -0
  10. firefighter_incident-0.0.20/firefighter_tests/test_jira_app/test_jira_client_watchers.py +135 -0
  11. firefighter_incident-0.0.20/firefighter_tests/test_raid/test_raid_alert_p4_p5.py +255 -0
  12. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_client.py +32 -0
  13. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_forms.py +61 -3
  14. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_serializers.py +47 -0
  15. firefighter_incident-0.0.20/firefighter_tests/test_raid/test_zendesk_integration.py +198 -0
  16. firefighter_incident-0.0.20/firefighter_tests/test_slack/test_conversation_tags.py +344 -0
  17. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_update_status.py +7 -9
  18. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/.gitignore +0 -0
  19. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/LICENSE +0 -0
  20. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/README.md +0 -0
  21. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/__init__.py +0 -0
  22. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/__init__.py +0 -0
  23. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/admin.py +0 -0
  24. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/apps.py +0 -0
  25. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/authentication.py +0 -0
  26. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/migrations/0001_initial.py +0 -0
  27. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/migrations/0002_alter_apitokenproxy_options.py +0 -0
  28. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/migrations/0003_alter_apitokenproxy_options.py +0 -0
  29. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/migrations/__init__.py +0 -0
  30. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/models.py +0 -0
  31. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/permissions.py +0 -0
  32. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/renderer.py +0 -0
  33. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/serializers.py +0 -0
  34. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/urls.py +0 -0
  35. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/__init__.py +0 -0
  36. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/_base.py +0 -0
  37. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/components.py +0 -0
  38. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/environments.py +0 -0
  39. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/groups.py +0 -0
  40. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/incident_cost_types.py +0 -0
  41. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/incident_costs.py +0 -0
  42. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/incidents.py +0 -0
  43. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/api/views/severities.py +0 -0
  44. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/__init__.py +0 -0
  45. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/avatar/__init__.py +0 -0
  46. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/avatar/avatar.html +0 -0
  47. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/avatar/avatar.py +0 -0
  48. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/card/__init__.py +0 -0
  49. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/card/card.html +0 -0
  50. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/card/card.py +0 -0
  51. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/export_button/__init__.py +0 -0
  52. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/export_button/export_button.html +0 -0
  53. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/export_button/export_button.py +0 -0
  54. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form/__init__.py +0 -0
  55. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form/form.html +0 -0
  56. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form/form.py +0 -0
  57. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form_field/__init__.py +0 -0
  58. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form_field/form_field.html +0 -0
  59. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/form_field/form_field.py +0 -0
  60. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/messages/__init__.py +0 -0
  61. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/messages/messages.html +0 -0
  62. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/messages/messages.py +0 -0
  63. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/modal/__init__.py +0 -0
  64. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/modal/modal.html +0 -0
  65. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/components/modal/modal.py +0 -0
  66. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/__init__.py +0 -0
  67. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/admin.py +0 -0
  68. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/apps.py +0 -0
  69. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/client.py +0 -0
  70. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/__init__.py +0 -0
  71. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/commands/__init__.py +0 -0
  72. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/commands/sort_postmortems.py +0 -0
  73. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/commands/sort_runbooks.py +0 -0
  74. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/commands/sync_postmortems.py +0 -0
  75. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/management/commands/sync_runbooks.py +0 -0
  76. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/migrations/0001_initial_oss.py +0 -0
  77. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/migrations/__init__.py +0 -0
  78. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/models.py +0 -0
  79. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/serializers.py +0 -0
  80. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/service.py +0 -0
  81. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/signals/__init__.py +0 -0
  82. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/signals/incident_updated.py +0 -0
  83. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tables.py +0 -0
  84. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/__init__.py +0 -0
  85. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/archive_postmortems.py +0 -0
  86. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/sort_runbooks.py +0 -0
  87. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/sync_pages_content.py +0 -0
  88. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/sync_postmortems.py +0 -0
  89. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/tasks/sync_runbooks.py +0 -0
  90. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/templates/oncall_team.xml +0 -0
  91. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/templates/pages/runbook_list.html +0 -0
  92. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/urls.py +0 -0
  93. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/utils.py +0 -0
  94. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/__init__.py +0 -0
  95. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/api.py +0 -0
  96. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/postmortem/__init__.py +0 -0
  97. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/postmortem/postmortem_detail.py +0 -0
  98. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/runbook/__init__.py +0 -0
  99. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/confluence/views/runbook/runbook_list.py +0 -0
  100. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/__init__.py +0 -0
  101. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/admin.py +0 -0
  102. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/apps.py +0 -0
  103. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/asgi.py +0 -0
  104. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/celery_client.py +0 -0
  105. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/fields_forms_widgets.py +0 -0
  106. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/filters.py +0 -0
  107. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/formats/__init__.py +0 -0
  108. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/formats/en/__init__.py +0 -0
  109. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/formats/en/formats.py +0 -0
  110. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/http_client.py +0 -0
  111. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/management/__init__.py +0 -0
  112. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/management/commands/__init__.py +0 -0
  113. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/management/commands/task.py +0 -0
  114. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/middleware.py +0 -0
  115. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/__init__.py +0 -0
  116. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/__init__.py +0 -0
  117. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/api.py +0 -0
  118. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/caches.py +0 -0
  119. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/celery.py +0 -0
  120. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/common.py +0 -0
  121. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/confluence.py +0 -0
  122. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/jira_app.py +0 -0
  123. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/logging.py +0 -0
  124. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/pagerduty.py +0 -0
  125. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/raid.py +0 -0
  126. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/components/slack.py +0 -0
  127. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/environments/__init__.py +0 -0
  128. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/environments/dev.py +0 -0
  129. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/environments/prod.py +0 -0
  130. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/settings_builder.py +0 -0
  131. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/settings/settings_utils.py +0 -0
  132. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/sso.py +0 -0
  133. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/tables_utils.py +0 -0
  134. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/templates/admin/base.html +0 -0
  135. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/templates/admin/login.html +0 -0
  136. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/templates/admin/send_message_conversation.html +0 -0
  137. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/templates/robots.txt +0 -0
  138. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/urls.py +0 -0
  139. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/utils.py +0 -0
  140. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/views.py +0 -0
  141. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/firefighter/wsgi.py +0 -0
  142. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/__init__.py +0 -0
  143. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/admin.py +0 -0
  144. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/apps.py +0 -0
  145. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/enums.py +0 -0
  146. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/factories.py +0 -0
  147. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/__init__.py +0 -0
  148. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/close_incident.py +0 -0
  149. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/closure_reason.py +0 -0
  150. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/create_incident.py +0 -0
  151. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/edit.py +0 -0
  152. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/unified_incident.py +0 -0
  153. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/update_key_events.py +0 -0
  154. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/update_roles.py +0 -0
  155. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/update_status.py +0 -0
  156. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/forms/utils.py +0 -0
  157. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/menus.py +0 -0
  158. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0001_initial_oss.py +0 -0
  159. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0002_alter_severity_name_alter_user_password_featureteam.py +0 -0
  160. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0003_delete_featureteam.py +0 -0
  161. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0004_incidentupdate_environment.py +0 -0
  162. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0005_enable_from_p1_to_p5_priority.py +0 -0
  163. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0006_update_group_names.py +0 -0
  164. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0007_update_component_name.py +0 -0
  165. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0008_impact_level.py +0 -0
  166. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0009_update_sla.py +0 -0
  167. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0010_update_components.py +0 -0
  168. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0011_update_incidents.py +0 -0
  169. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0012_alter_impactlevel.py +0 -0
  170. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0013_add_missing_component.py +0 -0
  171. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0014_update_components_slack_groups.py +0 -0
  172. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0015_update_impact_level.py +0 -0
  173. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0016_update_business_incidents_and_level.py +0 -0
  174. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0017_reorder_impact_types.py +0 -0
  175. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0018_update_impactlevel_names.py +0 -0
  176. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0019_set_security_components_private.py +0 -0
  177. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0020_create_incident_category_model.py +0 -0
  178. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0021_copy_component_data_to_incident_category.py +0 -0
  179. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0022_add_incident_category_fields.py +0 -0
  180. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0023_populate_incident_category_references.py +0 -0
  181. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0024_remove_component_fields_and_model.py +0 -0
  182. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0025_make_incident_category_required.py +0 -0
  183. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0026_alter_incidentcategory_options_and_more.py +0 -0
  184. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0027_add_closure_fields.py +0 -0
  185. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0028_add_closure_reason_constraint.py +0 -0
  186. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/0029_add_custom_fields_to_incident.py +0 -0
  187. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/migrations/__init__.py +0 -0
  188. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/__init__.py +0 -0
  189. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/environment.py +0 -0
  190. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/group.py +0 -0
  191. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/impact.py +0 -0
  192. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident.py +0 -0
  193. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_category.py +0 -0
  194. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_cost.py +0 -0
  195. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_cost_type.py +0 -0
  196. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_membership.py +0 -0
  197. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_role_type.py +0 -0
  198. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/incident_update.py +0 -0
  199. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/metric_type.py +0 -0
  200. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/milestone_type.py +0 -0
  201. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/priority.py +0 -0
  202. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/severity.py +0 -0
  203. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/models/user.py +0 -0
  204. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/signals.py +0 -0
  205. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/css/incident.css +0 -0
  206. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/css/main.css +0 -0
  207. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/css/main.min.css +0 -0
  208. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/css/tailwind.css +0 -0
  209. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/android-chrome-192x192.png +0 -0
  210. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/android-chrome-512x512.png +0 -0
  211. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/apple-touch-icon.png +0 -0
  212. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/favicon-16x16.png +0 -0
  213. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/favicon-32x32.png +0 -0
  214. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/favicon.ico +0 -0
  215. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/favicon/site.webmanifest +0 -0
  216. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/gameday.png +0 -0
  217. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/logo-firefighter.png +0 -0
  218. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/p1.png +0 -0
  219. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/p2.png +0 -0
  220. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/p3.png +0 -0
  221. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/p4.png +0 -0
  222. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/img/p5.png +0 -0
  223. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/js/main.js +0 -0
  224. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/static/js/main.min.js +0 -0
  225. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/tables.py +0 -0
  226. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/tasks/__init__.py +0 -0
  227. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/tasks/updateoncall.py +0 -0
  228. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/errors/base.html +0 -0
  229. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/filter.html +0 -0
  230. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/table/priority_column.html +0 -0
  231. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/table/status_column.html +0 -0
  232. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/table.html +0 -0
  233. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/widgets/form_container.html +0 -0
  234. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/widgets/grouped_checkbox_nested.html +0 -0
  235. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/incidents/widgets/input_option.html +0 -0
  236. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/index.html +0 -0
  237. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/created_at_help.html +0 -0
  238. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/environment_pill.html +0 -0
  239. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/footer.html +0 -0
  240. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/header.html +0 -0
  241. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/incident_card.html +0 -0
  242. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/incident_metrics.html +0 -0
  243. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/incident_timeline.html +0 -0
  244. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view.html +0 -0
  245. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/incident_update_key_events_view_modal.html +0 -0
  246. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/partial_table_list_paginated.html +0 -0
  247. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/priority_icon.html +0 -0
  248. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/priority_pill.html +0 -0
  249. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/status_pill.html +0 -0
  250. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/table.html +0 -0
  251. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/user_card.html +0 -0
  252. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/partials/user_tooltip.html +0 -0
  253. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/layouts/view_filters.html +0 -0
  254. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/dashboard.html +0 -0
  255. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/docs_metrics.html +0 -0
  256. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_category_detail.html +0 -0
  257. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_category_list.html +0 -0
  258. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_create.html +0 -0
  259. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_detail.html +0 -0
  260. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_list.html +0 -0
  261. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_role_types_detail.html +0 -0
  262. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_role_types_list.html +0 -0
  263. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_statistics.html +0 -0
  264. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_statistics_partial.html +0 -0
  265. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/incident_update_key_events_form.html +0 -0
  266. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/templates/pages/user_detail.html +0 -0
  267. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/urls.py +0 -0
  268. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/__init__.py +0 -0
  269. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/components/__init__.py +0 -0
  270. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/components/details.py +0 -0
  271. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/components/list.py +0 -0
  272. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/date_filter.py +0 -0
  273. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/date_utils.py +0 -0
  274. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/docs/__init__.py +0 -0
  275. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/docs/metrics.py +0 -0
  276. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/docs/role_types.py +0 -0
  277. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/errors.py +0 -0
  278. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/reports.py +0 -0
  279. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/users/__init__.py +0 -0
  280. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/users/details.py +0 -0
  281. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/incidents/views/views.py +0 -0
  282. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/__init__.py +0 -0
  283. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/admin.py +0 -0
  284. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/apps.py +0 -0
  285. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/migrations/0001_initial_oss.py +0 -0
  286. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/migrations/__init__.py +0 -0
  287. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/models.py +0 -0
  288. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/tasks/__init__.py +0 -0
  289. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/tasks/sync_users_jira.py +0 -0
  290. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/types.py +0 -0
  291. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/jira_app/utils.py +0 -0
  292. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/logging/__init__.py +0 -0
  293. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/logging/custom_json_formatter.py +0 -0
  294. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/logging/pretty_formatter.py +0 -0
  295. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/__init__.py +0 -0
  296. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/admin.py +0 -0
  297. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/apps.py +0 -0
  298. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/client.py +0 -0
  299. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/forms/__init__.py +0 -0
  300. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/forms/create_pagerduty_incident.py +0 -0
  301. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/migrations/0001_initial_oss.py +0 -0
  302. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/migrations/__init__.py +0 -0
  303. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/models.py +0 -0
  304. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/service.py +0 -0
  305. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/signals/__init__.py +0 -0
  306. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/signals/get_invites_from_pagerduty.py +0 -0
  307. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/signals/incident_channel_done_oncall.py +0 -0
  308. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/tasks/__init__.py +0 -0
  309. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/tasks/fetch_oncall.py +0 -0
  310. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/tasks/fetch_services.py +0 -0
  311. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/tasks/fetch_users.py +0 -0
  312. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/tasks/trigger_oncall.py +0 -0
  313. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/templates/pages/oncall_list.html +0 -0
  314. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/templates/pages/oncall_trigger.html +0 -0
  315. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view.html +0 -0
  316. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/templates/partials/trigger_oncall_form_view_modal.html +0 -0
  317. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/urls.py +0 -0
  318. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/views/__init__.py +0 -0
  319. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/views/oncall_list.py +0 -0
  320. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/pagerduty/views/oncall_trigger.py +0 -0
  321. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/__init__.py +0 -0
  322. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/admin.py +0 -0
  323. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/apps.py +0 -0
  324. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/messages.py +0 -0
  325. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/migrations/0001_initial_oss.py +0 -0
  326. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/migrations/0002_featureteam_remove_qualifierrotation_jira_user_and_more.py +0 -0
  327. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/migrations/0003_delete_raidarea.py +0 -0
  328. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/migrations/__init__.py +0 -0
  329. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/models.py +0 -0
  330. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/resources.py +0 -0
  331. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/serializers.py +0 -0
  332. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/service.py +0 -0
  333. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/signals/__init__.py +0 -0
  334. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/signals/incident_updated.py +0 -0
  335. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/tasks/__init__.py +0 -0
  336. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/types.py +0 -0
  337. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/urls.py +0 -0
  338. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/raid/utils.py +0 -0
  339. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/__init__.py +0 -0
  340. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/admin.py +0 -0
  341. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/apps.py +0 -0
  342. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/factories.py +0 -0
  343. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/forms/__init__.py +0 -0
  344. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/forms/sos_form.py +0 -0
  345. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/management/__init__.py +0 -0
  346. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/management/commands/__init__.py +0 -0
  347. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/management/commands/generate_manifest.py +0 -0
  348. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/management/commands/switch_test_users.py +0 -0
  349. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/messages/__init__.py +0 -0
  350. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/messages/base.py +0 -0
  351. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/messages/slack_messages.py +0 -0
  352. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0001_initial_oss.py +0 -0
  353. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0002_usergroup_tag.py +0 -0
  354. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0003_alter_usergroup_tag.py +0 -0
  355. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0004_alter_usergroup_components.py +0 -0
  356. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0005_add_incident_categories_fields.py +0 -0
  357. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0006_copy_components_to_incident_categories.py +0 -0
  358. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0007_remove_components_fields.py +0 -0
  359. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/0008_alter_conversation_incident_categories_and_more.py +0 -0
  360. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/migrations/__init__.py +0 -0
  361. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/__init__.py +0 -0
  362. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/conversation.py +0 -0
  363. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/incident_channel.py +0 -0
  364. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/message.py +0 -0
  365. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/sos.py +0 -0
  366. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/user.py +0 -0
  367. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/models/user_group.py +0 -0
  368. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/rules.py +0 -0
  369. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/__init__.py +0 -0
  370. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/create_incident_conversation.py +0 -0
  371. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/get_users.py +0 -0
  372. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/handle_incident_channel_done.py +0 -0
  373. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/incident_closed.py +0 -0
  374. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/incident_updated.py +0 -0
  375. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/postmortem_created.py +0 -0
  376. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/signals/roles_reminders.py +0 -0
  377. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/slack_app.py +0 -0
  378. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/slack_incident_context.py +0 -0
  379. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/slack_templating.py +0 -0
  380. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/__init__.py +0 -0
  381. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/fetch_conversations_members.py +0 -0
  382. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/reminder_postmortem.py +0 -0
  383. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/send_message.py +0 -0
  384. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/send_reminders.py +0 -0
  385. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/sync_users.py +0 -0
  386. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/update_usergroups_members.py +0 -0
  387. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/tasks/update_users.py +0 -0
  388. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/urls.py +0 -0
  389. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/utils.py +0 -0
  390. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/__init__.py +0 -0
  391. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/__init__.py +0 -0
  392. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/actions_and_shortcuts.py +0 -0
  393. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_archive.py +0 -0
  394. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_id_changed.py +0 -0
  395. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_rename.py +0 -0
  396. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_shared.py +0 -0
  397. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_unarchive.py +0 -0
  398. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/channel_unshared.py +0 -0
  399. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/commands.py +0 -0
  400. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/home.py +0 -0
  401. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/member_joined_channel.py +0 -0
  402. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/member_left_channel.py +0 -0
  403. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/message.py +0 -0
  404. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/message_deleted.py +0 -0
  405. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/events/reaction_added.py +0 -0
  406. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/__init__.py +0 -0
  407. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/__init__.py +0 -0
  408. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/base.py +0 -0
  409. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/base_mixins.py +0 -0
  410. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/form_utils.py +0 -0
  411. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/mixins.py +0 -0
  412. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/base_modal/modal_utils.py +0 -0
  413. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/close.py +0 -0
  414. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/closure_reason.py +0 -0
  415. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/downgrade_workflow.py +0 -0
  416. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/edit.py +0 -0
  417. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/key_event_message.py +0 -0
  418. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/open.py +0 -0
  419. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/__init__.py +0 -0
  420. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/check_current_incidents.py +0 -0
  421. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/details/__init__.py +0 -0
  422. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/details/unified.py +0 -0
  423. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/select_impact.py +0 -0
  424. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/set_details.py +0 -0
  425. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/opening/types.py +0 -0
  426. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/postmortem.py +0 -0
  427. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/select.py +0 -0
  428. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/send_sos.py +0 -0
  429. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/status.py +0 -0
  430. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/trigger_oncall.py +0 -0
  431. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/update.py +0 -0
  432. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/update_roles.py +0 -0
  433. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/update_status.py +0 -0
  434. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/modals/utils.py +0 -0
  435. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter/slack/views/views.py +0 -0
  436. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/environments.json +0 -0
  437. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/groups.json +0 -0
  438. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/impact_level.json +0 -0
  439. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/impact_type.json +0 -0
  440. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/incident_categories.json +0 -0
  441. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/incident_role_type.json +0 -0
  442. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/metric_type.json +0 -0
  443. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/milestone_type.json +0 -0
  444. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/priorities.json +0 -0
  445. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_fixtures/incidents/severities.json +0 -0
  446. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/__init__.py +0 -0
  447. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/conftest.py +0 -0
  448. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_api/test_api_landbot.py +0 -0
  449. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_api/test_api_urls.py +0 -0
  450. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_confluence/test_confluence_utils.py +0 -0
  451. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_firefighter/test_firefighter_utils.py +0 -0
  452. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_firefighter/test_logging.py +0 -0
  453. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_firefighter/test_sso.py +0 -0
  454. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_firefighter/test_urls.py +0 -0
  455. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_enums.py +0 -0
  456. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/conftest.py +0 -0
  457. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_closure_reason.py +0 -0
  458. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_form_select_impact.py +0 -0
  459. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_form_utils.py +0 -0
  460. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form.py +0 -0
  461. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form_integration.py +0 -0
  462. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_unified_incident_form_p4_p5.py +0 -0
  463. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_update_key_events.py +0 -0
  464. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_update_status_workflow.py +0 -0
  465. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_forms/test_workflow_transitions.py +0 -0
  466. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_incident_urls.py +0 -0
  467. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_models/test_incident_category.py +0 -0
  468. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_models/test_incident_model.py +0 -0
  469. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_models/test_migrations/test_incident_migrations.py +0 -0
  470. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_utils/test_date_utils.py +0 -0
  471. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_views/test_incident_detail_view.py +0 -0
  472. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_incidents/test_views/test_index_view.py +0 -0
  473. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/conftest.py +0 -0
  474. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_client_users.py +0 -0
  475. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_models.py +0 -0
  476. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_service.py +0 -0
  477. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_signals.py +0 -0
  478. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_transitions.py +0 -0
  479. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_utils.py +0 -0
  480. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_raid/test_raid_views.py +0 -0
  481. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/conftest.py +0 -0
  482. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/messages/__init__.py +0 -0
  483. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/messages/test_slack_messages.py +0 -0
  484. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/test_models/test_conversations.py +0 -0
  485. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/test_models/test_incident_channel.py +0 -0
  486. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/test_models/test_slack_user.py +0 -0
  487. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/test_signals_downgrade.py +0 -0
  488. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/test_slack_utils.py +0 -0
  489. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/conftest.py +0 -0
  490. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_close.py +0 -0
  491. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_closure_reason_modal.py +0 -0
  492. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_edit.py +0 -0
  493. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_form_utils_multiple_choice.py +0 -0
  494. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_open.py +0 -0
  495. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_opening_unified.py +0 -0
  496. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_send_sos.py +0 -0
  497. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_status.py +0 -0
  498. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/firefighter_tests/test_slack/views/modals/test_utils.py +0 -0
  499. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/gunicorn.conf.py +0 -0
  500. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/main.py +0 -0
  501. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/manage.py +0 -0
  502. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/package-lock.json +0 -0
  503. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/package.json +0 -0
  504. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/pyproject.toml +0 -0
  505. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/scripts/gen_credits.py +0 -0
  506. {firefighter_incident-0.0.18 → firefighter_incident-0.0.20}/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.18
3
+ Version: 0.0.20
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.18'
32
- __version_tuple__ = version_tuple = (0, 0, 18)
31
+ __version__ = version = '0.0.20'
32
+ __version_tuple__ = version_tuple = (0, 0, 20)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -71,7 +71,7 @@ class SelectImpactForm(forms.Form):
71
71
  if impact_name.impact_type.name == "Business Impact":
72
72
  impact_value = impact_name.value
73
73
 
74
- return LevelChoices(impact_value).label if impact_value else None
74
+ return str(LevelChoices(impact_value).label) if impact_value else None
75
75
 
76
76
  def save(self, incident: HasImpactProtocol) -> None:
77
77
  """Save the impact choices to the incident."""
@@ -254,14 +254,24 @@ class JiraClient:
254
254
  ValueError: Empty issue id
255
255
 
256
256
  Returns:
257
- list(JiraAPIUser): List of Jira users object
257
+ list(JiraAPIUser): List of Jira users object, or empty list if ticket doesn't exist
258
258
  """
259
- watchers = self.jira.watchers(jira_issue_id).raw.get("watchers")
260
- if len(watchers) == 0:
261
- logger.warning(
262
- "Watchers not found for jira_account_id '%s'.", jira_issue_id
263
- )
264
- return watchers
259
+ try:
260
+ watchers = self.jira.watchers(jira_issue_id).raw.get("watchers")
261
+ except exceptions.JIRAError as e:
262
+ if e.status_code == 404:
263
+ logger.warning(
264
+ "Jira ticket %s not found or no permission to access it. Cannot fetch watchers.",
265
+ jira_issue_id,
266
+ )
267
+ return []
268
+ raise
269
+ else:
270
+ if len(watchers) == 0:
271
+ logger.debug(
272
+ "No watchers found for jira_issue_id '%s'.", jira_issue_id
273
+ )
274
+ return watchers
265
275
 
266
276
  @staticmethod
267
277
  def _create_user_from_jira_info(
@@ -72,6 +72,7 @@ class RaidJiraClient(JiraClient):
72
72
  extra_args["customfield_10896"] = str(zoho_desk_ticket_id)
73
73
  if zendesk_ticket_id:
74
74
  extra_args["customfield_10895"] = str(zendesk_ticket_id)
75
+
75
76
  if seller_contract_id:
76
77
  description_addendum.append(
77
78
  f"Seller link to TOOLBOX: {TOOLBOX_URL}?seller_id={seller_contract_id}"
@@ -109,6 +110,7 @@ class RaidJiraClient(JiraClient):
109
110
  project = (
110
111
  feature_team.jira_project_key if feature_team else RAID_JIRA_PROJECT_KEY
111
112
  )
113
+
112
114
  issue = self.jira.create_issue(
113
115
  project=project,
114
116
  summary=summary,
@@ -107,8 +107,12 @@ def alert_slack_new_jira_ticket(
107
107
  reporter_user: User | None = None,
108
108
  reporter_email: str | None = None,
109
109
  ) -> None:
110
- # These alerts are not for critical incidents
111
- if hasattr(jira_ticket, "incident") and jira_ticket.incident:
110
+ # These alerts are for P4-P5 incidents only, not P1-P3 critical incidents
111
+ if (
112
+ hasattr(jira_ticket, "incident")
113
+ and jira_ticket.incident
114
+ and jira_ticket.incident.priority.value <= 3
115
+ ):
112
116
  raise ValueError("This is a critical incident, not a raid incident.")
113
117
 
114
118
  # Get the reporter's email and user from ticket if not provided
@@ -35,6 +35,7 @@ if TYPE_CHECKING:
35
35
  "description": "Description test where you want to depict your issue",
36
36
  "seller_contract_id": "12345678",
37
37
  "zoho": "https://crmplus.zoho.eu/mycrmlink/index.do/cxapp/agent/mycompany/all/tickets/details/123456789",
38
+ "zendesk": "12345",
38
39
  "platform": "FR",
39
40
  "reporter_email": "john.doe@mycompany.com",
40
41
  "incident_category": "Payment Processing",
@@ -0,0 +1 @@
1
+ """Tests for jira_app module."""
@@ -0,0 +1,24 @@
1
+ """Fixtures for jira_app tests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import Mock, patch
6
+
7
+ import pytest
8
+
9
+ from firefighter.jira_app.client import JiraClient
10
+
11
+
12
+ @pytest.fixture
13
+ def mock_jira_api():
14
+ """Create a mock JIRA API object."""
15
+ return Mock()
16
+
17
+
18
+ @pytest.fixture
19
+ def jira_client(mock_jira_api):
20
+ """Create a JiraClient with mocked JIRA API."""
21
+ with patch("firefighter.jira_app.client.JIRA", return_value=mock_jira_api):
22
+ client = JiraClient()
23
+ client.jira = mock_jira_api
24
+ return client
@@ -0,0 +1,135 @@
1
+ """Tests for JiraClient.get_watchers_from_jira_ticket method."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import Mock
6
+
7
+ import pytest
8
+ from jira.exceptions import JIRAError
9
+
10
+
11
+ @pytest.mark.django_db
12
+ class TestGetWatchersFromJiraTicket:
13
+ """Test get_watchers_from_jira_ticket method."""
14
+
15
+ def test_get_watchers_success_with_watchers(self, jira_client, mock_jira_api):
16
+ """Test successful retrieval of watchers when watchers exist."""
17
+ # Given
18
+ mock_watchers_response = Mock()
19
+ mock_watchers_response.raw = {
20
+ "watchers": [
21
+ {"accountId": "user1", "displayName": "User One"},
22
+ {"accountId": "user2", "displayName": "User Two"},
23
+ ]
24
+ }
25
+ mock_jira_api.watchers.return_value = mock_watchers_response
26
+
27
+ # When
28
+ result = jira_client.get_watchers_from_jira_ticket(12345)
29
+
30
+ # Then
31
+ mock_jira_api.watchers.assert_called_once_with(12345)
32
+ assert len(result) == 2
33
+ assert result[0]["accountId"] == "user1"
34
+ assert result[1]["accountId"] == "user2"
35
+
36
+ def test_get_watchers_success_empty_list(
37
+ self, jira_client, mock_jira_api, caplog
38
+ ):
39
+ """Test successful retrieval when no watchers exist."""
40
+ # Given
41
+ mock_watchers_response = Mock()
42
+ mock_watchers_response.raw = {"watchers": []}
43
+ mock_jira_api.watchers.return_value = mock_watchers_response
44
+
45
+ # When
46
+ result = jira_client.get_watchers_from_jira_ticket(12345)
47
+
48
+ # Then
49
+ mock_jira_api.watchers.assert_called_once_with(12345)
50
+ assert result == []
51
+ # Should log debug message
52
+ assert "No watchers found for jira_issue_id '12345'" in caplog.text
53
+
54
+ def test_get_watchers_404_ticket_not_found(
55
+ self, jira_client, mock_jira_api, caplog
56
+ ):
57
+ """Test handling of 404 error when ticket doesn't exist."""
58
+ # Given
59
+ jira_error = JIRAError(
60
+ status_code=404,
61
+ text="Issue does not exist or you do not have permission to see it.",
62
+ url="https://jira.example.com/rest/api/2/issue/404295/watchers",
63
+ )
64
+ mock_jira_api.watchers.side_effect = jira_error
65
+
66
+ # When
67
+ result = jira_client.get_watchers_from_jira_ticket(404295)
68
+
69
+ # Then
70
+ mock_jira_api.watchers.assert_called_once_with(404295)
71
+ assert result == []
72
+ # Should log warning
73
+ assert (
74
+ "Jira ticket 404295 not found or no permission to access it"
75
+ in caplog.text
76
+ )
77
+
78
+ def test_get_watchers_404_no_permission(self, jira_client, mock_jira_api, caplog):
79
+ """Test handling of 404 error when bot has no permission."""
80
+ # Given
81
+ jira_error = JIRAError(
82
+ status_code=404,
83
+ text="Issue does not exist or you do not have permission to see it.",
84
+ url="https://jira.example.com/rest/api/2/issue/999999/watchers",
85
+ )
86
+ mock_jira_api.watchers.side_effect = jira_error
87
+
88
+ # When
89
+ result = jira_client.get_watchers_from_jira_ticket("999999")
90
+
91
+ # Then
92
+ assert result == []
93
+ assert "not found or no permission" in caplog.text
94
+
95
+ def test_get_watchers_other_jira_error_raised(self, jira_client, mock_jira_api):
96
+ """Test that non-404 JIRA errors are re-raised."""
97
+ # Given
98
+ jira_error = JIRAError(
99
+ status_code=500, text="Internal Server Error", url="https://jira.example.com"
100
+ )
101
+ mock_jira_api.watchers.side_effect = jira_error
102
+
103
+ # When / Then
104
+ with pytest.raises(JIRAError) as exc_info:
105
+ jira_client.get_watchers_from_jira_ticket(12345)
106
+
107
+ assert exc_info.value.status_code == 500
108
+
109
+ def test_get_watchers_403_error_raised(self, jira_client, mock_jira_api):
110
+ """Test that 403 (Forbidden) errors are re-raised."""
111
+ # Given
112
+ jira_error = JIRAError(
113
+ status_code=403, text="Forbidden", url="https://jira.example.com"
114
+ )
115
+ mock_jira_api.watchers.side_effect = jira_error
116
+
117
+ # When / Then
118
+ with pytest.raises(JIRAError) as exc_info:
119
+ jira_client.get_watchers_from_jira_ticket(12345)
120
+
121
+ assert exc_info.value.status_code == 403
122
+
123
+ def test_get_watchers_with_string_id(self, jira_client, mock_jira_api):
124
+ """Test get_watchers with string issue ID."""
125
+ # Given
126
+ mock_watchers_response = Mock()
127
+ mock_watchers_response.raw = {"watchers": [{"accountId": "user1"}]}
128
+ mock_jira_api.watchers.return_value = mock_watchers_response
129
+
130
+ # When
131
+ result = jira_client.get_watchers_from_jira_ticket("INCIDENT-123")
132
+
133
+ # Then
134
+ mock_jira_api.watchers.assert_called_once_with("INCIDENT-123")
135
+ assert len(result) == 1
@@ -0,0 +1,255 @@
1
+ """Tests for RAID alert notifications for P4-P5 incidents with linked Incident objects.
2
+
3
+ This module tests the alert_slack_new_jira_ticket() function behavior when called
4
+ with P4-P5 JiraTickets that have associated Incident objects (since 0.0.17 unified workflow).
5
+
6
+ Before 0.0.17: P4-P5 created only JiraTicket (no Incident) → alerts worked
7
+ Since 0.0.17: P4-P5 create Incident + JiraTicket → alerts broken due to incorrect check
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from unittest.mock import patch
13
+
14
+ import pytest
15
+
16
+ from firefighter.incidents.factories import (
17
+ IncidentCategoryFactory,
18
+ IncidentFactory,
19
+ UserFactory,
20
+ )
21
+ from firefighter.incidents.models.priority import Priority
22
+ from firefighter.jira_app.models import JiraUser
23
+ from firefighter.raid.forms import (
24
+ alert_slack_new_jira_ticket,
25
+ get_internal_alert_conversations,
26
+ )
27
+ from firefighter.raid.models import JiraTicket
28
+ from firefighter.slack.models.conversation import Conversation
29
+ from firefighter.slack.models.user import SlackUser
30
+
31
+
32
+ @pytest.mark.django_db
33
+ class TestAlertSlackNewJiraTicketWithIncident:
34
+ """Test alert_slack_new_jira_ticket for P4-P5 with linked Incident (unified workflow)."""
35
+
36
+ @pytest.fixture
37
+ def p4_priority(self):
38
+ """Get or create P4 priority."""
39
+ priority, _ = Priority.objects.get_or_create(value=4, defaults={"name": "P4"})
40
+ return priority
41
+
42
+ @pytest.fixture
43
+ def p5_priority(self):
44
+ """Get or create P5 priority."""
45
+ priority, _ = Priority.objects.get_or_create(value=5, defaults={"name": "P5"})
46
+ return priority
47
+
48
+ @pytest.fixture
49
+ def incident_category(self):
50
+ """Create incident category."""
51
+ return IncidentCategoryFactory()
52
+
53
+ @pytest.fixture
54
+ def reporter_user_with_slack(self):
55
+ """Create user with Slack account."""
56
+ user = UserFactory(email="reporter@manomano.com")
57
+ jira_user = JiraUser.objects.create(id="jira-123", user=user)
58
+ slack_user = SlackUser.objects.create(user=user, slack_id="U12345")
59
+ return user, jira_user, slack_user
60
+
61
+ @pytest.fixture
62
+ def raid_alert_channel_sbi(self):
63
+ """Create the raid_alert__sbi_normal channel for SBI tickets."""
64
+ return Conversation.objects.create(
65
+ name="incidents",
66
+ channel_id="C_INCIDENTS",
67
+ tag="raid_alert__sbi_normal",
68
+ )
69
+
70
+ def test_alert_p4_incident_with_linked_incident_should_succeed(
71
+ self,
72
+ p4_priority,
73
+ incident_category,
74
+ reporter_user_with_slack,
75
+ raid_alert_channel_sbi, # noqa: ARG002 - fixture creates channel in DB
76
+ ):
77
+ """Test that P4 JiraTicket with linked Incident can send raid_alert notifications.
78
+
79
+ This test reproduces the CURRENT BROKEN behavior since 0.0.17:
80
+ - UnifiedIncidentForm creates Incident + JiraTicket for P4-P5
81
+ - alert_slack_new_jira_ticket() raises ValueError because jira_ticket.incident exists
82
+ - Notifications to #incidents channel are never sent
83
+
84
+ Expected: Should send notifications (test will FAIL until bug is fixed)
85
+ """
86
+ user, jira_user, _ = reporter_user_with_slack
87
+
88
+ # Create P4 incident (simulating UnifiedIncidentForm behavior)
89
+ incident = IncidentFactory(
90
+ priority=p4_priority,
91
+ incident_category=incident_category,
92
+ created_by=user,
93
+ )
94
+
95
+ # Create JiraTicket linked to Incident (UNIFIED workflow since 0.0.17)
96
+ jira_ticket = JiraTicket.objects.create(
97
+ id=12345,
98
+ key="SBI-12345",
99
+ summary="P4 incident with linked Incident",
100
+ business_impact="N/A",
101
+ project_key="SBI",
102
+ reporter=jira_user,
103
+ incident=incident, # ← This is what breaks alert_slack_new_jira_ticket()
104
+ )
105
+
106
+ # Mock Slack API to capture messages sent
107
+ with (
108
+ patch(
109
+ "firefighter.slack.models.user.SlackUser.send_private_message"
110
+ ) as mock_dm,
111
+ patch(
112
+ "firefighter.slack.models.conversation.Conversation.send_message_and_save"
113
+ ) as mock_channel_msg,
114
+ ):
115
+ # This should NOT raise ValueError and should send notifications
116
+ alert_slack_new_jira_ticket(
117
+ jira_ticket, reporter_user=user, reporter_email=user.email
118
+ )
119
+
120
+ # Verify DM was sent to reporter
121
+ assert mock_dm.called, "Should send DM to reporter"
122
+
123
+ # Verify message was sent to #incidents channel
124
+ assert (
125
+ mock_channel_msg.called
126
+ ), "Should send message to raid_alert channel"
127
+
128
+ def test_alert_p5_incident_with_linked_incident_should_succeed(
129
+ self,
130
+ p5_priority,
131
+ incident_category,
132
+ reporter_user_with_slack,
133
+ raid_alert_channel_sbi, # noqa: ARG002 - fixture creates channel in DB
134
+ ):
135
+ """Test that P5 JiraTicket with linked Incident can send raid_alert notifications."""
136
+ user, jira_user, _ = reporter_user_with_slack
137
+
138
+ # Create P5 incident
139
+ incident = IncidentFactory(
140
+ priority=p5_priority,
141
+ incident_category=incident_category,
142
+ created_by=user,
143
+ )
144
+
145
+ # Create JiraTicket linked to Incident
146
+ jira_ticket = JiraTicket.objects.create(
147
+ id=12346,
148
+ key="SBI-12346",
149
+ summary="P5 incident with linked Incident",
150
+ business_impact="N/A",
151
+ project_key="SBI",
152
+ reporter=jira_user,
153
+ incident=incident,
154
+ )
155
+
156
+ # Mock Slack API
157
+ with (
158
+ patch(
159
+ "firefighter.slack.models.user.SlackUser.send_private_message"
160
+ ) as mock_dm,
161
+ patch(
162
+ "firefighter.slack.models.conversation.Conversation.send_message_and_save"
163
+ ) as mock_channel_msg,
164
+ ):
165
+ # Should succeed for P5 as well
166
+ alert_slack_new_jira_ticket(
167
+ jira_ticket, reporter_user=user, reporter_email=user.email
168
+ )
169
+
170
+ assert mock_dm.called
171
+ assert mock_channel_msg.called
172
+
173
+ def test_alert_p1_incident_should_fail(
174
+ self, incident_category, reporter_user_with_slack
175
+ ):
176
+ """Test that P1 JiraTicket with linked Incident correctly raises ValueError.
177
+
178
+ P1-P3 incidents should NOT use raid_alert notifications.
179
+ They have dedicated Slack channels and use different notification flow.
180
+ """
181
+ user, jira_user, _ = reporter_user_with_slack
182
+ p1_priority, _ = Priority.objects.get_or_create(value=1, defaults={"name": "P1"})
183
+
184
+ incident = IncidentFactory(
185
+ priority=p1_priority,
186
+ incident_category=incident_category,
187
+ created_by=user,
188
+ )
189
+
190
+ jira_ticket = JiraTicket.objects.create(
191
+ id=12347,
192
+ key="SBI-12347",
193
+ summary="P1 critical incident",
194
+ business_impact="High",
195
+ project_key="SBI",
196
+ reporter=jira_user,
197
+ incident=incident,
198
+ )
199
+
200
+ # P1 should correctly raise ValueError
201
+ with pytest.raises(
202
+ ValueError, match="This is a critical incident, not a raid incident"
203
+ ):
204
+ alert_slack_new_jira_ticket(
205
+ jira_ticket, reporter_user=user, reporter_email=user.email
206
+ )
207
+
208
+ def test_get_internal_alert_conversations_for_normal_impact(
209
+ self, raid_alert_channel_sbi # noqa: ARG002 - fixture creates channel in DB
210
+ ):
211
+ """Test that get_internal_alert_conversations finds raid_alert__sbi_normal channel."""
212
+ # Create a JiraTicket with normal/N/A business impact for SBI project
213
+ jira_user = JiraUser.objects.create(id="jira-999", user=UserFactory())
214
+ jira_ticket = JiraTicket.objects.create(
215
+ id=99999,
216
+ key="SBI-99999",
217
+ summary="Test ticket",
218
+ business_impact="N/A",
219
+ project_key="SBI",
220
+ reporter=jira_user,
221
+ )
222
+
223
+ # Should find the raid_alert__sbi_normal channel
224
+ channels = get_internal_alert_conversations(jira_ticket)
225
+ channel_list = list(channels)
226
+
227
+ assert len(channel_list) == 1
228
+ assert channel_list[0].tag == "raid_alert__sbi_normal"
229
+ assert channel_list[0].name == "incidents"
230
+
231
+ def test_get_internal_alert_conversations_for_high_impact(self):
232
+ """Test that get_internal_alert_conversations finds raid_alert__sbi_high channel."""
233
+ # Create channel for high impact on SBI
234
+ Conversation.objects.create(
235
+ name="incidents-high-impact",
236
+ channel_id="C_INCIDENTS_HIGH",
237
+ tag="raid_alert__sbi_high",
238
+ )
239
+
240
+ # Create JiraTicket with High business impact for SBI
241
+ jira_user = JiraUser.objects.create(id="jira-998", user=UserFactory())
242
+ jira_ticket = JiraTicket.objects.create(
243
+ id=99998,
244
+ key="SBI-99998",
245
+ summary="Test high impact ticket",
246
+ business_impact="High",
247
+ project_key="SBI",
248
+ reporter=jira_user,
249
+ )
250
+
251
+ channels = get_internal_alert_conversations(jira_ticket)
252
+ channel_list = list(channels)
253
+
254
+ assert len(channel_list) == 1
255
+ assert channel_list[0].tag == "raid_alert__sbi_high"
@@ -368,6 +368,38 @@ class TestRaidJiraClientBasics:
368
368
  priority=1,
369
369
  )
370
370
 
371
+ def test_create_issue_zendesk_field_mapping(self, mock_jira_client):
372
+ """Test that zendesk_ticket_id is correctly mapped to customfield_10895."""
373
+ mock_issue = Mock()
374
+ mock_issue.raw = {
375
+ "id": "12355",
376
+ "key": "TEST-130",
377
+ "fields": {
378
+ "summary": "Test zendesk mapping",
379
+ "description": "Test description",
380
+ "reporter": {"accountId": "reporter123"},
381
+ "issuetype": {"name": "Bug"},
382
+ },
383
+ }
384
+ mock_jira_client.jira.create_issue.return_value = mock_issue
385
+
386
+ result = mock_jira_client.create_issue(
387
+ issuetype="Bug",
388
+ summary="Test zendesk mapping",
389
+ description="Test description",
390
+ assignee=None,
391
+ reporter="test_reporter",
392
+ priority=1,
393
+ zendesk_ticket_id="ZD-98765",
394
+ )
395
+
396
+ # Verify create_issue was called with customfield_10895
397
+ call_kwargs = mock_jira_client.jira.create_issue.call_args[1]
398
+ assert "customfield_10895" in call_kwargs
399
+ assert call_kwargs["customfield_10895"] == "ZD-98765"
400
+ assert result["id"] == 12355
401
+ assert result["key"] == "TEST-130"
402
+
371
403
  def test_jira_object_static_method(self):
372
404
  """Test _jira_object static method."""
373
405
  test_issue = {
@@ -195,9 +195,12 @@ class TestAlertSlackNewJiraTicket:
195
195
  )
196
196
 
197
197
  def test_alert_slack_new_jira_ticket_with_incident_raises_error(self):
198
- """Test that function raises ValueError for critical incidents."""
199
- # Given - Create an incident and link it to the ticket
200
- incident = IncidentFactory()
198
+ """Test that function raises ValueError for P1-P3 critical incidents."""
199
+ # Given - Create a P1 incident and link it to the ticket
200
+ p1_priority = Priority.objects.get_or_create(value=1, defaults={"name": "P1"})[
201
+ 0
202
+ ]
203
+ incident = IncidentFactory(priority=p1_priority)
201
204
  self.jira_ticket.incident = incident
202
205
  self.jira_ticket.save()
203
206
 
@@ -550,3 +553,58 @@ class TestGetInternalAlertConversations:
550
553
 
551
554
  # Then
552
555
  assert conversation in result
556
+
557
+
558
+ @pytest.mark.django_db
559
+ class TestAlertSlackNewJiraTicketSlackApiError:
560
+ """Test SlackApiError handling in alert_slack_new_jira_ticket."""
561
+
562
+ @pytest.fixture(autouse=True)
563
+ def setup(self):
564
+ """Set up test fixtures."""
565
+ self.user = UserFactory()
566
+ self.jira_user = JiraUser.objects.create(id="jira-slack-error", user=self.user)
567
+ self.jira_ticket = JiraTicket.objects.create(
568
+ id=88888,
569
+ key="SLACK-888",
570
+ summary="Slack error ticket",
571
+ reporter=self.jira_user,
572
+ )
573
+
574
+ @patch("firefighter.raid.forms.get_partner_alert_conversations")
575
+ @patch("firefighter.raid.forms.get_internal_alert_conversations")
576
+ @patch("firefighter.raid.forms.SlackMessageRaidCreatedIssue")
577
+ def test_alert_slack_new_jira_ticket_slack_api_error_on_channel_send(
578
+ self, mock_message_class, mock_get_internal, mock_get_partner, caplog
579
+ ):
580
+ """Test SlackApiError when sending to channel - should log exception and continue."""
581
+ # Given: Create a conversation that will fail to send
582
+ channel = Conversation.objects.create(
583
+ channel_id="C_FAIL_TEST",
584
+ name="fail-channel-test",
585
+ tag="raid_alert__test_fail",
586
+ )
587
+ mock_get_internal.return_value = Conversation.objects.filter(id=channel.id)
588
+ mock_get_partner.return_value = Conversation.objects.none()
589
+
590
+ # Mock message
591
+ mock_message = Mock()
592
+ mock_message_class.return_value = mock_message
593
+
594
+ # Mock channel.send_message_and_save to raise SlackApiError
595
+ with patch.object(
596
+ Conversation,
597
+ "send_message_and_save",
598
+ side_effect=SlackApiError(
599
+ message="channel_not_found",
600
+ response={"error": "channel_not_found"}
601
+ )
602
+ ):
603
+ # When
604
+ alert_slack_new_jira_ticket(self.jira_ticket)
605
+
606
+ # Then
607
+ # Should log exception about not being able to send
608
+ assert "Couldn't send message to channel" in caplog.text
609
+ assert str(self.jira_ticket.id) in caplog.text
610
+ # Function should continue and not raise