firefighter-incident 0.0.3__py3-none-any.whl → 0.0.5__py3-none-any.whl

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 (24) hide show
  1. firefighter/_version.py +2 -2
  2. firefighter/incidents/forms/close_incident.py +1 -1
  3. firefighter/incidents/forms/create_incident.py +1 -1
  4. firefighter/incidents/forms/select_impact.py +1 -1
  5. firefighter/incidents/forms/update_status.py +1 -1
  6. firefighter/incidents/migrations/0009_update_sla.py +30 -0
  7. firefighter/incidents/migrations/0010_update_components.py +102 -0
  8. firefighter/incidents/migrations/0011_update_incidents.py +87 -0
  9. firefighter/incidents/models/incident.py +1 -1
  10. firefighter/incidents/templates/pages/component_detail.html +1 -1
  11. firefighter/incidents/views/components/list.py +1 -1
  12. firefighter/raid/client.py +2 -2
  13. firefighter/slack/models/user_group.py +1 -1
  14. firefighter/slack/views/modals/opening/details/critical.py +1 -1
  15. firefighter/slack/views/modals/opening/select_impact.py +3 -2
  16. firefighter/slack/views/modals/update_status.py +1 -1
  17. {firefighter_incident-0.0.3.dist-info → firefighter_incident-0.0.5.dist-info}/METADATA +1 -1
  18. {firefighter_incident-0.0.3.dist-info → firefighter_incident-0.0.5.dist-info}/RECORD +24 -21
  19. firefighter_tests/test_incidents/test_forms/test_form_utils.py +2 -2
  20. firefighter_tests/test_slack/views/modals/test_close.py +2 -2
  21. firefighter_tests/test_slack/views/modals/test_update_status.py +2 -2
  22. {firefighter_incident-0.0.3.dist-info → firefighter_incident-0.0.5.dist-info}/WHEEL +0 -0
  23. {firefighter_incident-0.0.3.dist-info → firefighter_incident-0.0.5.dist-info}/entry_points.txt +0 -0
  24. {firefighter_incident-0.0.3.dist-info → firefighter_incident-0.0.5.dist-info}/licenses/LICENSE +0 -0
firefighter/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.0.3'
21
- __version_tuple__ = version_tuple = (0, 0, 3)
20
+ __version__ = version = '0.0.5'
21
+ __version_tuple__ = version_tuple = (0, 0, 5)
@@ -28,7 +28,7 @@ class CloseIncidentForm(forms.Form):
28
28
  )
