NewsBlur-viq/utils/view_functions.py

116 lines
3.6 KiB
Python
Raw Normal View History

2024-04-24 09:50:42 -04:00
import functools
from django.http import Http404, HttpResponse
2020-06-19 02:27:48 -04:00
from django.shortcuts import render
2024-04-24 09:50:42 -04:00
from utils import json_functions as json
2024-04-24 09:43:56 -04:00
def get_argument_or_404(request, param, method="POST", code="404"):
try:
return getattr(request, method)[param]
except KeyError:
2024-04-24 09:43:56 -04:00
if code == "404":
raise Http404
else:
2024-04-24 09:43:56 -04:00
return
def render_to(template):
"""
Decorator for Django views that sends returned dict to render function.
If view doesn't return dict then decorator simply returns output.
Additionally view can return two-tuple, which must contain dict as first
element and string with template name as second. This string will
override template name, given as parameter
Parameters:
- template: template name to use
"""
2024-04-24 09:43:56 -04:00
def renderer(func):
def wrapper(request, *args, **kw):
output = func(request, *args, **kw)
if isinstance(output, (list, tuple)):
return render(request, output[1], output[0])
elif isinstance(output, dict):
return render(request, template, output)
return output
2024-04-24 09:43:56 -04:00
return wrapper
2024-04-24 09:43:56 -04:00
2012-03-19 15:46:59 -07:00
return renderer
2024-04-24 09:43:56 -04:00
2012-03-19 15:46:59 -07:00
def is_true(value):
if value == 1:
return True
2024-04-24 09:43:56 -04:00
return bool(value) and isinstance(value, str) and value.lower() not in ("false", "0")
class required_params(object):
"Instances of this class can be used as decorators"
2024-04-24 09:43:56 -04:00
def __init__(self, *args, **kwargs):
self.params = args
self.named_params = kwargs
2024-04-24 09:43:56 -04:00
self.method = kwargs.get("method", "POST")
def __call__(self, fn):
def wrapper(request, *args, **kwargs):
return self.view_wrapper(request, fn, *args, **kwargs)
2024-04-24 09:43:56 -04:00
functools.update_wrapper(wrapper, fn)
return wrapper
2024-04-24 09:43:56 -04:00
def view_wrapper(self, request, fn, *args, **kwargs):
2024-04-24 09:43:56 -04:00
if request.method != self.method and self.method != "REQUEST":
return self.disallowed(method=True, status_code=405)
2024-04-24 09:43:56 -04:00
2014-01-28 16:43:54 -08:00
# Check if parameter is included
for param in self.params:
2014-01-28 16:43:54 -08:00
if getattr(request, self.method).get(param) is None:
2020-06-19 02:27:48 -04:00
print(" Unnamed parameter not found: %s" % param)
return self.disallowed(param)
2014-01-28 16:43:54 -08:00
# Check if parameter is correct type
2020-06-19 02:27:48 -04:00
for param, param_type in list(self.named_params.items()):
2024-04-24 09:43:56 -04:00
if param == "method":
continue
2014-01-28 16:43:54 -08:00
if getattr(request, self.method).get(param) is None:
2020-06-19 02:27:48 -04:00
print(" Typed parameter not found: %s" % param)
return self.disallowed(param)
try:
2014-01-28 16:43:54 -08:00
if param_type(getattr(request, self.method).get(param)) is None:
2020-06-19 02:27:48 -04:00
print(" Typed parameter wrong: %s" % param)
return self.disallowed(param, param_type)
2020-06-19 02:27:48 -04:00
except (TypeError, ValueError) as e:
print(" %s -> %s" % (param, e))
return self.disallowed(param, param_type)
2024-04-24 09:43:56 -04:00
return fn(request, *args, **kwargs)
def disallowed(self, param=None, param_type=None, method=False, status_code=400):
if method:
message = "Invalid HTTP method. Use %s." % self.method
elif param_type:
message = "Invalid paramter: %s - needs to be %s" % (
param,
param_type,
)
else:
message = "Missing parameter: %s" % param
2024-04-24 09:43:56 -04:00
return HttpResponse(
json.encode(
{
"message": message,
"code": -1,
}
),
content_type="application/json",
status=status_code,
)