Files
bugsink/issues/api_views.py
Klaas van Schelven 3bab02fda2 API: Remove global Grouping routes
grouping will return later as Issue.grouping_keys & Event.grouping_key
i.e. with the relevant info directly resolved

See #146
2025-09-11 09:55:01 +02:00

58 lines
2.0 KiB
Python

from django.shortcuts import get_object_or_404
from rest_framework import viewsets
from rest_framework.exceptions import ValidationError
from .models import Issue
from .serializers import IssueSerializer
class IssueViewSet(viewsets.ReadOnlyModelViewSet):
"""
LIST requires: ?project=<uuid>
Optional: ?order=asc|desc (default: desc)
LIST ordered by last_seen
RETRIEVE is a pure PK lookup (soft-deletes implied)
"""
queryset = Issue.objects.filter(is_deleted=False) # hide soft-deleted issues; also satisfies router
serializer_class = IssueSerializer
def get_queryset(self):
return self.queryset
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
if self.action != "list":
return queryset
query_params = self.request.query_params
project = query_params.get("project")
if not project:
# the below until we have a UI for cross-project Issue listing, i.e. #190
raise ValidationError({"project": ["This field is required."]})
order = query_params.get("order", "desc")
if order not in ("asc", "desc"):
raise ValidationError({"order": ["Must be 'asc' or 'desc'."]})
ordering = "last_seen" if order == "asc" else "-last_seen"
return queryset.filter(project=project).order_by(ordering)
def get_object(self):
"""
DRF's get_object(), but bypass filter_queryset for detail.
"""
# TODO: copy/paste from events/api_views.py
queryset = self.get_queryset()
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
assert lookup_url_kwarg in self.kwargs, (
'Expected view %s to be called with a URL keyword argument named "%s".'
% (self.__class__.__name__, lookup_url_kwarg)
)
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
obj = get_object_or_404(queryset, **filter_kwargs)
self.check_object_permissions(self.request, obj)
return obj