29
29
  component = GroupedModelChoiceField(
30
30
  choices_groupby="group",
31
- label="Component",
31
+ label="Issue category",
32
32
  queryset=Component.objects.all()
33
33
  .select_related("group")
34
34
  .order_by(
@@ -54,7 +54,7 @@ class CreateIncidentForm(CreateIncidentFormBase):
54
54
 
55
55
  component = GroupedModelChoiceField(
56
56
  choices_groupby="group",
57
- label="Component",
57
+ label="Issue category",
58
58
  queryset=(
59
59
  Component.objects.all()
60
60
  .select_related("group")
@@ -63,7 +63,7 @@ class SelectImpactForm(forms.Form):
63
63
 
64
64
  @property
65
65
  def business_impact_new(self) -> str | None:
66
- """Get business impact. Will return N/A, Low, Medium or High."""
66
+ """Get business impact. Will return N/A, Lowest, Low, Medium, High or Highest."""
67
67
  impact_value = ""
68
68
  if self.is_valid():
69
69
  impact: dict[str, ImpactLevel] = self.cleaned_data
@@ -26,7 +26,7 @@ class UpdateStatusForm(forms.Form):
26
26
  )
27
27
  component = GroupedModelChoiceField(
28
28
  choices_groupby="group",
29
- label="Component",
29
+ label="Issue category",
30
30
  queryset=Component.objects.all()
31
31
  .select_related("group")
32
32
  .order_by(
@@ -0,0 +1,30 @@
1
+ from django.db import migrations
2
+
3
+
4
+ def update_priority_settings(apps, schema_editor):
5
+ Priority = apps.get_model("incidents", "Priority")
6
+ priorities_to_update = {
7
+ "P1": ("02:00:00", True, True),
8
+ "P2": ("04:00:00", True, True),
9
+ "P3": ("1 day, 00:00:00", True, True),
10
+ "P4": ("5 days, 00:00:00", True, True),
11
+ "P5": ("10 days, 00:00:00", True, True),
12
+ }
13
+
14
+ for name, (sla, enabled_create, enabled_update) in priorities_to_update.items():
15
+ Priority.objects.filter(name=name).update(
16
+ sla=sla,
17
+ enabled_create=enabled_create,
18
+ enabled_update=enabled_update,
19
+ )
20
+
21
+
22
+ class Migration(migrations.Migration):
23
+
24
+ dependencies = [
25
+ ("incidents", "0008_impact_level"),
26
+ ]
27
+
28
+ operations = [
29
+ migrations.RunPython(update_priority_settings),
30
+ ]
@@ -0,0 +1,102 @@
1
+
2
+ import logging
3
+
4
+ from django.db import migrations
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+
9
+ def get_component_mappings() -> list:
10
+ """
11
+ Returns a list of tuples for updating existing component names and their attributes.
12
+
13
+ Each tuple contains:
14
+ - old_name (str): The current name of the component.
15
+ - new_name (str): The new name to assign to the component.
16
+ - slack_channel (str): The associated Slack channel for the component.
17
+ - group_name (str): The name of the group to which the component belongs.
18
+
19
+ Returns:
20
+ list: A list of tuples, each representing the details for a component update.
21
+ """
22
+ return [
23
+ # Marketplace
24
+ ("Product Discovery", "Navigation & Product discovery", "impact-nav-product-discovery", "Marketplace"),
25
+ ("User & Purchase", "Cart & funnel", "impact-cart-funnel", "Marketplace"),
26
+ ("Customer Management", "Customer login & signup", "impact-customer-login-signup", "Marketplace"),
27
+ ("Performance", "Web performance", "impact-web-performance", "Marketplace"),
28
+ # Catalog
29
+ ("Product Information", "Product Management", "impact-product-management", "Catalog"),
30
+ ("Taxonomy", "Product Structure", "impact-product-structure", "Catalog"),
31
+ ("Publication on website", "Catalog Exposition", "impact-catalog-exposition", "Catalog"),
32
+ # Payment Operations
33
+ ("Payment", "Payment", "impact-payment", "Payment Operations"),
34
+ # Operations
35
+ ("ManoFulfillment OPS", "MM Fulfillment", "impact-mm-fulfillment", "Operations"),
36
+ ("Helpcenter", "Helpcenter after sales", "impact-helpcenter-after-sales", "Operations"),
37
+ # Finance
38
+ ("Finance Operations", "Controlling", "impact-controlling", "Finance"),
39
+ # Platform
40
+ ("Spinak", "Spinak", "impact-spinak", "Platform"),
41
+ ("CDN", "CDN", "impact-cdn", "Platform"),
42
+ ("Gitlab", "Gitlab", "impact-gitlab", "Platform"),
43
+ # Data
44
+ ("data-platform", "Data Ingestion", "impact-data-ingestion", "Data"),
45
+ ("data-specialist-offer", "Data Warehouse", "impact-data-warehouse", "Data"),
46
+ ("data-wbr", "Data Analytics", "impact-data-analytics", "Data"),
47
+ # Security
48
+ ("Security Misc", "Bot management & rate limiting & WAF", "impact-bot-management-rate-limiting-waf", "Security"),
49
+ ("Attack", "Data leak", "impact-data-leak", "Security"),
50
+ ("System Compromise", "Exploited vulnerability", "impact-exploited-vulnerability", "Security"),
51
+ ("Personal Data Breach", "Stolen account(s) or IT materials", "impact-stolen-accounts-it-materials", "Security"),
52
+ ]
53
+
54
+
55
+ def update_component_names(apps, schema_editor):
56
+ Component = apps.get_model("incidents", "Component")
57
+ Group = apps.get_model("incidents", "Group")
58
+ component_mappings = get_component_mappings()
59
+
60
+ updated_count = 0
61
+
62
+ for old_name, new_name, _slack_channel, group_name in component_mappings:
63
+ try:
64
+ component = Component.objects.get(name=old_name)
65
+ logger.info(f"Updating: '{old_name}' to '{new_name}'")
66
+ component.name = new_name
67
+
68
+ group_instance = Group.objects.get(name=group_name)
69
+ component.group = group_instance
70
+ component.save()
71
+ updated_count += 1
72
+ except Exception:
73
+ logger.exception(f"Component '{old_name}' does not exist, cannot proceed with updates.")
74
+
75
+
76
+ def revert_component_names(apps, schema_editor):
77
+ Component = apps.get_model("incidents", "Component")
78
+ reverse_mappings = {new_name: old_name for old_name, new_name, _, _ in get_component_mappings()}
79
+
80
+ updated_count = 0
81
+
82
+ for new_name, old_name in reverse_mappings.items():
83
+
84
+ try:
85
+ component = Component.objects.get(name=new_name)
86
+ logger.info(f"Restoring '{new_name}' back to '{old_name}'")
87
+ component.name = old_name
88
+ component.save()
89
+ updated_count += 1
90
+ except Exception:
91
+ logger.exception(f"Component '{new_name}' does not exist, skipping restoration.")
92
+
93
+
94
+ class Migration(migrations.Migration):
95
+
96
+ dependencies = [
97
+ ("incidents", "0009_update_sla"),
98
+ ]
99
+
100
+ operations = [
101
+ migrations.RunPython(update_component_names, revert_component_names),
102
+ ]
@@ -0,0 +1,87 @@
1
+ import logging
2
+
3
+ from django.db import migrations, transaction
4
+
5
+ logger = logging.getLogger(__name__)
6
+
7
+ COMPONENT_MAPPING = {
8
+ "Internal Messaging": "Helpcenter after sales",
9
+ "Crisis Communication Room": "Other",
10
+ "data-visitors": "Data Ingestion",
11
+ "data-buyers": "Data Ingestion",
12
+ "Seller Order": "Seller Admin and Experience",
13
+ "Legacy": "Other",
14
+ "Authentification": "Customer login & signup",
15
+ "data-operations": "Data Ingestion",
16
+ "Test Incident": "Other",
17
+ "Legal": "Other",
18
+ }
19
+
20
+ # Global variable to store incidents with the previous component
21
+ # This will be used to restore the original component in case of rollback
22
+ INCIDENTS_BACKUP = {}
23
+
24
+
25
+ def forwards_func(apps, _schema_editor):
26
+ Incident = apps.get_model("incidents", "Incident")
27
+ Component = apps.get_model("incidents", "Component")
28
+ with transaction.atomic():
29
+ for old_component_name, new_component_name in COMPONENT_MAPPING.items():
30
+ old_component = Component.objects.filter(name=old_component_name).first()
31
+ if not old_component:
32
+ logger.error(f"Failed to find component {old_component_name}.")
33
+ continue
34
+ incidents = Incident.objects.filter(component=old_component)
35
+ ids = list(incidents.values_list("id", flat=True))
36
+ if ids:
37
+ INCIDENTS_BACKUP[old_component_name] = ids
38
+ new_component = Component.objects.filter(name=new_component_name).first()
39
+ if not new_component:
40
+ logger.error(f"Failed to find component {new_component_name}.")
41
+ continue
42
+ incidents.update(component=new_component)
43
+
44
+
45
+ def backwards_func(apps, _schema_editor):
46
+ Incident = apps.get_model("incidents", "Incident")
47
+ Component = apps.get_model("incidents", "Component")
48
+ with transaction.atomic():
49
+ for old_component_name, ids in INCIDENTS_BACKUP.items():
50
+ old_component = Component.objects.filter(name=old_component_name).first()
51
+ if not old_component:
52
+ logger.error(f"Failed to find component {old_component_name}.")
53
+ continue
54
+ Incident.objects.filter(id__in=ids).update(component=old_component)
55
+
56
+
57
+ def delete_old_components(apps, _schema_editor):
58
+ Component = apps.get_model("incidents", "Component")
59
+ try:
60
+ for old_name in COMPONENT_MAPPING:
61
+ Component.objects.filter(name=old_name).delete()
62
+ except Exception:
63
+ logger.exception(f"Failed to delete old components {old_name}.")
64
+
65
+
66
+ def recreate_old_components(apps, _schema_editor):
67
+ Component = apps.get_model("incidents", "Component")
68
+ try:
69
+ for old_name in COMPONENT_MAPPING:
70
+ Component.objects.get_or_create(name=old_name)
71
+ except Exception:
72
+ logger.exception(f"Failed to recreate old components {old_name}.")
73
+
74
+
75
+ class Migration(migrations.Migration):
76
+
77
+ dependencies = [
78
+ ("incidents", "0010_update_components"),
79
+ ]
80
+
81
+ operations = [
82
+ migrations.RunPython(forwards_func, backwards_func),
83
+ migrations.RunPython(
84
+ delete_old_components,
85
+ recreate_old_components,
86
+ ),
87
+ ]
@@ -667,7 +667,7 @@ class IncidentFilterSet(django_filters.FilterSet):
667
667
  )
668
668
  component = ModelMultipleChoiceFilter(
669
669
  queryset=component_filter_choices_queryset,
670
- label="Component",
670
+ label="Issue category",
671
671
  widget=GroupedCheckboxSelectMultiple,
672
672
  )
673
673
  created_at = FFDateRangeSingleFilter(field_name="created_at")
@@ -27,7 +27,7 @@
27
27
 
28
28
  <div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 sm:px-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-12">
29
29
  <div class="space-y-6 lg:col-start-1 lg:col-span-7">
30
- {% component "card" card_title="Component Information" id="component-information" %}
30
+ {% component "card" card_title="Issue category information" id="component-information" %}
31
31
  {% fill "card_content" %}
32
32
  <dl class="grid grid-cols-1 gap-x-4 gap-y-8 sm:grid-cols-2">
33
33
  {% if component.description %}
@@ -59,5 +59,5 @@ class ComponentsViewList(SingleTableMixin, FilterView):
59
59
  "metrics_period",
60
60
  "group",
61
61
  ]
62
- context["page_title"] = "Components List"
62
+ context["page_title"] = "Issue categories list"
63
63
  return context
@@ -88,8 +88,8 @@ class RaidJiraClient(JiraClient):
88
88
  f"Suggested team to be routed: *{suggested_team_routing}*"
89
89
  )
90
90
  if business_impact and business_impact != "N/A":
91
- if business_impact not in {"Low", "Medium", "High"}:
92
- raise ValueError("Business impact must be Low, Medium or High")
91
+ if business_impact not in {"Lowest", "Low", "Medium", "High", "Highest"}:
92
+ raise ValueError("Business impact must be Lowest, Low, Medium, High or Highest")
93
93
  extra_args["customfield_10936"] = {"value": business_impact}
94
94
  if platform:
95
95
  platform = platform.replace("platform-", "")
@@ -171,7 +171,7 @@ class UserGroup(models.Model):
171
171
  Component,
172
172
  related_name="usergroups",
173
173
  blank=True,
174
- help_text="Incident created with this usergroup automatically add the group members to these components.",
174
+ help_text="Incident created with this usergroup automatically add the group members to these issue categories.",
175
175
  )
176
176
 
177
177
  tag = models.CharField(
@@ -60,7 +60,7 @@ class CreateIncidentFormSlack(CreateIncidentForm):
60
60
  },
61
61
  "component": {
62
62
  "input": {
63
- "placeholder": "Select affected component",
63
+ "placeholder": "Select affected issue category",
64
64
  },
65
65
  },
66
66
  }
