diff options
Diffstat (limited to 'archaeological_finds/views_api.py')
-rw-r--r-- | archaeological_finds/views_api.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/archaeological_finds/views_api.py b/archaeological_finds/views_api.py new file mode 100644 index 000000000..66cadeb5e --- /dev/null +++ b/archaeological_finds/views_api.py @@ -0,0 +1,40 @@ +from rest_framework import authentication, permissions +from rest_framework.views import APIView +from rest_framework.response import Response + +from ishtar_common.serializers import PublicSerializer + +from archaeological_finds import models + + +class PublicFindAPI(APIView): + authentication_classes = (authentication.TokenAuthentication,) + permission_classes = (permissions.IsAuthenticated,) + + def get_queryset(self): + empty = models.Find.objects.filter(pk=None) + basket_slug = self.request.GET.get("basket", None) + if not basket_slug: + return empty + try: + basket = models.FindBasket.objects.get(slug=basket_slug, public=True) + except models.FindBasket.DoesNotExist: + return empty + q = ( + models.FindBasket.items.through.objects.filter(findbasket_id=basket.id) + .values("find_id") + .order_by("id") + ) + id_list = [bi["find_id"] for bi in q] + clauses = " ".join( + "WHEN id=%s THEN %s" % (pk, i) for i, pk in enumerate(id_list) + ) + + ordering = "CASE {} END".format(clauses) + return models.Find.objects.filter(id__in=id_list).extra( + select={"ordering": ordering}, order_by=("ordering",) + ) + + def get(self, request, format=None): + serializer = PublicSerializer(self.get_queryset(), many=True) + return Response(serializer.data) |