diff --git a/chats/apps/api/v1/projects/viewsets.py b/chats/apps/api/v1/projects/viewsets.py index 0e284b2d..f497b952 100644 --- a/chats/apps/api/v1/projects/viewsets.py +++ b/chats/apps/api/v1/projects/viewsets.py @@ -44,6 +44,8 @@ from chats.apps.rooms.views import create_room_feedback_message from chats.apps.sectors.models import Sector +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers + class ProjectViewset( mixins.ListModelMixin, @@ -458,6 +460,45 @@ def partial_update(self, request, uuid=None): project.save() return Response(ProjectSerializer(project).data, status=status.HTTP_200_OK) + @action( + detail=True, + methods=["post"], + url_path="set-project-principal", + ) + def set_project_as_principal(self, request, *args, **kwargs): + project = self.get_object() + + config = project.config or {} + config["its_principal"] = True + project.config = config + project.save() + + org_projects = Project.objects.filter(org=project.org).exclude(pk=project.pk) + org_projects.update(config={"its_secundary": True}) + + return Response( + { + "detail": "Project set as principal and other projects in the same org set as secondary." + }, + status=status.HTTP_200_OK, + ) + + @action(detail=False, methods=["POST"], url_name="integrate_sectors") + def integrate_sectors(self, request, *args, **kwargs): + try: + project = Project.objects.get(uuid=request.query_params["project"]) + integrations = IntegratedTicketers() + + integrations.integrate_ticketer(project) + integrations.integrate_topic(project) + except Exception as error: + return Response( + {"error integrating ticketers": f"{type(error)}: {error}"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + return Response("ticketers and topics integrated", status=status.HTTP_200_OK) + class ProjectPermissionViewset(viewsets.ReadOnlyModelViewSet): queryset = ( diff --git a/chats/apps/api/v1/queues/viewsets.py b/chats/apps/api/v1/queues/viewsets.py index cb665ee6..7ee80edb 100644 --- a/chats/apps/api/v1/queues/viewsets.py +++ b/chats/apps/api/v1/queues/viewsets.py @@ -23,6 +23,8 @@ User = get_user_model() +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers + class QueueViewset(ModelViewSet): queryset = Queue.objects.all() @@ -60,6 +62,9 @@ def get_serializer_class(self): def perform_create(self, serializer): instance = serializer.save() + + project = Project.objects.get(uuid=instance.sector.project.uuid) + content = { "uuid": str(instance.uuid), "name": instance.name, @@ -74,6 +79,13 @@ def perform_create(self, serializer): raise exceptions.APIException( detail=f"[{response.status_code}] Error posting the queue on flows. Exception: {response.content}" ) + + if project.config.get("its_principal"): + integrate_use_case = IntegratedTicketers() + integrate_use_case.integrate__individual_topic( + project, instance.sector.config.get("integration_token") + ) + return instance def perform_update(self, serializer): diff --git a/chats/apps/api/v1/sectors/viewsets.py b/chats/apps/api/v1/sectors/viewsets.py index 823254a2..d8140278 100644 --- a/chats/apps/api/v1/sectors/viewsets.py +++ b/chats/apps/api/v1/sectors/viewsets.py @@ -23,6 +23,7 @@ ) from chats.apps.projects.models import Project from chats.apps.sectors.models import Sector, SectorAuthorization, SectorTag +from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers class SectorViewset(viewsets.ModelViewSet): @@ -66,6 +67,9 @@ def perform_create(self, serializer): raise exceptions.APIException( detail=f"Error when saving the sector. Exception: {str(e)}" # NOQA ) + + project = Project.objects.get(uuid=instance.project.uuid) + content = { "project_uuid": str(instance.project.uuid), "name": instance.name, @@ -88,6 +92,12 @@ def perform_create(self, serializer): detail=f"[{response.status_code}] Error posting the sector/ticketer on flows. Exception: {response.content}" # NOQA ) + if project.config.get("its_main"): + integrate_use_case = IntegratedTicketers() + integrate_use_case.integrate_individual_ticketer( + project, instance.config.get("integration_token") + ) + def update(self, request, *args, **kwargs): sector = self.get_object() config = request.data.get("config") diff --git a/chats/apps/projects/usecases/integrate_ticketers.py b/chats/apps/projects/usecases/integrate_ticketers.py new file mode 100644 index 00000000..64711262 --- /dev/null +++ b/chats/apps/projects/usecases/integrate_ticketers.py @@ -0,0 +1,120 @@ +from chats.apps.projects.models import Project +from chats.apps.sectors.models import Sector +from chats.apps.queues.models import Queue + +from chats.apps.api.v1.internal.rest_clients.connect_rest_client import ( + ConnectRESTClient, +) +from rest_framework import exceptions, status +from chats.apps.api.v1.internal.rest_clients.flows_rest_client import FlowRESTClient + + +class IntegratedTicketers: + def integrate_ticketer(self, project): + print("dentro da funcao de integracao") + projects = Project.objects.filter(org=project.org, config__its_secundary=True) + print("projects secundarios", projects) + + for secundary_project in projects: + print("dentro do for secundario", secundary_project) + sectors = Sector.objects.filter( + project=project, config__integration_token=str(secundary_project.uuid) + ) + print("setores do principal", sectors) + + for sector in sectors: + content = { + "project_uuid": str(secundary_project.uuid), + "name": sector.name, + "config": { + "project_auth": str(sector.external_token.pk), + "sector_uuid": str(sector.uuid), + }, + } + connect = ConnectRESTClient() + response = connect.create_ticketer(**content) + print("resposta", response.json()) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the sector/ticketer on flows. Exception: {response.content}" + ) + + def integrate_topic(self, project): + projects = Project.objects.filter(org=project.org, config__its_secundary=True) + + for secundary_project in projects: + queues = Queue.objects.filter( + sector__project=project, + sector__config__integration_token=str(secundary_project.uuid), + ) + + for queue in queues: + content = { + "uuid": str(queue.uuid), + "name": queue.name, + "sector_uuid": str(queue.sector.uuid), + "project_uuid": str(secundary_project.uuid), + } + response = FlowRESTClient().create_queue(**content) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the queue on flows. Exception: {response.content}" + ) + + def integrate_individual_ticketer(self, project, integrated_token): + try: + sector = Sector.objects.get( + project=project, config__integration_token=str(integrated_token) + ) + content = { + "project_uuid": str(sector.config.get("integration_token")), + "name": sector.name, + "config": { + "project_auth": str(sector.external_token.pk), + "sector_uuid": str(sector.uuid), + }, + } + connect = ConnectRESTClient() + response = connect.create_ticketer(**content) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the sector/ticketer on flows. Exception: {response.content}" + ) + except: + raise exceptions.APIException( + detail=f"there is not secundary project for that sector" + ) + + def integrate__individual_topic(self, project, sector_integrated_token): + try: + queue = Queue.objects.filter( + sector__project=project, + sector__config__integration_token=str(sector_integrated_token), + ) + content = { + "uuid": str(queue.uuid), + "name": queue.name, + "sector_uuid": str(queue.sector.uuid), + "project_uuid": str(queue.sector.config.get("integration_token")), + } + response = FlowRESTClient().create_queue(**content) + if response.status_code not in [ + status.HTTP_200_OK, + status.HTTP_201_CREATED, + ]: + raise exceptions.APIException( + detail=f"[{response.status_code}] Error posting the queue on flows. Exception: {response.content}" + ) + except: + raise exceptions.APIException( + detail=f"there is not secundary project for that queue" + )