mycreole/views.py

85 lines
2.9 KiB
Python
Raw Normal View History

2020-01-26 20:43:19 +01:00
from .context import context_adaption
from django.conf import settings
from django.shortcuts import render, redirect, HttpResponse
from django.http import HttpResponseNotFound, HttpResponseForbidden
import importlib
import mimetypes
import logging
import mycreole
import os
import themes
from django.contrib import messages
logger = logging.getLogger('APP')
def get_method(import_string):
class_data = import_string.split(".")
module_path = ".".join(class_data[:-1])
class_str = class_data[-1]
#
module = importlib.import_module(module_path)
return getattr(module, class_str)
def access(access_type, request, rel_path):
def log_warning(access_type, e):
logger.warning('Could not import %s_access method for checking access rights: %s - %s', access_type, type(e).__name__, e)
try:
method_name = settings.MYCREOLE_ATTACHMENT_ACCESS[access_type]
except (AttributeError, KeyError) as e:
log_warning(access_type, e)
return False
else:
if method_name in [True, None]:
return True
elif method_name is False:
return False
else:
try:
return get_method(method_name)(request, rel_path)
except AttributeError as e:
log_warning(access_type, e)
return False
def mycreole_attachment(request, rel_path):
full_path = mycreole.get_full_path(rel_path)
if access('read', request, rel_path):
if os.path.isfile(full_path):
mimetypes.init()
mime_type = mimetypes.types_map.get(os.path.splitext(full_path)[1])
data = open(full_path, 'rb').read()
return HttpResponse(data, content_type=mime_type)
else:
return HttpResponseNotFound(rel_path)
else:
return HttpResponseForbidden(rel_path)
def mycreole_upload(request, rel_path):
if access('modify', request, rel_path):
if not request.POST:
context = themes.Context(request)
context_adaption(context, request, 'Upload %s' % rel_path, next=request.GET.get('next', '/'))
return render(request, 'mycreole/upload.html', context=context)
else:
full_path = mycreole.get_full_path(rel_path)
try:
os.makedirs(os.path.dirname(full_path), exist_ok=True)
except PermissionError:
raise PermissionError("Ensure that we have access to MYCREOLE_ROOT=%s" % repr(settings.MYCREOLE_ROOT))
else:
with open(full_path, 'wb') as fh:
fh.write(request.FILES['file'].read())
return redirect(request.POST.get('next', '/'))
else:
messages.error(request, "Upload: Access denied!")
return redirect(request.GET.get('next', '/'))
def mycreole_manageuploads(request, rel_path):
messages.error(request, 'Manage Uploads: Not yet implemented!')
return redirect(request.GET.get('next', '/'))