Skip to content
This repository was archived by the owner on Sep 3, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/dispatch/case/priority/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
default_case_priorities = [
{
"name": "Low",
"description": "This case should be triaged on a best-effort basis.",
"view_order": 1,
"color": "#8bc34a",
"default": True,
"enabled": True,
},
{
"name": "Medium",
"description": "This case should be triaged within 24hrs of case creation.",
"view_order": 2,
"color": "#ffeb3b",
"default": False,
"enabled": True,
},
{
"name": "High",
"description": "This case should be triaged within 8hrs of case creation.",
"view_order": 3,
"color": "#ff9800",
"default": False,
"enabled": True,
},
{
"name": "Critical",
"description": "This case should be triaged immediately.",
"view_order": 4,
"color": "#e53935",
"default": False,
"enabled": True,
},
{
"name": "Optional",
"description": "Triage of this case is optional.",
"view_order": 5,
"color": "#9e9e9e",
"default": False,
"enabled": True,
},
]
42 changes: 42 additions & 0 deletions src/dispatch/case/severity/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
default_case_severities = [
{
"name": "Undetermined",
"description": "The severity of the case has not yet been determined.",
"view_order": 1,
"color": "#9e9e9e",
"default": True,
"enabled": True,
},
{
"name": "Low",
"description": "Low severity.",
"view_order": 2,
"color": "#8bc34a",
"default": False,
"enabled": True,
},
{
"name": "Medium",
"description": "Medium severity.",
"view_order": 3,
"color": "#ffeb3b",
"default": False,
"enabled": True,
},
{
"name": "High",
"description": "High severity.",
"view_order": 4,
"color": "#ff9800",
"default": False,
"enabled": True,
},
{
"name": "Critical",
"description": "Critical severity.",
"view_order": 5,
"color": "#e53935",
"default": False,
"enabled": True,
},
]
35 changes: 35 additions & 0 deletions src/dispatch/incident/priority/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
default_incident_priorities = [
{
"name": "Low",
"description": "This incident may require your team's attention during working hours until the incident is stable.",
"view_order": 1,
"tactical_report_reminder": 12,
"executive_report_reminder": 9999,
"color": "#8bc34a",
"page_commander": False,
"default": True,
"enabled": True,
},
{
"name": "Medium",
"description": "This incident may require your team's full attention during waking hours, including weekends, until the incident is stable.",
"view_order": 2,
"tactical_report_reminder": 6,
"executive_report_reminder": 12,
"color": "#ff9800",
"page_commander": False,
"default": False,
"enabled": True,
},
{
"name": "High",
"description": "This incident may require your team's full attention 24x7, and should be prioritized over all other work, until the incident is stable.",
"view_order": 3,
"tactical_report_reminder": 2,
"executive_report_reminder": 6,
"color": "#e53935",
"page_commander": False,
"default": False,
"enabled": True,
},
]
42 changes: 42 additions & 0 deletions src/dispatch/incident/severity/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
default_incident_severities = [
{
"name": "Undetermined",
"description": "The severity of the incident has not yet been determined.",
"view_order": 1,
"color": "#9e9e9e",
"default": True,
"enabled": True,
},
{
"name": "Low",
"description": "Low severity.",
"view_order": 2,
"color": "#8bc34a",
"default": False,
"enabled": True,
},
{
"name": "Medium",
"description": "Medium severity.",
"view_order": 3,
"color": "#ffeb3b",
"default": False,
"enabled": True,
},
{
"name": "High",
"description": "High severity.",
"view_order": 4,
"color": "#ff9800",
"default": False,
"enabled": True,
},
{
"name": "Critical",
"description": "Critical severity.",
"view_order": 5,
"color": "#e53935",
"default": False,
"enabled": True,
},
]
8 changes: 8 additions & 0 deletions src/dispatch/incident_cost_type/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
default_incident_cost_type = {
"name": "Response Cost",
"description": "Cost associated with handling an incident.",
"category": "Primary",
"details": {},
"default": True,
"editable": False,
}
106 changes: 106 additions & 0 deletions src/dispatch/project/flows.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
from dispatch.decorators import background_task
from dispatch.case.priority import service as case_priority_service
from dispatch.case.priority.config import default_case_priorities
from dispatch.case.priority.models import CasePriorityCreate
from dispatch.case.severity import service as case_severity_service
from dispatch.case.severity.config import default_case_severities
from dispatch.case.severity.models import CaseSeverityCreate
from dispatch.incident.priority import service as incident_priority_service
from dispatch.incident.priority.config import default_incident_priorities
from dispatch.incident.priority.models import IncidentPriorityCreate
from dispatch.incident.severity import service as incident_severity_service
from dispatch.incident.severity.config import default_incident_severities
from dispatch.incident.severity.models import IncidentSeverityCreate
from dispatch.incident_cost_type import service as incident_cost_type_service
from dispatch.incident_cost_type.config import default_incident_cost_type
from dispatch.incident_cost_type.models import IncidentCostTypeCreate
from dispatch.plugin import service as plugin_service
from dispatch.plugin.models import PluginInstanceCreate

