diff --git a/apps/organization_monitoring/urls.py b/apps/organization_monitoring/urls.py index 54f41fb..9a2b11c 100644 --- a/apps/organization_monitoring/urls.py +++ b/apps/organization_monitoring/urls.py @@ -1,8 +1,10 @@ from django.urls import path from apps.organization_monitoring.views import ( - OrganizationMonitoringDetailView, - OrganizationMonitoringListCreateView, + MonitoringDetailView, + MonitoringListCreateView, + UserMonitoringDetailView, + UserMonitoringListView, ) app_name = "organization_monitoring" @@ -10,12 +12,22 @@ urlpatterns = [ path( "organizations/monitoring", - OrganizationMonitoringListCreateView.as_view(), + UserMonitoringListView.as_view(), name="organization-monitoring-list", ), path( "organizations/monitoring/", - OrganizationMonitoringDetailView.as_view(), + UserMonitoringDetailView.as_view(), name="organization-monitoring-detail", ), + path( + "console/organizations/monitoring", + MonitoringListCreateView.as_view(), + name="console-organization-monitoring-list", + ), + path( + "console/organizations/monitoring/", + MonitoringDetailView.as_view(), + name="console-organization-monitoring-detail", + ), ] diff --git a/apps/organization_monitoring/views.py b/apps/organization_monitoring/views.py index ce7be01..b1328d9 100644 --- a/apps/organization_monitoring/views.py +++ b/apps/organization_monitoring/views.py @@ -1,20 +1,40 @@ +from rest_framework import generics, permissions + from apps.organization_monitoring.models import OrganizationMonitoring from apps.organization_monitoring.serializers import OrganizationMonitoringSerializer from utils.views import ( + OrganizationContextMixin, OrganizationListCreateAPIView, OrganizationRetrieveUpdateDestroyAPIView, ) -class OrganizationMonitoringListCreateView(OrganizationListCreateAPIView): +class MonitoringListCreateView(OrganizationListCreateAPIView): model = OrganizationMonitoring serializer_class = OrganizationMonitoringSerializer queryset = OrganizationMonitoring.objects.select_related("organization") organization_field = "organization" -class OrganizationMonitoringDetailView(OrganizationRetrieveUpdateDestroyAPIView): +class MonitoringDetailView(OrganizationRetrieveUpdateDestroyAPIView): model = OrganizationMonitoring serializer_class = OrganizationMonitoringSerializer queryset = OrganizationMonitoring.objects.select_related("organization") organization_field = "organization" + + +class UserMonitoringListView(OrganizationContextMixin, generics.ListAPIView): + authentication_classes = [] + permission_classes = [permissions.AllowAny] + serializer_class = OrganizationMonitoringSerializer + queryset = OrganizationMonitoring.objects.select_related("organization") + + +class UserMonitoringDetailView( + OrganizationContextMixin, + generics.RetrieveAPIView, +): + authentication_classes = [] + permission_classes = [permissions.AllowAny] + serializer_class = OrganizationMonitoringSerializer + queryset = OrganizationMonitoring.objects.select_related("organization") diff --git a/utils/views.py b/utils/views.py index 6c358fb..ff89c9d 100644 --- a/utils/views.py +++ b/utils/views.py @@ -5,6 +5,49 @@ from apps.organization.models import Organization +class OrganizationContextMixin: + organization_field = "organization" + + def get_organization_slug(self): + headers = self.request.headers + slug_name = headers.get("X-Organization") or headers.get("X-Org") + if slug_name: + return slug_name + + tenant = getattr(self.request, "tenant", None) + slug_name = getattr(tenant, "slug_name", None) + if slug_name: + return slug_name + + hostname = self.request.get_host().split(":", 1)[0] + parts = hostname.split(".") + if len(parts) < 2: + return None + + slug_name = parts[0] + if slug_name in {"www", "api"}: + return None + return slug_name + + def get_organization(self): + slug_name = self.get_organization_slug() + if not slug_name: + raise ParseError("Organization context is required") + + try: + return Organization.objects.get(slug_name=slug_name, is_active=True) + except Organization.DoesNotExist as exc: + raise ParseError(f"Organization '{slug_name}' not found") from exc + + def get_queryset(self): + queryset = super().get_queryset() + + if getattr(self, "swagger_fake_view", False): + return queryset + + return queryset.filter(**{self.organization_field: self.get_organization()}) + + class OrganizationAPIView(GenericAPIView): organization_field = None