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 15 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
13 changes: 2 additions & 11 deletions src/dispatch/alembic/versions/7ea14a81dc59_.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ class DispatchUserProject(Base, TimeStampMixin):
dispatch_user_id = sa.Column(sa.Integer, sa.ForeignKey("dispatch_user.id"))
project_id = sa.Column(sa.Integer, sa.ForeignKey("project.id"))
role = sa.Column(sa.String, nullable=False, default=UserRoles.member)

dispatch_user = relationship(DispatchUser, backref="projects")


Expand All @@ -115,14 +114,6 @@ def upgrade():
# Create organization table
Organization.__table__.create(bind)

# op.create_index(
# "ix_organization_search_vector",
# "organization",
# ["search_vector"],
# unique=False,
# postgresql_using="gin",
# )

default_org = Organization(
name="default", default=True, description="Default dispatch organization."
)
Expand Down Expand Up @@ -181,7 +172,7 @@ def upgrade():
sa.PrimaryKeyConstraint("id"),
)

# associate users with default project
# associate users with the default project
op.create_table(
"dispatch_user_project",
sa.Column("id", sa.Integer(), nullable=False),
Expand Down Expand Up @@ -214,7 +205,7 @@ def upgrade():
)
)

# everybody is use a regular project member for now
# everybody is a regular project member for now
session.add(DispatchUserProject(dispatch_user_id=u.id, project_id=default_project.id))

# we don't need role anymore
Expand Down
4 changes: 2 additions & 2 deletions src/dispatch/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from dispatch.tag_type.views import router as tag_type_router
from dispatch.task.views import router as task_router
from dispatch.team.views import router as team_contact_router
from dispatch.term.views import router as team_router
from dispatch.term.views import router as term_router
from dispatch.workflow.views import router as workflow_router

