From 87e0236ec1ef40c5729ea558e655afb0a9333c6a Mon Sep 17 00:00:00 2001 From: Corban-Lee Date: Wed, 17 Jul 2024 17:11:18 +0100 Subject: [PATCH] custom metadata for GET options --- apps/api/metadata.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 apps/api/metadata.py diff --git a/apps/api/metadata.py b/apps/api/metadata.py new file mode 100644 index 0000000..dbf33e5 --- /dev/null +++ b/apps/api/metadata.py @@ -0,0 +1,33 @@ +from rest_framework import serializers +from rest_framework.metadata import SimpleMetadata +from rest_framework.request import clone_request + + +class ExpandedMetadata(SimpleMetadata): + + def determine_actions(self, request, view): + """ + For generic class based views we return information about + the fields that are accepted for 'PUT' and 'POST' methods. + """ + actions = {} + for method in {'PUT', 'POST', "GET"} & set(view.allowed_methods): + view.request = clone_request(request, method) + try: + # Test global permissions + if hasattr(view, 'check_permissions'): + view.check_permissions(view.request) + # Test object permissions + if method == 'PUT' and hasattr(view, 'get_object'): + view.get_object() + except (exceptions.APIException, PermissionDenied, Http404): + pass + else: + # If user has appropriate permissions for the view, include + # appropriate metadata about the fields that should be supplied. + serializer = view.get_serializer() + actions[method] = self.get_serializer_info(serializer) + finally: + view.request = request + + return actions