diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-10-06 18:36:16 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:20:58 +0100 |
commit | 6f691ee57c2816f57ff518fbebd702d411609b88 (patch) | |
tree | 0327937f9c376ae95b0777faea227bb628528dab /archaeological_finds/views_api.py | |
parent | 91577057d07eb5733e5abbb7e4be32982a3f59dd (diff) | |
download | Ishtar-6f691ee57c2816f57ff518fbebd702d411609b88.tar.bz2 Ishtar-6f691ee57c2816f57ff518fbebd702d411609b88.zip |
Syndication - docs, api permissions
Permissions by token, IP and by model.
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) |