diff --git a/conservancy/views.py b/conservancy/views.py new file mode 100644 index 0000000000000000000000000000000000000000..2913f2b14aeff5f7d27f29e1caa523ca3644df82 --- /dev/null +++ b/conservancy/views.py @@ -0,0 +1,58 @@ +import mimetypes +import os.path + +from django.http import HttpResponse +from django.template.response import TemplateResponse + +from .local_context_processors import fundgoal_lookup + +STATIC_ROOT = os.path.abspath(os.path.dirname(__file__)) +FILESYSTEM_ENCODING = 'utf-8' + +def handler(request, errorcode): + path = os.path.join('error', str(errorcode), 'index.html') + fullpath = os.path.join(STATIC_ROOT, path) + if not os.path.exists(fullpath): + return HttpResponse("Internal error: " + path, status=int(errorcode)) + else: + return TemplateResponse(request, path, status=int(errorcode)) + +def handler401(request): + return handler(request, 401) + +def handler403(request): + return handler(request, 403) + +def handler404(request): + return handler(request, 404) + +def handler500(request): + return handler(request, 500) + +def index(request, *args, **kwargs): + path = request.path.lstrip('/') + if path.endswith('/'): + path += 'index.html' + fullpath = os.path.join(STATIC_ROOT, path) + try: + # Junk URLs in production (Python 3.5) are causing UnicodeEncodeErrors + # here. Can't reproduce in development in Python 3.9 - only Python 2.7. + if not os.path.exists(fullpath): + return handler404(request) + except UnicodeEncodeError: + return handler404(request) + content_type, _ = mimetypes.guess_type(path) + if content_type != 'text/html': + return HttpResponse(open(fullpath, 'rb'), content_type) + else: + context = kwargs.copy() + try: + context['fundgoal'] = fundgoal_lookup(kwargs['fundraiser_sought']) + except KeyError: + pass + return TemplateResponse(request, path, context) + +def debug(request): + path = request.get_full_path() + path = path.lstrip('/') + return HttpResponse("Hello, static world: " + path)