2021-03-28 03:48:04 +01:00
from pathlib import Path
2020-06-20 23:08:34 +01:00
2011-07-11 02:10:22 +01:00
from django . conf import settings
2021-05-03 20:36:29 +01:00
from django . http import HttpResponse
2023-01-19 18:35:56 +00:00
from django . shortcuts import render
2020-06-20 23:08:34 +01:00
2021-05-03 20:36:29 +01:00
from troggle . core . models . survex import DrawingFile
2021-03-31 21:51:17 +01:00
from troggle . core . views . expo import getmimetype
2023-01-19 18:35:56 +00:00
2023-01-30 19:04:36 +00:00
# import parsers.surveys
2020-07-28 01:22:06 +01:00
2023-01-30 19:04:36 +00:00
""" Some of these views serve files as binary blobs, and simply set the mime type based on the file extension,
2021-03-28 03:48:04 +01:00
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 .
2021-03-28 23:47:47 +01:00
2021-05-04 20:57:16 +01:00
2023-01-30 19:04:36 +00:00
"""
2021-05-04 20:57:16 +01:00
2023-01-30 19:04:36 +00:00
todo = """ - Need to check if invalid query string is invalid, or produces multiple replies
2021-04-20 23:57:19 +01:00
and render a user - friendly error page .
2023-01-30 19:04:36 +00:00
"""
2011-07-11 02:10:22 +01:00
2022-10-15 15:25:41 +01:00
def unescape ( input ) :
2023-01-30 19:04:36 +00:00
""" These look like HTML entities, but they are not. They are tunnel-specific encodings """
2022-10-15 15:25:41 +01:00
codes = {
2023-01-30 19:04:36 +00:00
" &space; " : " " ,
" " " : ' " ' ,
" &tab; " : " \t " ,
" &backslash; " : " \\ " ,
" &newline; " : " \n | \t " ,
2022-10-15 15:25:41 +01:00
" &apostrophe " : " ' " ,
}
for c in codes :
2023-01-30 19:04:36 +00:00
# print(c, codes[c])
2022-10-15 15:25:41 +01:00
input = input . replace ( c , codes [ c ] )
return input
2023-01-30 19:04:36 +00:00
2021-05-04 20:57:16 +01:00
2021-05-04 14:16:48 +01:00
def dwgallfiles ( request ) :
2023-01-30 19:04:36 +00:00
""" Report on all the drawing files in the system. These were loaded by parsing the entire directory tree """
2021-04-26 18:08:42 +01:00
dwgfiles = DrawingFile . objects . all ( )
2023-01-30 19:04:36 +00:00
return render ( request , " dwgfiles.html " , { " dwgfiles " : dwgfiles , " settings " : settings } )
2011-07-11 02:10:22 +01:00
2021-04-08 01:09:06 +01:00
def dwgfilesingle ( request , path ) :
2023-01-30 19:04:36 +00:00
""" sends a single binary file to the user. It could be an old PNG, PDF or SVG
2022-10-15 12:07:15 +01:00
not just Tunnel or Therion
2023-01-30 19:04:36 +00:00
The db records created on datbase reset import are not used when we look for an individual drawing , only
2022-08-11 20:18:58 +01:00
collections of them .
2023-01-30 19:04:36 +00:00
2022-08-11 20:18:58 +01:00
Note the infelicity that this will deliver files that exist , but are hidden on the previous
webpage / dwgupload / . . . if the user types the filename into the browser bar . Could be a problem ?
Should we validate using uploads . py dwgvaliddisp ( ) here too ?
2023-01-30 19:04:36 +00:00
"""
tfile = Path ( settings . DRAWINGS_DATA , path . replace ( " : " , " # " ) )
2022-08-11 20:18:58 +01:00
if not tfile . is_file ( ) :
2023-01-30 19:04:36 +00:00
message = f " Drawing file not found in filesystem at ' { path } ' \n \t \t Maybe a new dataimport needs to be done to get up to date. "
return render ( request , " errors/generic.html " , { " message " : message } )
if Path ( tfile ) . suffix in [
" .xml "
] : # tunnel files are usually 'us-ascii' (!). And may not close all XML tags properly either.
for encoding in [ " us-ascii " , " iso-8859-1 " , " utf-8 " ] :
try :
# print(f'attempting {encoding} for {tfile}')
with open ( tfile , encoding = encoding , errors = " strict " ) as f :
print ( f " - before reading any { encoding } " )
2022-10-15 12:07:15 +01:00
lines = f . readlines ( )
2023-01-30 19:04:36 +00:00
# print(f'- finished reading {encoding}')
2022-10-15 12:07:15 +01:00
clean = [ ]
for l in lines :
2023-01-30 19:04:36 +00:00
clean . append ( unescape ( l ) ) # deals with strangely embedded survex file
# print(f'- Cleaned and stripped.')
2022-10-15 12:07:15 +01:00
try :
return HttpResponse ( content = clean , content_type = " text/xml " )
except :
2023-01-30 19:04:36 +00:00
return HttpResponse (
content = f " Render fail for this file: { tfile } Please report to a nerd. Probably Julian ' s fault. "
)
2022-10-15 12:07:15 +01:00
except :
2023-01-30 19:04:36 +00:00
print ( f " ! Exception when reading { encoding } " )
2022-10-15 12:07:15 +01:00
continue
2023-01-30 19:04:36 +00:00
print ( f " ! None of those encodings worked for { tfile } " )
2022-03-05 22:16:03 +00:00
try :
2023-01-30 19:04:36 +00:00
return HttpResponse ( content = open ( tfile , errors = " ignore " ) , content_type = getmimetype ( tfile ) )
2022-10-15 12:07:15 +01:00
except :
2023-01-30 19:04:36 +00:00
return HttpResponse (
content = f " Unable to understand the encoding for this file: { tfile } Please report to a nerd. "
)
2021-10-31 17:25:45 +00:00
2023-01-30 19:04:36 +00:00
if Path ( tfile ) . suffix in [ " th2 " , " .th " ] :
try :
return HttpResponse ( content = open ( tfile , errors = " strict " ) , content_type = " text/txt " ) # default utf-8
except :
return HttpResponse (
content = f " Unable to understand the encoding for this file: { tfile } Please report to a nerd. "
)
2011-07-11 02:10:22 +01:00
2023-01-30 19:04:36 +00:00
else : # SVG, JPG etc
try :
return HttpResponse ( content = open ( tfile , mode = " rb " ) , content_type = getmimetype ( tfile ) ) # default utf-8
except :
try :
return HttpResponse ( content = open ( tfile , mode = " rb " ) )
except :
return HttpResponse (
content = f " Unable to understand the encoding ' { getmimetype ( tfile ) } ' for this file: { tfile } Note that Apache will do its own thing here. Please report to a nerd. "
)