From 9272150212901bbdba5a553d8f074a9cd8000cba Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Tue, 7 Mar 2023 16:32:15 +0100 Subject: [PATCH] combine content_negotiation related decorators --- app/decorators.py | 52 ++++++++++++++++------------------------------- 1 file changed, 17 insertions(+), 35 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} - accepted = {*request.accept_mimetypes.values()} - if isinstance(produces, str): - produceables = {produces} else: + raise TypeError() + accepted = {*request.accept_mimetypes.values()} + if produces is None: + produceables = None + elif isinstance(produces, str): + produceables = {produces} + 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