61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
import uuid
|
|
from django.http import JsonResponse
|
|
from django.db.models import Q
|
|
from django.db.models.query import QuerySet
|
|
from django.views.generic import View
|
|
|
|
from dashboard.mixins import DateRangeMixin
|
|
from core.models import Service
|
|
|
|
from .mixins import ApiTokenRequiredMixin
|
|
|
|
|
|
def is_valid_uuid(value):
|
|
try:
|
|
uuid.UUID(value)
|
|
return True
|
|
except ValueError:
|
|
return False
|
|
|
|
|
|
class DashboardApiView(ApiTokenRequiredMixin, DateRangeMixin, View):
|
|
def get(self, request, *args, **kwargs):
|
|
services = Service.objects.filter(
|
|
Q(owner=request.user) | Q(collaborators__in=[request.user])
|
|
).distinct()
|
|
|
|
uuid = request.GET.get('uuid')
|
|
if uuid and is_valid_uuid(uuid):
|
|
services = services.filter(uuid=uuid)
|
|
|
|
try:
|
|
start = self.get_start_date()
|
|
end = self.get_end_date()
|
|
except ValueError:
|
|
return JsonResponse(status=400, data={'error': 'Invalid date format'})
|
|
|
|
services_data = [
|
|
{
|
|
'name': s.name,
|
|
'uuid': s.uuid,
|
|
'link': s.link,
|
|
'stats': s.get_core_stats(start, end),
|
|
}
|
|
for s in services
|
|
]
|
|
|
|
services_data = self._convert_querysets_to_lists(services_data)
|
|
|
|
return JsonResponse(data={'services': services_data})
|
|
|
|
def _convert_querysets_to_lists(self, services_data):
|
|
for service_data in services_data:
|
|
for key, value in service_data['stats'].items():
|
|
if isinstance(value, QuerySet):
|
|
service_data['stats'][key] = list(value)
|
|
for key, value in service_data['stats']['compare'].items():
|
|
if isinstance(value, QuerySet):
|
|
service_data['stats']['compare'][key] = list(value)
|
|
|
|
return services_data
|