Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/changing base widget name type #10

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
18 changes: 18 additions & 0 deletions insights/authentication/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from rest_framework import permissions
from rest_framework.exceptions import PermissionDenied

from insights.projects.models import ProjectAuth


class ProjectAuthPermission(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if hasattr(obj, "dashboard") and obj.dashboard:
project_id = obj.dashboard.project_id
else:
project_id = obj.project_id

user = request.user
auth = ProjectAuth.objects.filter(project=project_id, user=user, role=1).first()
if not auth:
raise PermissionDenied("User does not have permission for this project")
return True
18 changes: 18 additions & 0 deletions insights/dashboards/migrations/0002_dashboard_grid.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.4 on 2024-05-29 20:16

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("dashboards", "0001_initial"),
]

operations = [
migrations.AddField(
model_name="dashboard",
name="grid",
field=models.JSONField(default=list, verbose_name="Grid"),
),
]
1 change: 1 addition & 0 deletions insights/dashboards/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class Dashboard(BaseModel, ConfigurableModel):
null=True,
blank=True,
)
grid = models.JSONField("Grid", default=list)

def __str__(self):
return f"{self.project.name} - {self.name}"
Expand Down
50 changes: 50 additions & 0 deletions insights/dashboards/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from django.conf import settings
from rest_framework import serializers

from insights.dashboards.models import Dashboard
from insights.widgets.models import Report, Widget


class DashboardSerializer(serializers.ModelSerializer):
class Meta:
model = Dashboard
fields = ["uuid", "name", "is_default", "grid"]


class DashboardIsDefaultSerializer(serializers.ModelSerializer):
class Meta:
model = Dashboard
fields = ["is_default"]


class DashboardReportSerializer(serializers.ModelSerializer):
url = serializers.SerializerMethodField()
type = serializers.SerializerMethodField()

def get_url(self, obj):
if obj.config.get("external_url"):
return obj.config["external_url"]
return f"{settings.INSIGHTS_DOMAIN}/dashboards/{obj.widget.dashboard.uuid}/widgets/{obj.widget.uuid}/report/"

def get_type(self, obj):
if obj.config.get("external_url"):
return "external"
return "internal"

class Meta:
model = Report
fields = ["url", "type"]


class ReportSerializer(serializers.ModelSerializer):
class Meta:
model = Report
fields = "__all__"


class DashboardWidgetsSerializer(serializers.ModelSerializer):
report = DashboardReportSerializer()

class Meta:
model = Widget
fields = "__all__"
255 changes: 255 additions & 0 deletions insights/dashboards/usecases/dashboard_creation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
from insights.dashboards.models import Dashboard
from insights.widgets.models import Widget, Report
from django.db import transaction
from insights.dashboards.usecases.exceptions import (
InvalidDashboardObject,
InvalidWidgetsObject,
InvalidReportsObject,
)


class create_atendimento_humano:
def create_dashboard(self, project):
try:
with transaction.atomic():
atendimento_humano = Dashboard.objects.create(
project=project,
name="Atendimento Humano",
description="Dashboard de atendimento humano",
is_default=False,
grid=[18, 3],
)
self.create_widgets(atendimento_humano)

except Exception as exception:
raise InvalidDashboardObject(f"Error creating dashboard: {exception}")

def create_widgets(self, dashboard_atendimento_humano):
try:
with transaction.atomic():
pico_de_atendimento = Widget.objects.create(
name="Picos de atendimentos abertos",
w_type="graph_column",
source="chats",
config={
"end_time": "18:00",
"interval": "60",
"start_time": "07:00",
},
dashboard=dashboard_atendimento_humano,
position={"rows": [1, 1], "columns": [1, 12]},
)
em_andamento = Widget.objects.create(
name="Em andamento",
w_type="card",
source="chats",
config={"operation": "count", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [2, 2], "columns": [1, 4]},
)
Widget.objects.create(
name="Tempo de espera",
w_type="card",
source="chats",
config={"operation": "AVG", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [2, 2], "columns": [5, 8]},
)
encerrados = Widget.objects.create(
name="Encerrados",
w_type="card",
source="chats",
config={"operation": "AVG", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [2, 2], "columns": [9, 12]},
)
Widget.objects.create(
name="Tempo de resposta",
w_type="card",
source="chats",
config={"operation": "count", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [3, 3], "columns": [1, 4]},
)
aguardando_atendimento = Widget.objects.create(
name="Aguardando atendimento",
w_type="card",
source="chats",
config={"operation": "count", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [3, 3], "columns": [5, 8]},
)
Widget.objects.create(
name="Tempo de interação",
w_type="card",
source="chats",
config={"operation": "count", "type_result": "executions"},
dash=dashboard_atendimento_humano,
position={"rows": [3, 3], "columns": [9, 12]},
)
Widget.objects.create(
name="Chats por agente",
w_type="table_dynamic_by_filter",
source="chats",
config={
"default": {
"icon": "forum:weni-600",
"fields": [
{
"name": "Agente",
"value": "agent",
"display": True,
"hidden_name": False,
},
{
"name": "Em andamento",
"value": "open",
"display": True,
"hidden_name": False,
},
{
"name": "Encerrados",
"value": "close",
"display": True,
"hidden_name": False,
},
{
"name": "Status",
"value": "status",
"display": True,
"hidden_name": False,
},
],
"name_overwrite": "Agentes online",
}
},
dash=dashboard_atendimento_humano,
position={"rows": [1, 3], "columns": [13, 18]},
)

self.create_reports(
pico_de_atendimento,
em_andamento,
encerrados,
aguardando_atendimento,
)
except Exception as exception:
raise InvalidWidgetsObject(f"Error creating widgets: {exception}")

def create_reports(
self, pico_de_atendimento, em_andamento, encerrados, aguardando_atendimento
):
try:
with transaction.atomic():
Report.objects.create(
name="Pico de chats abertos por hora",
w_type="graph_column",
source="chats",
config={},
widget=pico_de_atendimento,
)
Report.objects.create(
name="Em andamento",
w_type="table_group",
source="chats",
config={},
widget=em_andamento,
)
Report.objects.create(
name="Encerrados",
w_type="table_group",
source="chats",
config={},
widget=encerrados,
)
Report.objects.create(
name="Aguardando atendimento",
w_type="table_group",
source="chats",
config={},
widget=aguardando_atendimento,
)
except Exception as exception:
raise InvalidReportsObject(f"Error creating dashboard: {exception}")


class create_resultado_de_fluxo:
def create_dashboard(self, project):
try:
with transaction.atomic():
dashboard_resultado_de_fluxo = Dashboard.objects.create(
project=project,
name="Resultado de fluxo",
description="Dashboard de resultado de fluxo",
is_default=False,
grid=[12, 3],
)
self.create_widgets(dashboard_resultado_de_fluxo)

except Exception as exception:
raise InvalidDashboardObject(f"Error creating dashboard: {exception}")

def create_widgets(self, dashboard_resultado_de_fluxo):
try:
with transaction.atomic():
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [1, 1], "columns": [1, 4]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [2, 2], "columns": [1, 4]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [3, 3], "columns": [1, 4]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [1, 1], "columns": [5, 8]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [2, 2], "columns": [5, 8]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="card",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [3, 3], "columns": [5, 8]},
)
Widget.objects.create(
name="Métrica vazia",
w_type="graph_funnel",
source="",
config={},
dash=dashboard_resultado_de_fluxo,
position={"rows": [1, 3], "columns": [9, 12]},
)
except Exception as exception:
raise InvalidWidgetsObject(f"Error creating widgets: {exception}")

def create_reports():
pass
Loading