def contact_load_csv_command(input, first_row_is_header): """Load contacts via CSV.""" import csv from pydantic import ValidationError from dispatch.individual import service as individual_service from dispatch.team import service as team_service from dispatch.database import SessionLocal db_session = SessionLocal() individual_contacts = [] team_contacts = [] if first_row_is_header: reader = csv.DictReader(input) for row in reader: row = {k.lower(): v for k, v in row.items()} if not row.get("email"): continue individual_contacts.append(row) for i in individual_contacts: i["is_external"] = True try: click.secho(f"Adding new individual contact. Email: {i['email']}", fg="blue") individual_service.get_or_create(db_session=db_session, **i) except ValidationError as e: click.secho(f"Failed to add individual contact. {e} {row}", fg="red") for t in team_contacts: i["is_external"] = True try: click.secho(f"Adding new team contact. Email: {t['email']}", fg="blue") team_service.get_or_create(db_session=db_session, **t) except ValidationError as e: click.secho(f"Failed to add team contact. {e} {row}", fg="red")
def get( self, incident: Incident, db_session=None, ): """Fetches participants from Dispatch.""" models = [ (IndividualContact, IndividualContactRead), (Service, ServiceRead), (TeamContact, TeamContactRead), ] recommendation = route_service.get(db_session=db_session, incident=incident, models=models) log.debug(f"Recommendation: {recommendation}") individual_contacts = [] team_contacts = [] for match in recommendation.matches: if match.resource_type == TeamContact.__name__: team = team_service.get_or_create( db_session=db_session, email=match.resource_state["email"], incident=incident) team_contacts.append(team) if match.resource_type == IndividualContact.__name__: individual = individual_service.get_or_create( db_session=db_session, email=match.resource_state["email"], incident=incident) individual_contacts.append((individual, None)) # we need to do more work when we have a service if match.resource_type == Service.__name__: plugin_instance = plugin_service.get_active_instance_by_slug( db_session=db_session, slug=match.resource_state["type"], project_id=incident.project.id, ) if plugin_instance: if plugin_instance.enabled: log.debug( f"Resolving service contact. ServiceContact: {match.resource_state}" ) # ensure that service is enabled service = service_service.get_by_external_id_and_project_id( db_session=db_session, external_id=match.resource_state["external_id"], project_id=incident.project_id, ) if service.is_active: individual_email = plugin_instance.instance.get( match.resource_state["external_id"]) individual = individual_service.get_or_create( db_session=db_session, email=individual_email, incident=incident) individual_contacts.append( (individual, match.resource_state["id"])) else: log.warning( f"Skipping service contact. Service: {match.resource_state['name']} Reason: Associated service plugin not enabled." ) else: log.warning( f"Skipping service contact. Service: {match.resource_state['name']} Reason: Associated service plugin not found." ) db_session.commit() return individual_contacts, team_contacts