@@ -100,10 +100,11 @@ class SelectImpactModal(
100
100
  else:
101
101
  err_msg = f"Invalid priority data: {priority_data}" # type: ignore[unreachable]
102
102
  raise TypeError(err_msg)
103
+ process = ":slack: Slack :jira_new: Jira ticket" if open_incident_context.get("response_type") == "critical" else ":jira_new: Jira ticket"
103
104
  blocks.extend((
104
105
  DividerBlock(),
105
106
  SectionBlock(
106
- text=f"💡 Suggested priority: {priority} - {priority.description}\n⏱️ SLA: {priority.sla}"
107
+ text=f"💡 Selected priority: {priority} - {priority.description}\n⏱️ SLA: {priority.sla}\n{process}"
107
108
  ),
108
109
  ))
109
110
 
@@ -173,7 +174,7 @@ class SelectImpactModal(
173
174
  def _calculate_proposed_incident_type(
174
175
  suggested_priority_value: int,
175
176
  ) -> ResponseType:
176
- return "critical" if suggested_priority_value <= 2 else "normal"
177
+ return "critical" if suggested_priority_value <= 3 else "normal"
177
178
 
178
179
  @staticmethod
179
180
  def _update_private_metadata(
@@ -53,7 +53,7 @@ class UpdateStatusFormSlack(UpdateStatusForm):
53
53
  },
54
54
  "component": {
55
55
  "input": {
56
- "placeholder": "Select affected component",
56
+ "placeholder": "Select affected issue category",
57
57
  }
58
58
  },
59
59
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: firefighter-incident
3
- Version: 0.0.3
3
+ Version: 0.0.5
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/
@@ -6,7 +6,7 @@ gunicorn.conf.py,sha256=vHsTGjaKOr8FDMp6fTKYTX4AtokmPgYvvt5Mr0Q6APc,273
6
6
  main.py,sha256=CsbprHoOYhjCLpTJmq9Z_aRYFoFgWxoz2pDLuwm8Eqg,1558
7
7
  manage.py,sha256=5ivHGD13C6nJ8QvltKsJ9T9akA5he8da70HLWaEP3k8,689
8
8
  firefighter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- firefighter/_version.py,sha256=7Bz8oZwdLt8FP3QYrq7kiW8zbcYkC4dpOMGsCBlZ_8Y,511
9
+ firefighter/_version.py,sha256=WcvKdm4etz9_Q5VW_LRgfCR0icS2PEtbz-C1JY6enCc,511
10
10
  firefighter/api/__init__.py,sha256=JQW0Bv6xwGqy7ioxx3h6UGMzkkJ4DntDpbvV1Ncgi8k,136
11
11
  firefighter/api/admin.py,sha256=x9Ysy-GiYjb0rynmFdS9g56e6n24fkN0ouGy5QD9Yrc,4629
12
12
  firefighter/api/apps.py,sha256=P5uU1_gMrDfzurdMbfqw1Bnb2uNKKcMq17WBPg2sLhc,204
@@ -137,13 +137,13 @@ firefighter/incidents/signals.py,sha256=hUlPVVKSi9zuL4gz_Sa-HrDleYCASeMqKqA-kkHC
137
137
  firefighter/incidents/tables.py,sha256=SH-ScSw7SkwbdiAIApHn1eYfOuj7CRy__jY9gDadenk,3324
138
138
  firefighter/incidents/urls.py,sha256=4QJAIjmyE90_j8HLNExa4UpjM2CgasBOlx_r07ucjiM,2059
139
139
  firefighter/incidents/forms/__init__.py,sha256=OU0r5eZc2A0UJNsL83n8AI5EvwUvg4Yx0GyPBI7R73M,111
140
- firefighter/incidents/forms/close_incident.py,sha256=wn7NsQBe2SnHoVZG3mwhZfdo-z3cEFMhbHo9ZEAtBBw,935
141
- firefighter/incidents/forms/create_incident.py,sha256=uTjzEU8Qb7CQZUyNeKGovI0N5xIbrtxzUeF7tfId9es,2734
140
+ firefighter/incidents/forms/close_incident.py,sha256=syT5Lpr_WXNFT3KGCe1oy-FzOqMt98S7YEzovdnp7To,940
141
+ firefighter/incidents/forms/create_incident.py,sha256=Wpp0qqUJQs5-5BXrS-P5-dGvM5zgr9XqaEEl6tpNZi4,2739
142
142
  firefighter/incidents/forms/edit.py,sha256=2rQkiKak-vac-K3cIsqlGv4R5nhI7JLxw3DhFMXbWms,956
143
- firefighter/incidents/forms/select_impact.py,sha256=PdDr-g6oU10uO9wIuXYWP0CJpXQK41Z21nsKqDcXcYg,4620
143
+ firefighter/incidents/forms/select_impact.py,sha256=twgvfvyT6TL4yzv1dx7H6IWrncfGTeMf2Qg6x0hTWjw,4637
144
144
  firefighter/incidents/forms/update_key_events.py,sha256=1Xmnxe5OgZqLFS2HmMzQm3VGFPQipsdrLgKSwdh-fKc,4441
145
145
  firefighter/incidents/forms/update_roles.py,sha256=Q26UPfwAj-8N23RNZLQkvmHGnS1_j_X5KQWjJmPjMKY,3635
146
- firefighter/incidents/forms/update_status.py,sha256=1eJPRySAArirzOa4LFWlLgS0nLJPOZ6O7HoEpH2cARA,1029
146
+ firefighter/incidents/forms/update_status.py,sha256=QCRKfDhSYZhVsJ6oofQxOXGMWMDRQEDnH29y8YnFn_Y,1034
147
147
  firefighter/incidents/forms/utils.py,sha256=g2azRXQE4GwBNvq47z_Q51yKcGYSBzFyITTDkLlC_Gk,3651
148
148
  firefighter/incidents/migrations/0001_initial_oss.py,sha256=OCrPbxf90h3NW9xolGGcsAryHKptD1TtKj5FucjBjg8,60311
149
149
  firefighter/incidents/migrations/0002_alter_severity_name_alter_user_password_featureteam.py,sha256=YfIJhw_-Yqm8qrkbp01461bkcUr7v5Zy90oHjkY3bSA,1113
@@ -153,13 +153,16 @@ firefighter/incidents/migrations/0005_enable_from_p1_to_p5_priority.py,sha256=sB
153
153
  firefighter/incidents/migrations/0006_update_group_names.py,sha256=RHWre_VrnBmloFaqfoKA3TQtF8J2k5w1vzTEfGW81SQ,3172
154
154
  firefighter/incidents/migrations/0007_update_component_name.py,sha256=Al9k5Xx2_ea4u20MIp2blTErdv7jkGDYCLhGJ3P-gdw,6555
155
155
  firefighter/incidents/migrations/0008_impact_level.py,sha256=ZPDTYbt3q0gSEjMC7Nhl7LND9g4J4Hu5n_BO44sKFuc,8852
156
+ firefighter/incidents/migrations/0009_update_sla.py,sha256=cLbDmOKrcQOa6lb1kMd-xPJC1w7iDJuEsDTKymEnUMw,849
157
+ firefighter/incidents/migrations/0010_update_components.py,sha256=IwAj3axIXM95DrQcAZ8NBe-3GgL4NPrZqyBMdVqA8Lo,4301
158
+ firefighter/incidents/migrations/0011_update_incidents.py,sha256=tV4MA5ZJcqiRPteOLxJNZuhj7q6ncWXjAklm_9IzLbo,3190
156
159
  firefighter/incidents/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
160
  firefighter/incidents/models/__init__.py,sha256=dCNP-zRYNNDOZB3JDDWp7vCl084Jh6RgDT_iP57RkOY,862
158
161
  firefighter/incidents/models/component.py,sha256=7GyXKNFk1MZns6RUGLpkNw5u6He7H9N1LexzXbG4sBM,7445
159
162
  firefighter/incidents/models/environment.py,sha256=51txwua3dCrWZ1iSG3ZA8rbDn9c00pyMAZujl9gwE5c,827
160
163
  firefighter/incidents/models/group.py,sha256=MscG3IY5AdyJbmq8h4mMqEvLwmnJLor9rkd6CIycKho,685
161
164
  firefighter/incidents/models/impact.py,sha256=KyIDFdAAdlNfX0aUF8mOY1ZjSqKNeefjPU-VLDGN5zs,4715
162
- firefighter/incidents/models/incident.py,sha256=mQRCqw5O6IRg_Jj5hCbFg9Rsf5GX1DsHaiIU1-1ZKkU,26124
165
+ firefighter/incidents/models/incident.py,sha256=aQUAboXmHH9DO1Nq6AbB4w17dPQqn5iMTwT2r4TeJrA,26129
163
166
  firefighter/incidents/models/incident_cost.py,sha256=juwOfJKRaNQpOHkRUCHShDDba0FU98YjRPkU4I0ofAU,1346
164
167
  firefighter/incidents/models/incident_cost_type.py,sha256=wm8diry_VySJzIjC9M3Yavv2tYbvJgpN9UDb2gFRuH4,845
165
168
  firefighter/incidents/models/incident_membership.py,sha256=vvvBvYPxNlM98KdF81cMrDif8_Wl5TqqNkmf_z9lZO8,1745
@@ -218,7 +221,7 @@ firefighter/incidents/templates/layouts/partials/status_pill.html,sha256=D9V8bnO
218
221
  firefighter/incidents/templates/layouts/partials/table.html,sha256=eZE4kh0nQwGik6qc7A0O_jHyZcg32uzHc1pkjJRt6hw,1567
219
222
  firefighter/incidents/templates/layouts/partials/user_card.html,sha256=LgYHSpqC0BAhVENMSmLpow8jlPnh5uRvHzooJlJna6w,802
220
223
  firefighter/incidents/templates/layouts/partials/user_tooltip.html,sha256=KkVPpoODXIzrm6iItTg5RQphBGruQw4dFdOgAuGRt1E,562
221
- firefighter/incidents/templates/pages/component_detail.html,sha256=vf0WveYRT0Qao6HgpJZPuro6VPlpkQ3c8I3u6SiNcSQ,5272
224
+ firefighter/incidents/templates/pages/component_detail.html,sha256=WLO9zg8zDCUtINOHK9xP5dKd5WaB8UWT6JNjLjYSQKs,5277
222
225
  firefighter/incidents/templates/pages/component_list.html,sha256=Dq7Fo-J-S7fM3v1ByiwAh8XH_f5LSpzXOKiujjRoVAY,1715
223
226
  firefighter/incidents/templates/pages/dashboard.html,sha256=jGfTCTdyLt3fWtX66HVG1bNgpffV4J7jagVgksCGsSE,1743
224
227
  firefighter/incidents/templates/pages/docs_metrics.html,sha256=q10CCPwjujuj9_h7Mj4-NgP6BMt4TJ6Z3D20W9qZbaQ,3744
@@ -239,7 +242,7 @@ firefighter/incidents/views/reports.py,sha256=4h9z1QIhnDkzEyqvi-GI_j9Oem2igvqTk0
239
242
  firefighter/incidents/views/views.py,sha256=MPcrqtvA0_xoGX8Bw6v-uMBp6RiJY0-_HTQ-en-zJ8Q,10487
240
243
  firefighter/incidents/views/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
244
  firefighter/incidents/views/components/details.py,sha256=4pBCAS2gLYAm4CwTJ5mkw43dq8BkGknsAwrQgeMF21Q,942
242
- firefighter/incidents/views/components/list.py,sha256=NR_gf13DLBebK0aAzJuofVVQgzTRc5qgLGrwgjJ-rcc,2124
245
+ firefighter/incidents/views/components/list.py,sha256=B4XRnNG2tcehKuTT4wznPcI93lkLxRyRNEXSOsFFiVo,2130
243
246
  firefighter/incidents/views/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
247
  firefighter/incidents/views/docs/metrics.py,sha256=n2-chgxTokOqCx-W5YZRHK3pYmzvz0b_RF6s1de2Fcw,1713
245
248
  firefighter/incidents/views/docs/role_types.py,sha256=88dGBAL7NMC24lyqLDN0jGnh5-ILRI5afL2Wig7LrFs,1122
@@ -288,7 +291,7 @@ firefighter/pagerduty/views/oncall_trigger.py,sha256=LYHpWyEaR6O8NazmsTl5ydtw1XH
288
291
  firefighter/raid/__init__.py,sha256=nMNmvHCSkyLQsdhTow7myMU62vXk1e755gUntVfFFlY,154
289
292
  firefighter/raid/admin.py,sha256=YaqjJ7UcoEf_72kKVVN-O2Pp7_9lGuUdc-nHSQZYEYM,1405
290
293
  firefighter/raid/apps.py,sha256=BUkaZSu45Ghdpx1XnE3DaFD4SC2SeUtSDZOTYynte5k,1655
291
- firefighter/raid/client.py,sha256=RyPmt_sMLVABROahqpYjOpEFwEPXLm5qQlzuzgdJ9_A,7955
294
+ firefighter/raid/client.py,sha256=JCeuKO2j1EYRHEKWn89fl9vF7KjW5XQVsu9MYrVOi48,7993
292
295
  firefighter/raid/forms.py,sha256=oJOPHYFtwlffuPgFi4lbbOCoKhwianrvafNicOmT_-c,15816
293
296
  firefighter/raid/messages.py,sha256=e75kwi0hCe5ChwU4t-_6Q3Rcy22MLLdVSsYyjvG2SCM,5542
294
297
  firefighter/raid/models.py,sha256=FNfPHvlF9h09LxL2a4zFPfc0raArmufywjzTdqGATms,2662
@@ -335,7 +338,7 @@ firefighter/slack/models/incident_channel.py,sha256=MKzrGPDEz7CcumrnbWZBcKAHoScy
335
338
  firefighter/slack/models/message.py,sha256=E1MQoZJz4MsgCeqgP94_jtSrz2RYuWdoys8tz4Tfboc,4727
336
339
  firefighter/slack/models/sos.py,sha256=Sji-7DxgsrLs7vFRJKPw7nmYyo2tIjNwoTcmdCmzEvA,1418
337
340
  firefighter/slack/models/user.py,sha256=744fulTB00UQzsZwxf8CiQNMfEKmYY6y37x6zm6g14I,17218
338
- firefighter/slack/models/user_group.py,sha256=cUxC39bYtzpGyr_ZHKD0LjZQLWLKmOU8arx9jzVB2V4,7098
341
+ firefighter/slack/models/user_group.py,sha256=NyqtC0C_Vur2xZ6t7T7d7Z30WZ8EEovczJ0uYZVDC7o,7104
339
342
  firefighter/slack/signals/__init__.py,sha256=dqMf2x-PVKgmwzH2d9uHuQ8hZ4fbu74eRd4Ij2_dNSg,186
340
343
  firefighter/slack/signals/create_incident_conversation.py,sha256=uybiqCgPlWYq2AA2FKNkEmqhDYxDy-h0ebT-RBVpx9I,4965
341
344
  firefighter/slack/signals/get_users.py,sha256=_xPsZFgcxd87Vuhv6FttttrxnIb0z65-It8H3FZlHOM,2271
@@ -382,7 +385,7 @@ firefighter/slack/views/modals/status.py,sha256=C8-eJRtquSeaHe568SC7yCFef1k14m2_
382
385
  firefighter/slack/views/modals/trigger_oncall.py,sha256=h_LAD5X5rjMFWiDYTEp5VB9OaF7sTvKZhNaW3KQkw5M,5065
383
386
  firefighter/slack/views/modals/update.py,sha256=OF9sf-Z6IiviNmjN28MQNYiUbJ5tha0MdHUQyPpVFiY,2150
384
387
  firefighter/slack/views/modals/update_roles.py,sha256=De3Gv67MZQHyNdonX3S99F5MtKF_Rj3y71gdWibxBaM,2419
385
- firefighter/slack/views/modals/update_status.py,sha256=b1eAzD2_BfAbSirciQQ2jsmyZFQaOQ7gRHSlcKVazjw,4467
388
+ firefighter/slack/views/modals/update_status.py,sha256=ao9ZPCw9tgxdbyLGXsXRLL-LRB1_bxaoaa1ORoh0-nA,4472
386
389
  firefighter/slack/views/modals/base_modal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
387
390
  firefighter/slack/views/modals/base_modal/base.py,sha256=7mvOxZTtegSmitSMnDvu8BK0qLUXoudUsda6CaLjdkY,12479
388
391
  firefighter/slack/views/modals/base_modal/base_mixins.py,sha256=Xl1koQsPpHO_kKIiuSSJHJnIBmytDXseI1KcAZQZC3M,230
@@ -391,11 +394,11 @@ firefighter/slack/views/modals/base_modal/mixins.py,sha256=c7WYs0aXKXVktEMNSZ8IU
391
394
  firefighter/slack/views/modals/base_modal/modal_utils.py,sha256=1uHTlLxxeXUQttH3bHaehJwCuI6a-h04s-GzdnVA4sI,2459
392
395
  firefighter/slack/views/modals/opening/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
393
396
  firefighter/slack/views/modals/opening/check_current_incidents.py,sha256=28GN0SXP7rVPa55arX1aI98k45w9568GCRDA73eCHEM,2535
394
- firefighter/slack/views/modals/opening/select_impact.py,sha256=KccopXnlBjXi5-iZW7H48nhnLregHsH68BHia5ZxS9M,8007
397
+ firefighter/slack/views/modals/opening/select_impact.py,sha256=P38gsWJ2UmHG9qunsrO9cl1qwZdGU572SYiafh8QLUU,8168
395
398
  firefighter/slack/views/modals/opening/set_details.py,sha256=i6zQM2FYz3Z6s5AZH7lXgB2e8yjS0rDwgfMBZaiOqIw,5791
396
399
  firefighter/slack/views/modals/opening/types.py,sha256=ETpp0DAz5OMI5h7iv62Of7yJCbI-Q4-3kKSS6msPQeY,563
397
400
  firefighter/slack/views/modals/opening/details/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
398
- firefighter/slack/views/modals/opening/details/critical.py,sha256=xFSt4Cl8250toM7sr3WrZSp6xIFYuEnROgMtshK-xkk,2849
401
+ firefighter/slack/views/modals/opening/details/critical.py,sha256=-APRvkjopLwLPv3qPGTZfgS0d1bpb8NM0OXppRdUK94,2854
399
402
  firefighter_fixtures/incidents/components.json,sha256=qVVG201I4V-9f4Z3ZB0n9C4yZOJ8Qkz9v9MNAlqT8L8,21229
400
403
  firefighter_fixtures/incidents/environments.json,sha256=5H_F08x7moMKz-H6OIUVaJGtmyKEESXLlG5cfXX0IA4,1039
401
404
  firefighter_fixtures/incidents/groups.json,sha256=mwrpUk9tvZa0RnT1T0aec_nnMsVZhR2GXS7pmrAK0y8,2555
@@ -417,7 +420,7 @@ firefighter_tests/test_firefighter/test_logging.py,sha256=4HUH73vLDwmOCpMiXwDasM
417
420
  firefighter_tests/test_firefighter/test_urls.py,sha256=UMGx4oW98RoL0ceePkIIKEVjbHdFECvQuGNXYAJForQ,4839
418
421
  firefighter_tests/test_incidents/test_incident_urls.py,sha256=vQy9f1ewJK3N9cjVQDBnLaZjhtiBv5TzoRiGUdV3u5E,3769
419
422
  firefighter_tests/test_incidents/test_forms/test_form_select_impact.py,sha256=hcDqy3zXJ-klC0tYGWogxrDLDsaD5i4xNSejY0wBbHE,3210
420
- firefighter_tests/test_incidents/test_forms/test_form_utils.py,sha256=Xa2ePIjrJBq4LATPOZhfhszZJdAOGONxtDuxik1dLJw,2289
423
+ firefighter_tests/test_incidents/test_forms/test_form_utils.py,sha256=24ATxxAjkLlz7cj_jIQZvuQvtrfieeh4oaIM90yQrlc,2299
421
424
  firefighter_tests/test_incidents/test_forms/test_update_key_events.py,sha256=rHRGRU9iFXDdMr_kK3pMB7gyeZuMf7Dyq8bRZkddBC4,1644
422
425
  firefighter_tests/test_incidents/test_models/test_incident_model.py,sha256=Kl2dQ0P3qruAaQP5M8WRYJiff-4SpmxpFYHYmA9Xv3k,879
423
426
  firefighter_tests/test_incidents/test_models/test_migrations/test_incident_migrations.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -432,13 +435,13 @@ firefighter_tests/test_slack/test_slack_utils.py,sha256=9PLobMNXh3xDyFuwzcQFpKJh
432
435
  firefighter_tests/test_slack/test_models/test_conversations.py,sha256=t3ttmgwiu7c-N55iU3XZPmrkEhvkTzJoXszJncy4Bts,793
433
436
  firefighter_tests/test_slack/test_models/test_incident_channel.py,sha256=qWoGe9iadmK6-R8usWvjH87AHRkvhG_dHQeC3kHeJrs,17487
434
437
  firefighter_tests/test_slack/test_models/test_slack_user.py,sha256=uzur-Rf03I5dpUTO4ZI6O1arBUrAorg1Zvgshf8M-J4,7000
435
- firefighter_tests/test_slack/views/modals/test_close.py,sha256=se-5qUm6GB9yUq7UAKPys2urlJ_bFKApNlBnbwGY4tU,42884
438
+ firefighter_tests/test_slack/views/modals/test_close.py,sha256=kcwGwonjIiniGb5f78ZwlKjuvYB-xat-SrbouV9VCEc,42894
436
439
  firefighter_tests/test_slack/views/modals/test_open.py,sha256=Iatphd7vnrEMrv8ysKxDVDAuZNEsVXBksIEpIaDHQss,4100
437
440
  firefighter_tests/test_slack/views/modals/test_send_sos.py,sha256=_rE6jD-gOzcGyhlY0R9GzlGtPx65oOOguJYdENgxtLc,1289
438
441
  firefighter_tests/test_slack/views/modals/test_status.py,sha256=oQzPfwdg2tkbo9nfkO1GfS3WydxqSC6vy1AZjZDKT30,2226
439
- firefighter_tests/test_slack/views/modals/test_update_status.py,sha256=7wphJod5boKL6_rspZOfsURW2pbQ-2VYIoD-jBCzd84,39370
440
- firefighter_incident-0.0.3.dist-info/METADATA,sha256=q-2MB0rv7ZwvyI5ykMJOiBzkEUX5SzVbNMDVEDAt_mw,5487
441
- firefighter_incident-0.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
442
- firefighter_incident-0.0.3.dist-info/entry_points.txt,sha256=c13meJbv7YNmYz7MipMOQwzQ5IeFOPXUBYAJ44XMQsM,61
443
- firefighter_incident-0.0.3.dist-info/licenses/LICENSE,sha256=krRiGp-a9-1nH1bWpBEdxyTKLhjLmn6DMVVoIb0zF90,1087
444
- firefighter_incident-0.0.3.dist-info/RECORD,,
442
+ firefighter_tests/test_slack/views/modals/test_update_status.py,sha256=Y8Oa_fraj1vtaGig9Y28_6tOWvMrRPS-wyg3rY-DHBk,39380
443
+ firefighter_incident-0.0.5.dist-info/METADATA,sha256=MrJmuQfWF1YiuJkIxwM4hJ5vmOnbW7YMg8ycN9fZZpM,5487
444
+ firefighter_incident-0.0.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
445
+ firefighter_incident-0.0.5.dist-info/entry_points.txt,sha256=c13meJbv7YNmYz7MipMOQwzQ5IeFOPXUBYAJ44XMQsM,61
446
+ firefighter_incident-0.0.5.dist-info/licenses/LICENSE,sha256=krRiGp-a9-1nH1bWpBEdxyTKLhjLmn6DMVVoIb0zF90,1087
447
+ firefighter_incident-0.0.5.dist-info/RECORD,,
@@ -28,8 +28,8 @@ def group() -> Group:
28
28
  @pytest.fixture
29
29
  def components(group: Group):
30
30
  return [
31
- Component.objects.create(name="Component 1", group=group, order=1),
32
- Component.objects.create(name="Component 2", group=group, order=2),
31
+ Component.objects.create(name="Issue category 1", group=group, order=1),
32
+ Component.objects.create(name="Issue category 2", group=group, order=2),
33
33
  ]
34
34
 
35
35
 
@@ -221,7 +221,7 @@ valid_submission = {
221
221
  {
222
222
  "type": "input",
223
223
  "block_id": "component",
224
- "label": {"type": "plain_text", "text": "Component", "emoji": True},
224
+ "label": {"type": "plain_text", "text": "Issue category", "emoji": True},
225
225
  "optional": False,
226
226
  "dispatch_action": False,
227
227
  "element": {
@@ -229,7 +229,7 @@ valid_submission = {
229
229
  "action_id": "component",
230
230
  "placeholder": {
231
231
  "type": "plain_text",
232
- "text": "Select affected component",
232
+ "text": "Select affected issue category",
233
233
  "emoji": True,
234
234
  },
235
235
  "option_groups": [
@@ -251,7 +251,7 @@ valid_submission = {
251
251
  {
252
252
  "type": "input",
253
253
  "block_id": "component",
254
- "label": {"type": "plain_text", "text": "Component", "emoji": True},
254
+ "label": {"type": "plain_text", "text": "Issue category", "emoji": True},
255
255
  "optional": False,
256
256
  "dispatch_action": False,
257
257
  "element": {
@@ -259,7 +259,7 @@ valid_submission = {
259
259
  "action_id": "component",
260
260
  "placeholder": {
261
261
  "type": "plain_text",
262
- "text": "Select affected component",
262
+ "text": "Select affected issue category",
263
263
  "emoji": True,
264
264
  },
265
265
  "initial_option": {