from .service import get


@background_task
def project_create_flow(*, organization_slug: str, project_id: int, db_session=None):
project = get(db_session=db_session, project_id=project_id)

# Add all plugins in disabled mode
plugins = plugin_service.get_all(db_session=db_session)
for plugin in plugins:
plugin_instance_in = PluginInstanceCreate(
project=project, plugin=plugin, configuration={}, enabled=False
)
plugin_service.create_instance(db_session=db_session, plugin_instance_in=plugin_instance_in)

# Create default incident priorities
for priority in default_incident_priorities:
incident_priority_in = IncidentPriorityCreate(
name=priority["name"],
description=priority["description"],
page_commander=priority["page_commander"],
tactical_report_reminder=priority["tactical_report_reminder"],
executive_report_reminder=priority["executive_report_reminder"],
project=project,
default=priority["default"],
enabled=priority["enabled"],
view_order=priority["view_order"],
color=priority["color"],
)
incident_priority_service.create(
db_session=db_session, incident_priority_in=incident_priority_in
)

# Create default incident severities
for severity in default_incident_severities:
incident_severity_in = IncidentSeverityCreate(
name=severity["name"],
description=severity["description"],
project=project,
default=severity["default"],
enabled=severity["enabled"],
view_order=severity["view_order"],
color=severity["color"],
)
incident_severity_service.create(
db_session=db_session, incident_severity_in=incident_severity_in
)

# Create default incident response cost
incident_cost_type_in = IncidentCostTypeCreate(
name=default_incident_cost_type["name"],
description=default_incident_cost_type["description"],
category=default_incident_cost_type["category"],
details=default_incident_cost_type["details"],
default=default_incident_cost_type["default"],
editable=default_incident_cost_type["editable"],
project=project,
)
incident_cost_type_service.create(
db_session=db_session, incident_cost_type_in=incident_cost_type_in
)

# Create default case priorities
for priority in default_case_priorities:
case_priority_in = CasePriorityCreate(
name=priority["name"],
description=priority["description"],
project=project,
default=priority["default"],
enabled=priority["enabled"],
view_order=priority["view_order"],
color=priority["color"],
)
case_priority_service.create(db_session=db_session, case_priority_in=case_priority_in)

# Create default case severities
for severity in default_case_severities:
case_severity_in = CaseSeverityCreate(
name=severity["name"],
description=severity["description"],
project=project,
default=severity["default"],
enabled=severity["enabled"],
view_order=severity["view_order"],
color=severity["color"],
)
case_severity_service.create(db_session=db_session, case_severity_in=case_severity_in)
23 changes: 17 additions & 6 deletions src/dispatch/project/views.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, status
from pydantic.error_wrappers import ErrorWrapper, ValidationError
from sqlalchemy.orm import Session

from dispatch.exceptions import ExistsError
from sqlalchemy.orm import Session

from dispatch.auth.permissions import (
ProjectCreatePermission,
PermissionsDependency,
ProjectCreatePermission,
ProjectUpdatePermission,
)

from dispatch.database.core import get_db
from dispatch.database.service import common_parameters, search_filter_sort_paginate
from dispatch.models import PrimaryKey
from dispatch.exceptions import ExistsError
from dispatch.models import OrganizationSlug, PrimaryKey

from .flows import project_create_flow
from .models import (
ProjectCreate,
ProjectRead,
Expand All @@ -22,6 +23,7 @@
)
from .service import create, delete, get, get_by_name, update


router = APIRouter()


Expand All @@ -37,7 +39,13 @@ def get_projects(common: dict = Depends(common_parameters)):
summary="Create a new project.",
dependencies=[Depends(PermissionsDependency([ProjectCreatePermission]))],
)
def create_project(*, db_session: Session = Depends(get_db), project_in: ProjectCreate):
def create_project(
*,
db_session: Session = Depends(get_db),
organization: OrganizationSlug,
project_in: ProjectCreate,
background_tasks: BackgroundTasks,
):
"""Create a new project."""
project = get_by_name(db_session=db_session, name=project_in.name)
if project:
Expand All @@ -47,6 +55,9 @@ def create_project(*, db_session: Session = Depends(get_db), project_in: Project
)

project = create(db_session=db_session, project_in=project_in)
background_tasks.add_task(
project_create_flow, project_id=project.id, organization_slug=organization
)
return project


Expand Down