From 9272150212901bbdba5a553d8f074a9cd8000cba Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Tue, 7 Mar 2023 16:32:15 +0100
Subject: [PATCH] combine content_negotiation related decorators

---
 app/decorators.py | 50 +++++++++++++++--------------------------------
 1 file changed, 16 insertions(+), 34 deletions(-)

diff --git a/app/decorators.py b/app/decorators.py
index 5fa3d82b..21527233 100644
--- a/app/decorators.py
+++ b/app/decorators.py
@@ -65,52 +65,34 @@ def background(f):
     return wrapped
 
 
-def consumes(mime_type: str, *_mime_types: str):
-    def decorator(f):
-        @wraps(f)
-        def decorated_function(*args, **kwargs):
-            provided = request.mimetype
-            consumeables = {mime_type, *_mime_types}
-            if provided not in consumeables:
-                raise NotAcceptable()
-            return f(*args, **kwargs)
-        return decorated_function
-    return decorator
-
-
-def produces(mime_type: str, *_mime_types: str):
-    def decorator(f):
-        @wraps(f)
-        def decorated_function(*args, **kwargs):
-            accepted = {*request.accept_mimetypes.values()}
-            produceables = {mime_type, *_mime_types}
-            if len(produceables & accepted) == 0:
-                raise NotAcceptable()
-            return f(*args, **kwargs)
-        return decorated_function
-    return decorator
-
-
 def content_negotiation(
-    produces: Union[str, List[str]],
-    consumes: Union[str, List[str]]
+    produces: Union[str, List[str], None] = None,
+    consumes: Union[str, List[str], None] = None
 ):
     def decorator(f):
         @wraps(f)
         def decorated_function(*args, **kwargs):
             provided = request.mimetype
-            if isinstance(consumes, str):
+            if consumes is None:
+                consumeables = None
+            elif isinstance(consumes, str):
                 consumeables = {consumes}
-            else:
+            elif isinstance(consumes, list) and all(isinstance(x, str) for x in consumes):
                 consumeables = {*consumes}
+            else:
+                raise TypeError()
             accepted = {*request.accept_mimetypes.values()}
-            if isinstance(produces, str):
+            if produces is None:
+                produceables = None
+            elif isinstance(produces, str):
                 produceables = {produces}
-            else:
+            elif isinstance(produces, list) and all(isinstance(x, str) for x in produces):
                 produceables = {*produces}
-            if len(produceables & accepted) == 0:
+            else:
+                raise TypeError()
+            if produceables is not None and len(produceables & accepted) == 0:
                 raise NotAcceptable()
-            if provided not in consumeables:
+            if consumeables is not None and provided not in consumeables:
                 raise NotAcceptable()
             return f(*args, **kwargs)
         return decorated_function
-- 
GitLab