from .config import DISPATCH_AUTHENTICATION_PROVIDER_SLUG
Expand Down Expand Up @@ -68,7 +68,7 @@
authenticated_api_router.include_router(
definition_router, prefix="/{organization}/definitions", tags=["definitions"]
)
authenticated_api_router.include_router(team_router, prefix="/{organization}/terms", tags=["terms"])
authenticated_api_router.include_router(term_router, prefix="/{organization}/terms", tags=["terms"])
authenticated_api_router.include_router(task_router, prefix="/{organization}/tasks", tags=["tasks"])
authenticated_api_router.include_router(
search_router, prefix="/{organization}/search", tags=["search"]
Expand Down
11 changes: 6 additions & 5 deletions src/dispatch/auth/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ def has_required_permissions(

current_user = get_current_user(db_session=request.state.db, request=request)

for org in current_user.organizations:
if org.id == current_organization.id:
if org.role == UserRoles.manager:
for user_org in current_user.organizations:
if user_org.organization.id == current_organization.id:
if user_org.role == UserRoles.manager:
return True


Expand All @@ -131,6 +131,7 @@ def has_required_permissions(
request: Request,
) -> bool:
current_project = None

project_id = request.path_params.get("project_id")
if project_id:
current_project = project_service.get(
Expand All @@ -144,11 +145,11 @@ def has_required_permissions(
)
current_project = current_incident.project

current_user = get_current_user(db_session=request.state.db, request=request)

if not current_project:
return

current_user = get_current_user(db_session=request.state.db, request=request)

for p in current_user.projects:
if p.project_id == current_project.id:
if p.role == UserRoles.admin:
Expand Down
4 changes: 2 additions & 2 deletions src/dispatch/auth/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ def create(*, db_session, user_in: UserRegister) -> DispatchUser:
DispatchUserOrganization(dispatch_user_id=user.id, organization_id=default_org.id)
)

# get default project
# get the default project
default_project = project_service.get_default(db_session=db_session)

# add user to the default project
# add the user to the default project
db_session.add(DispatchUserProject(dispatch_user_id=user.id, project_id=default_project.id))

db_session.commit()
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ def init_database():
project_in=ProjectCreate(
name="default",
default=True,
description="Default dispatch project",
description="Default dispatch project.",
organization_id=default_org.id,
),
)
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/database/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@


def restricted_incident_filter(query: orm.Query, current_user: DispatchUser):
"""Adds additional incident filters to query (usually for permissions)"""
"""Adds additional incident filters to query (usually for permissions)."""
return (
query.join(Participant, Incident.id == Participant.incident_id)
.join(IndividualContact)
Expand Down
11 changes: 5 additions & 6 deletions src/dispatch/incident/flows.py
Original file line number Diff line number Diff line change
Expand Up @@ -552,15 +552,14 @@ def incident_create_flow(*, incident_id: int, checkpoint: str = None, db_session
db_session=db_session, project_id=incident.project.id, plugin_type="storage"
)
if storage_plugin:
# we create storage resource
# we create the storage resource
try:
if group_plugin:
group_emails = []
if tactical_group and notification_group:
storage = create_incident_storage(
incident, [tactical_group["email"], notification_group["email"]], db_session
)
else:
storage = create_incident_storage(incident, [], db_session)
group_emails = [tactical_group["email"], notification_group["email"]]

storage = create_incident_storage(incident, group_emails, db_session)
else:
# we don't have a group so add participants directly
storage = create_incident_storage(incident, participant_emails, db_session)
Expand Down
3 changes: 1 addition & 2 deletions src/dispatch/incident/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,14 @@ def create(
visibility: str = None,
) -> Incident:
"""Creates a new incident."""
# We get the incident type by name
if not project:
project = project_service.get_default(db_session=db_session)
if not project:
raise Exception("No project specificed and no default has been defined.")

else:
project = project_service.get_by_name(db_session=db_session, name=project["name"])

# We get the incident type by name
if not incident_type:
incident_type = incident_type_service.get_default(db_session=db_session)
if not incident_type:
Expand Down
2 changes: 1 addition & 1 deletion src/dispatch/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ async def db_session_middleware(request: Request, call_next):
session = sessionmaker(bind=engine)

if not session:
response = Response("Internal Server Error", status_code=404)
return response

request.state.db = session()
response = await call_next(request)
Expand Down
6 changes: 3 additions & 3 deletions src/dispatch/organization/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ def get_all(*, db_session) -> List[Optional[Organization]]:


def create(*, db_session, organization_in: OrganizationCreate) -> Organization:
team = Organization(
organization = Organization(
**organization_in.dict(),
)
db_session.add(team)
db_session.add(organization)
db_session.commit()
return team
return organization


def get_or_create(*, db_session, organization_in: OrganizationCreate) -> Organization:
Expand Down
33 changes: 6 additions & 27 deletions src/dispatch/organization/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sqlalchemy.orm import Session

from dispatch.database.core import get_db
from dispatch.database.service import search_filter_sort_paginate
from dispatch.database.service import common_parameters, search_filter_sort_paginate

from dispatch.auth.permissions import (
OrganizationOwnerPermission,
Expand All @@ -23,32 +23,11 @@


@router.get("/", response_model=OrganizationPagination)
def get_organizations(
db_session: Session = Depends(get_db),
page: int = 1,
items_per_page: int = Query(5, alias="itemsPerPage"),
query_str: str = Query(None, alias="q"),
sort_by: List[str] = Query([], alias="sortBy[]"),
descending: List[bool] = Query([], alias="descending[]"),
fields: List[str] = Query([], alias="fields[]"),
ops: List[str] = Query([], alias="ops[]"),
values: List[str] = Query([], alias="values[]"),
):
def get_organizations(common: dict = Depends(common_parameters)):
"""
Get all organizations.
"""
return search_filter_sort_paginate(
db_session=db_session,
model="Organization",
query_str=query_str,
page=page,
items_per_page=items_per_page,
sort_by=sort_by,
descending=descending,
fields=fields,
values=values,
ops=ops,
)
return search_filter_sort_paginate(model="Organization", **common)


@router.post(
Expand All @@ -65,7 +44,7 @@ def create_organization(
organization = get_by_name(db_session=db_session, name=organization_in.name)
if organization:
raise HTTPException(
status_code=400, detail="The organization with this name already exists."
status_code=400, detail="An organization with this name already exists."
)
organization = create(db_session=db_session, organization_in=organization_in)
return organization
Expand All @@ -78,7 +57,7 @@ def get_organization(*, db_session: Session = Depends(get_db), organization_id:
"""
organization = get(db_session=db_session, organization_id=organization_id)
if not organization:
raise HTTPException(status_code=404, detail="The organization with this id does not exist.")
raise HTTPException(status_code=404, detail="An organization with this id does not exist.")
return organization


Expand All @@ -98,7 +77,7 @@ def update_organization(
"""
organization = get(db_session=db_session, organization_id=organization_id)
if not organization:
raise HTTPException(status_code=404, detail="The organization with this id does not exist.")
raise HTTPException(status_code=404, detail="An organization with this id does not exist.")
organization = update(
db_session=db_session, organization=organization, organization_in=organization_in
)
Expand Down
6 changes: 3 additions & 3 deletions src/dispatch/project/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ def get(*, db_session, project_id: int) -> Optional[Project]:
return db_session.query(Project).filter(Project.id == project_id).first()


def get_default(*, db_session):
"""Returns default project."""
def get_default(*, db_session) -> Optional[Project]:
"""Returns the default project."""
return db_session.query(Project).filter(Project.default == true()).one_or_none()


def get_by_name(*, db_session, name: str) -> Optional[Project]:
"""Returns a project baserd on the given project name."""
"""Returns a project based on the given project name."""
return db_session.query(Project).filter(Project.name == name).one_or_none()


Expand Down
10 changes: 5 additions & 5 deletions src/dispatch/project/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
@router.get("/", response_model=ProjectPagination)
def get_projects(common: dict = Depends(common_parameters)):
"""
Get all project contacts.
Get all projects.
"""
return search_filter_sort_paginate(model="Project", **common)

Expand All @@ -41,7 +41,7 @@ def create_project(*, db_session: Session = Depends(get_db), project_in: Project
"""
project = get_by_name(db_session=db_session, name=project_in.name)
if project:
raise HTTPException(status_code=400, detail="The project with this email already exists.")
raise HTTPException(status_code=400, detail="A project with this name already exists.")
project = create(db_session=db_session, project_in=project_in)
return project

Expand All @@ -57,7 +57,7 @@ def get_project(*, db_session: Session = Depends(get_db), project_id: int):
"""
project = get(db_session=db_session, project_id=project_id)
if not project:
raise HTTPException(status_code=404, detail="The project with this id does not exist.")
raise HTTPException(status_code=404, detail="A project with this id does not exist.")
return project


Expand All @@ -77,7 +77,7 @@ def update_project(
"""
project = get(db_session=db_session, project_id=project_id)
if not project:
raise HTTPException(status_code=404, detail="The project with this id does not exist.")
raise HTTPException(status_code=404, detail="A project with this id does not exist.")
project = update(db_session=db_session, project=project, project_in=project_in)
return project

Expand All @@ -93,7 +93,7 @@ def delete_project(*, db_session: Session = Depends(get_db), project_id: int):
"""
project = get(db_session=db_session, project_id=project_id)
if not project:
raise HTTPException(status_code=404, detail="The project with this id does not exist.")
raise HTTPException(status_code=404, detail="A project with this id does not exist.")

delete(db_session=db_session, project_id=project_id)
return project
6 changes: 1 addition & 5 deletions src/dispatch/search/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,7 @@ def search(

filtered_incidents = []
for incident in results["Incident"]:
if incident.project in admin_projects:
filtered_incidents.append(incident)
continue

if incident.visibility == Visibility.open:
if incident.project in admin_projects or incident.visibility == Visibility.open.value:
filtered_incidents.append(incident)

results["Incident"] = filtered_incidents
Expand Down