From 3638445694e456fb077b086d4f9ff4541e508a86 Mon Sep 17 00:00:00 2001 From: Marc Vilanova <39573146+mvilanova@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:34:04 -0700 Subject: [PATCH] techdebt(plugin): deprecates the document resolver plugin and its code (#5420) --- src/dispatch/incident/flows.py | 35 ++------- src/dispatch/incident/messaging.py | 74 +++---------------- src/dispatch/plugins/bases/__init__.py | 1 - .../plugins/bases/document_resolver.py | 16 ---- src/dispatch/plugins/dispatch_core/config.py | 6 +- src/dispatch/plugins/dispatch_core/plugin.py | 39 ++-------- 6 files changed, 26 insertions(+), 145 deletions(-) delete mode 100644 src/dispatch/plugins/bases/document_resolver.py diff --git a/src/dispatch/incident/flows.py b/src/dispatch/incident/flows.py index 45312eb202fb..8b9acb6d387f 100644 --- a/src/dispatch/incident/flows.py +++ b/src/dispatch/incident/flows.py @@ -1,32 +1,29 @@ import logging - from datetime import datetime from typing import Optional from sqlalchemy.orm import Session -from dispatch.case.models import Case from dispatch.case import service as case_service +from dispatch.case.models import Case from dispatch.conference import flows as conference_flows from dispatch.conversation import flows as conversation_flows from dispatch.database.core import resolve_attr from dispatch.decorators import background_task from dispatch.document import flows as document_flows from dispatch.document.models import Document -from dispatch.enums import DocumentResourceTypes -from dispatch.enums import Visibility, EventType +from dispatch.enums import DocumentResourceTypes, EventType, Visibility from dispatch.event import service as event_service from dispatch.group import flows as group_flows -from dispatch.group.enums import GroupType, GroupAction +from dispatch.group.enums import GroupAction, GroupType from dispatch.incident import service as incident_service from dispatch.incident.models import IncidentRead from dispatch.incident_cost import service as incident_cost_service from dispatch.individual import service as individual_service +from dispatch.individual.models import IndividualContact from dispatch.participant import flows as participant_flows from dispatch.participant import service as participant_service from dispatch.participant.models import Participant -from dispatch.individual.models import IndividualContact -from dispatch.team.models import TeamContact from dispatch.participant_role import flows as participant_role_flows from dispatch.participant_role.models import ParticipantRoleType from dispatch.plugin import service as plugin_service @@ -34,29 +31,27 @@ from dispatch.report.messaging import send_incident_report_reminder from dispatch.service import service as service_service from dispatch.storage import flows as storage_flows +from dispatch.tag.flows import check_for_tag_change from dispatch.task.enums import TaskStatus +from dispatch.team.models import TeamContact from dispatch.ticket import flows as ticket_flows -from dispatch.tag.flows import check_for_tag_change from .messaging import ( - # get_suggested_document_items, + bulk_participant_announcement_message, send_incident_closed_information_review_reminder, send_incident_commander_readded_notification, send_incident_created_notifications, send_incident_management_help_tips_message, send_incident_new_role_assigned_notification, send_incident_open_tasks_ephemeral_message, - send_participant_announcement_message, - bulk_participant_announcement_message, send_incident_rating_feedback_message, send_incident_review_document_notification, - # send_incident_suggested_reading_messages, send_incident_update_notifications, send_incident_welcome_participant_messages, + send_participant_announcement_message, ) from .models import Incident, IncidentStatus - log = logging.getLogger(__name__) @@ -315,13 +310,6 @@ def incident_create_resources( # we send the welcome messages to the participant send_incident_welcome_participant_messages(user_email, incident, db_session) - # NOTE: Temporarily disabled until an issue with the Dispatch resolver plugin is resolved - # we send a suggested reading message to the participant - # suggested_document_items = get_suggested_document_items(incident, db_session) - # send_incident_suggested_reading_messages( - # incident, suggested_document_items, user_email, db_session - # ) - bulk_participant_announcement_message( participant_emails=user_emails, subject=incident, @@ -1051,13 +1039,6 @@ def incident_add_or_reactivate_participant_flow( # we send the welcome messages to the participant send_incident_welcome_participant_messages(user_email, incident, db_session) - # NOTE: Temporarily disabled until an issue with the Dispatch resolver plugin is resolved - # we send a suggested reading message to the participant - # suggested_document_items = get_suggested_document_items(incident, db_session) - # send_incident_suggested_reading_messages( - # incident, suggested_document_items, user_email, db_session - # ) - return participant diff --git a/src/dispatch/incident/messaging.py b/src/dispatch/incident/messaging.py index 8c35dd1a1ace..79aed27adc5f 100644 --- a/src/dispatch/incident/messaging.py +++ b/src/dispatch/incident/messaging.py @@ -6,58 +6,55 @@ """ import logging - from typing import Optional from slack_sdk.errors import SlackApiError from sqlalchemy.orm import Session -from dispatch.decorators import timer from dispatch.config import DISPATCH_UI_URL from dispatch.conversation.enums import ConversationCommands from dispatch.database.core import SessionLocal, resolve_attr +from dispatch.decorators import timer from dispatch.document import service as document_service -from dispatch.email_templates.models import EmailTemplates from dispatch.email_templates import service as email_template_service from dispatch.email_templates.enums import EmailTemplateTypes +from dispatch.email_templates.models import EmailTemplates from dispatch.enums import SubjectNames from dispatch.event import service as event_service +from dispatch.forms.models import Forms from dispatch.incident.enums import IncidentStatus from dispatch.incident.models import Incident, IncidentRead -from dispatch.notification import service as notification_service -from dispatch.forms.models import Forms from dispatch.messaging.strings import ( + INCIDENT_CLOSE_REMINDER, INCIDENT_CLOSED_INFORMATION_REVIEW_REMINDER_NOTIFICATION, INCIDENT_CLOSED_RATING_FEEDBACK_NOTIFICATION, - INCIDENT_CLOSE_REMINDER, INCIDENT_COMMANDER, INCIDENT_COMMANDER_READDED_NOTIFICATION, + INCIDENT_COMPLETED_FORM_MESSAGE, INCIDENT_MANAGEMENT_HELP_TIPS_MESSAGE, INCIDENT_NAME, INCIDENT_NAME_WITH_ENGAGEMENT, + INCIDENT_NAME_WITH_ENGAGEMENT_NO_SELF_JOIN, INCIDENT_NEW_ROLE_NOTIFICATION, INCIDENT_NOTIFICATION, INCIDENT_NOTIFICATION_COMMON, INCIDENT_OPEN_TASKS, - INCIDENT_PARTICIPANT_SUGGESTED_READING_ITEM, INCIDENT_PRIORITY_CHANGE, INCIDENT_REVIEW_DOCUMENT, INCIDENT_SEVERITY_CHANGE, INCIDENT_STATUS_CHANGE, - INCIDENT_TYPE_CHANGE, - INCIDENT_COMPLETED_FORM_MESSAGE, INCIDENT_TASK_ADD_TO_INCIDENT, - INCIDENT_NAME_WITH_ENGAGEMENT_NO_SELF_JOIN, + INCIDENT_TYPE_CHANGE, MessageType, generate_welcome_message, ) +from dispatch.notification import service as notification_service from dispatch.participant import service as participant_service from dispatch.participant_role import service as participant_role_service from dispatch.plugin import service as plugin_service from dispatch.plugins.dispatch_slack.enums import SlackAPIErrorCode -from dispatch.types import Subject from dispatch.task.models import TaskCreate - +from dispatch.types import Subject log = logging.getLogger(__name__) @@ -322,59 +319,6 @@ def send_incident_welcome_participant_messages( log.debug(f"Welcome participant messages sent {participant_email}.") -@timer -def get_suggested_document_items(incident: Incident, db_session: SessionLocal): - """Create the suggested document item message.""" - suggested_documents = get_suggested_documents(db_session, incident) - - items = [] - if suggested_documents: - # we send the ephemeral message - # lets grab the first 5 documents - # TODO add more intelligent ranking - for i in suggested_documents[:5]: - description = i.description - if not description: - if i.incident: - description = i.incident.title - - items.append({"name": i.name, "weblink": i.weblink, "description": description}) - return items - - -@timer -def send_incident_suggested_reading_messages( - incident: Incident, items: list, participant_email: str, db_session: SessionLocal -): - """Sends a suggested reading message to a participant.""" - if not items: - return - - if not incident.conversation: - log.warning( - "Incident suggested reading message not sent. No conversation available for this incident." - ) - return - - plugin = plugin_service.get_active_instance( - db_session=db_session, project_id=incident.project.id, plugin_type="conversation" - ) - if not plugin: - log.warning("Incident suggested reading message not sent. No conversation plugin enabled.") - return - - plugin.instance.send_ephemeral( - incident.conversation.channel_id, - participant_email, - "Suggested Reading", - [INCIDENT_PARTICIPANT_SUGGESTED_READING_ITEM], - MessageType.incident_participant_suggested_reading, - items=items, - ) - - log.debug(f"Suggested reading ephemeral message sent to {participant_email}.") - - def send_incident_created_notifications(incident: Incident, db_session: SessionLocal): """Sends incident created notifications.""" notification_template = INCIDENT_NOTIFICATION.copy() diff --git a/src/dispatch/plugins/bases/__init__.py b/src/dispatch/plugins/bases/__init__.py index 495e2a92f12d..7979d42c94fd 100644 --- a/src/dispatch/plugins/bases/__init__.py +++ b/src/dispatch/plugins/bases/__init__.py @@ -6,7 +6,6 @@ from .conversation import ConversationPlugin # noqa from .definition import DefinitionPlugin # noqa from .document import DocumentPlugin # noqa -from .document_resolver import DocumentResolverPlugin # noqa from .email import EmailPlugin # noqa from .monitor import MonitorPlugin # noqa from .oncall import OncallPlugin # noqa diff --git a/src/dispatch/plugins/bases/document_resolver.py b/src/dispatch/plugins/bases/document_resolver.py deleted file mode 100644 index 633779ad6d19..000000000000 --- a/src/dispatch/plugins/bases/document_resolver.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -.. module: dispatch.plugins.bases.document - :platform: Unix - :copyright: (c) 2019 by Netflix Inc., see AUTHORS for more - :license: Apache, see LICENSE for more details. -.. moduleauthor:: Kevin Glisson -""" - -from dispatch.plugins.base import Plugin - - -class DocumentResolverPlugin(Plugin): - type = "document-resolver" - - def get(self, items, **kwargs): - raise NotImplementedError diff --git a/src/dispatch/plugins/dispatch_core/config.py b/src/dispatch/plugins/dispatch_core/config.py index 76f21661f94b..9fdda55275bf 100644 --- a/src/dispatch/plugins/dispatch_core/config.py +++ b/src/dispatch/plugins/dispatch_core/config.py @@ -1,11 +1,11 @@ import logging -from dispatch.config import BaseConfigurationModel -from starlette.config import Config from pydantic import Field +from starlette.config import Config -log = logging.getLogger(__name__) +from dispatch.config import BaseConfigurationModel +log = logging.getLogger(__name__) config = Config(".env") diff --git a/src/dispatch/plugins/dispatch_core/plugin.py b/src/dispatch/plugins/dispatch_core/plugin.py index 5971b905f59a..1bb18284799e 100644 --- a/src/dispatch/plugins/dispatch_core/plugin.py +++ b/src/dispatch/plugins/dispatch_core/plugin.py @@ -17,11 +17,11 @@ from fastapi.security.utils import get_authorization_scheme_param from jose import JWTError, jwt from jose.exceptions import JWKError +from sqlalchemy.orm import Session from starlette.requests import Request from starlette.status import HTTP_401_UNAUTHORIZED -from sqlalchemy.orm import Session -from dispatch.auth.models import MfaChallenge, MfaPayload, DispatchUser, MfaChallengeStatus +from dispatch.auth.models import DispatchUser, MfaChallenge, MfaChallengeStatus, MfaPayload from dispatch.case import service as case_service from dispatch.config import ( DISPATCH_AUTHENTICATION_PROVIDER_HEADER_NAME, @@ -33,9 +33,7 @@ DISPATCH_UI_URL, ) from dispatch.database.core import Base -from dispatch.document.models import Document, DocumentRead from dispatch.incident import service as incident_service -from dispatch.incident.models import Incident from dispatch.individual import service as individual_service from dispatch.individual.models import IndividualContact, IndividualContactRead from dispatch.plugin import service as plugin_service @@ -43,26 +41,25 @@ from dispatch.plugins.bases import ( AuthenticationProviderPlugin, ContactPlugin, - DocumentResolverPlugin, MultiFactorAuthenticationPlugin, ParticipantPlugin, TicketPlugin, ) +from dispatch.plugins.dispatch_core.config import DispatchTicketConfiguration from dispatch.plugins.dispatch_core.exceptions import ( - InvalidChallengeError, - UserMismatchError, ActionMismatchError, ExpiredChallengeError, + InvalidChallengeError, InvalidChallengeStateError, + UserMismatchError, ) +from dispatch.plugins.dispatch_core.service import create_resource_id from dispatch.project import service as project_service from dispatch.route import service as route_service from dispatch.service import service as service_service from dispatch.service.models import Service, ServiceRead from dispatch.team import service as team_service from dispatch.team.models import TeamContact, TeamContactRead -from dispatch.plugins.dispatch_core.config import DispatchTicketConfiguration -from dispatch.plugins.dispatch_core.service import create_resource_id log = logging.getLogger(__name__) @@ -289,30 +286,6 @@ def create_task_ticket( } -class DispatchDocumentResolverPlugin(DocumentResolverPlugin): - title = "Dispatch Plugin - Document Resolver" - slug = "dispatch-document-resolver" - description = "Uses dispatch itself to resolve incident documents." - version = dispatch_plugin.__version__ - - author = "Netflix" - author_url = "https://github.com/netflix/dispatch.git" - - def get( - self, - incident: Incident, - db_session=None, - ): - """Fetches documents from Dispatch.""" - recommendation = route_service.get( - db_session=db_session, - project_id=incident.project_id, - class_instance=incident, - models=[(Document, DocumentRead)], - ) - return recommendation.matches - - class DispatchMfaPlugin(MultiFactorAuthenticationPlugin): title = "Dispatch Plugin - Multi Factor Authentication" slug = "dispatch-auth-mfa"