Szeretném korlátozni a ViewSet-et, hogy az engedélyek alapján különböző bemeneteket tegyen lehetővé:
Az én modelljeim:
class Link(models.Model):
name = models.CharField("name", max_length = 128)
page = models.PositiveIntegerField("page", default = 1, choices = [(1, 1), (2, 2), (3, 3)])
layouts = models.ManyToManyField(Layout)
class Layout(models.Model):
name = models.CharField("name", max_length = 32)
Sorozatosító:
class LinkSerializer(serializers.ModelSerializer):
test = serializers.SerializerMethodField("get_layouts")
def get_layouts(self): ## this is not displayed?
return "test"
class Meta:
model = Link
fields = ["name", "page", "test"]
Van egy segítő osztályom, ami például all_pages
engedélyt ad. a restframework API-ban most van egy legördülő menü az 1-3. oldal között, de ha a felhasználónak nincs joga az összes oldal használatára, akkor csak a page 1
-et szeretném megjeleníteni a kijelöléshez (vagy szövegmezővé tenni beviteli mező nélkül). Ugyanez a probléma vonatkozik a ManyToMany
mezőre is: Hogyan korlátozhatom az elrendezések legördülő menüjét azokra, amelyeket az adminisztrációs síkon kiválasztottam az adott felhasználó számára?
Jelenleg manuálisan ellenőrzök mindent a ViewSet
PUT
metódusában, és a felhasználó nem engedélyezett... -› ROSSZ KÉRÉS.
EDIT: BC Megkértek, most valami ilyesmit csinálok:
class TestViewSet(viewsets.ViewSet):
serializer_class = LinkSerializer
http_method_names = ['get', 'put', 'head']
authentication_classes = [SessionAuthentication,]
permission_classes = [IsAuthenticated,]
def list(self, request):
...
def put(self, request):
## page logic
if "app.all_pages" in request.user.get_user_permissions():
try:
if not 1 < int(request.data["page"]) <= 3:
return Response(data = "page not 2 or 3",
status = status.HTTP_406_NOT_ACCEPTABLE)
except Exception as E:
return Response(data = f"""Error in page selection: {E}""",
status = status.HTTP_400_BAD_REQUEST)
page = int(request.data["page"])
else:
page = 2
## layout logic:
store = Store.objects.get(user = request.user)
allowed_layouts = [l.id for l in store.layouts.all()]
if not int(request.data["layout"]) in allowed_layouts:
return Response(data = f"""layout not allowed for store {store}""",
status = status.HTTP_406_NOT_ACCEPTABLE)
layout = Layout.objects.get(pk = request.data["layout"])
## do something with page 2 and layout ... in DB/another API