Skip to content

Commit

Permalink
feature: infracommerce integrations and endpoint to set primary project
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanJaeger committed Feb 6, 2025
1 parent cdeb223 commit 2011bc8
Show file tree
Hide file tree
Showing 4 changed files with 183 additions and 0 deletions.
41 changes: 41 additions & 0 deletions chats/apps/api/v1/projects/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 = (
Expand Down
12 changes: 12 additions & 0 deletions chats/apps/api/v1/queues/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@

User = get_user_model()

from chats.apps.projects.usecases.integrate_ticketers import IntegratedTicketers


class QueueViewset(ModelViewSet):
queryset = Queue.objects.all()
Expand Down Expand Up @@ -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,
Expand All @@ -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):
Expand Down
10 changes: 10 additions & 0 deletions chats/apps/api/v1/sectors/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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,
Expand All @@ -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")
Expand Down
120 changes: 120 additions & 0 deletions chats/apps/projects/usecases/integrate_ticketers.py
Original file line number Diff line number Diff line change
@@ -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"
)

0 comments on commit 2011bc8

Please sign in to comment.