12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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
-
- try:
- from config import APP_NAME as ROOT_LOGGER_NAME
- except ImportError:
- ROOT_LOGGER_NAME = 'root'
- logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__)
-
-
- 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', '/'))
|