From 7cccf4daf15f16f3b7b4dc7909862fc2839caf4f Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Wed, 31 Mar 2021 21:51:17 +0100 Subject: move *_views files to /views/* --- core/views/expo.py | 254 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 core/views/expo.py (limited to 'core/views/expo.py') diff --git a/core/views/expo.py b/core/views/expo.py new file mode 100644 index 0000000..4ca6f22 --- /dev/null +++ b/core/views/expo.py @@ -0,0 +1,254 @@ +import os +import re +from pathlib import Path +from urllib.parse import urljoin, unquote as urlunquote +from urllib.request import urlopen + +from django.shortcuts import render, redirect +from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.urls import reverse, resolve +from django.template import Context, loader +from django.views.decorators.csrf import ensure_csrf_cookie +from django.contrib import admin + +import django.forms as forms + +from troggle.helper import login_required_if_public +from troggle.core.models_caves import Cave +import troggle.core.views.caves +import troggle.settings as settings + +'''Formerly a separate package 'flatpages' written by Martin Green 2011. +This was NOT django.contrib.flatpages which stores HTML in the database, so the name was chnaged to expopages. +Then it was incorporated into troggle directly, rather than being an unnecessary external package. +''' + +def expofiles_redirect(request, path): + '''This is used only when running as a test system without a local copy of /expofiles/ + ''' + return redirect(urljoin('http://expo.survex.com/expofiles/', path)) + +def expofilessingle(request, filepath): + '''sends a single binary file to the user, + ''' + fn=urlunquote(filepath) + fn = Path(settings.EXPOFILES,filepath) + if fn.is_dir(): + return expofilesdir(request, Path(fn), Path(filepath)) + # print(" - expofilessingle {}:{}:{}:".format(filepath, fn, getmimetype(fn))) + return HttpResponse(content=open(fn, "rb"),content_type=getmimetype(filepath)) # any file + +def expofilesdir(request, dirpath, filepath): + '''does a directory display. If there is an index.html file we should display that. + - dirpath is a Path() and it does not have /expofiles/ in it + ''' + # print(" - expofilesdir {}".format(dirpath)) + urlpath = 'expofiles' / Path(filepath) + fileitems = [] + diritems = [] + for f in dirpath.iterdir(): + if f.is_dir(): + diritems.append((urlpath / f.parts[-1], str(f.parts[-1]))) + else: + # if f.parts[-1].lower() == 'index.htm' or f.parts[-1].lower() == 'index.html': # css cwd problem + # return HttpResponse(content=open(f, "rb"),content_type=getmimetype(filepath)) # any file + # return expofilessingle(request, str(Path(filepath / f.parts[-1]))) + fileitems.append((Path(urlpath) / f.parts[-1], str(f.parts[-1]), getmimetype(f))) + return render(request, 'dirdisplay.html', { 'filepath': urlpath, 'fileitems':fileitems, 'diritems': diritems,'settings': settings }) + +def expowebpage(request, expowebpath, path): + '''Adds memnus and serves an HTML page + ''' + if not Path(expowebpath / path).is_file(): + return render(request, 'pagenotfound.html', {'path': path}) + + with open(os.path.normpath(expowebpath / path), "rb") as o: + html = o.read() + + m = re.search(rb'(.*)<\s*head([^>]*)>(.*)<\s*/head\s*>(.*)<\s*body([^>]*)>(.*)<\s*/body\s*>(.*)', html, re.DOTALL + re.IGNORECASE) + if m: + preheader, headerattrs, head, postheader, bodyattrs, body, postbody = m.groups() + else: + return HttpResponse(html + "HTML Parsing failure: Page could not be split into header and body: failed in expowebpage in views.expo.py") + m = re.search(rb"(.*)", head, re.DOTALL + re.IGNORECASE) + if m: + title, = m.groups() + else: + title = "" + m = re.search(rb"]*)noedit", head, re.DOTALL + re.IGNORECASE) + if m: + editable = False + else: + editable = True + + has_menu = False + menumatch = re.match(rb'(.*)