troggle-unchained/core/views/drawings.py
2022-03-05 22:16:03 +00:00

62 lines
2.4 KiB
Python

import os, stat
import re
from pathlib import Path
from urllib.parse import urljoin, unquote as urlunquote
from django.conf import settings
from django.shortcuts import render
from django.http import HttpResponse
from troggle.core.models.survex import DrawingFile
from troggle.core.views.expo import getmimetype
#import parsers.surveys
'''Some of these views serve files as binary blobs, and simply set the mime type based on the file extension,
as does the urls.py dispatcher which sends them here. Here they should actually have the filetype checked
by looking inside the file before being served.
'''
todo='''Need to check if invalid query string is invalid, or produces multiple replies
and render a user-friendly error page.
'''
def dwgallfiles(request):
'''Report on all the drawing files in the system. These were loaded by parsing the entire directory tree
'''
dwgfiles = DrawingFile.objects.all()
return render(request, 'dwgfiles.html', { 'dwgfiles':dwgfiles, 'settings': settings })
def dwgfilesingle(request, path):
'''sends a single binary file to the user, We should have a renderer that syntax-colours this Tunnel xml
but it might be a Therion file. And it could be an old PNG, PDF or SVG for that matter,
so we should attempt to render it
'''
try:
dwgfile = DrawingFile.objects.get(dwgpath=urlunquote(path))
except:
message = f'Drawing file error or not found \'{path}\' .'
return render(request, 'errors/generic.html', {'message': message})
tfile = Path(settings.DRAWINGS_DATA, dwgfile.dwgpath)
if Path(dwgfile.dwgpath).suffix in ['.xml', 'th2', '.th']:
try: # for display not download
return HttpResponse(content=open(tfile, errors='strict'), content_type="text/xhtml")
except UnicodeDecodeError:
try:
return HttpResponse(content=open(tfile,encoding='iso-8859-1'), content_type="text/xhtml")
except:
return HttpResponse(content=open(tfile,mode='rb'), content_type="text/xhtml")
else:
return HttpResponse(content=open(tfile, errors='ignore'), content_type="text/xhtml")
else:
return HttpResponse(content="Unable to understand the encoding for this file: not UTF-8 nor iso-8859-1, or some other read error happened.")
else:
return HttpResponse(content=open(tfile,"rb"), content_type=getmimetype(tfile))