2020-06-20 23:08:34 +01:00
import os , stat
import re
2021-03-28 03:48:04 +01:00
from pathlib import Path
from urllib . parse import urljoin , unquote as urlunquote
2020-06-20 23:08:34 +01:00
2011-07-11 02:10:22 +01:00
from django . conf import settings
2021-03-28 03:48:04 +01:00
from django . shortcuts import render
2021-05-03 20:36:29 +01:00
from django . http import HttpResponse
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
2021-05-03 20:36:29 +01:00
#import parsers.surveys
2020-07-28 01:22:06 +01:00
2021-03-28 03:48:04 +01:00
''' 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 .
2021-03-28 23:47:47 +01:00
2021-05-04 20:57:16 +01:00
'''
2022-08-11 20:18:58 +01: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 .
2021-03-28 03:48:04 +01:00
'''
2011-07-11 02:10:22 +01:00
2022-10-15 15:25:41 +01:00
def unescape ( input ) :
''' These look like HTML entities, but they are not. They are tunnel-specific encodings
'''
codes = {
" &space; " : " " ,
" " " : " \" " ,
" &tab; " : " \t " ,
" &backslash; " : " \\ " ,
" &newline; " : " \n \t " ,
" &apostrophe " : " ' " ,
}
for c in codes :
#print(c, codes[c])
input = input . replace ( c , codes [ c ] )
return input
2021-05-04 20:57:16 +01:00
2021-05-04 14:16:48 +01:00
def dwgallfiles ( request ) :
2021-04-20 23:57:19 +01: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 ( )
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 ) :
2022-10-15 12:07:15 +01:00
''' sends a single binary file to the user. It could be an old PNG, PDF or SVG
not just Tunnel or Therion
2022-08-11 20:18:58 +01:00
2022-10-15 12:07:15 +01: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 .
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 ?
2021-03-28 03:48:04 +01:00
'''
2022-08-31 10:09:07 +01:00
tfile = Path ( settings . DRAWINGS_DATA , path . replace ( " : " , " # " ) )
2022-08-11 20:18:58 +01:00
if not tfile . is_file ( ) :
2022-10-15 12:07:15 +01: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. '
2021-04-20 23:57:19 +01:00
return render ( request , ' errors/generic.html ' , { ' message ' : message } )
2022-03-05 22:16:03 +00:00
2022-10-15 12:07:15 +01:00
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 } ' )
lines = f . readlines ( )
#print(f'- finished reading {encoding}')
clean = [ ]
for l in lines :
2022-10-15 15:25:41 +01:00
clean . append ( unescape ( l ) ) # deals with strangely embedded survex file
2022-10-15 12:07:15 +01:00
#print(f'- Cleaned and stripped.')
try :
return HttpResponse ( content = clean , content_type = " text/xml " )
except :
return HttpResponse ( content = f " Render fail for this file: { tfile } Please report to a nerd. Probably Julian ' s fault. " )
except :
print ( f ' ! Exception when reading { encoding } ' )
continue
print ( f ' ! None of those encodings worked for { tfile } ' )
try :
return HttpResponse ( content = open ( tfile , errors = ' ignore ' ) , content_type = getmimetype ( tfile ) )
except :
return HttpResponse ( content = f " Unable to understand the encoding for this file: { tfile } Please report to a nerd. " )
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. " )
else : # SVG, JPG etc
try :
return HttpResponse ( content = open ( tfile , mode = ' rb ' ) , content_type = getmimetype ( tfile ) ) # default utf-8
except :
2022-03-05 22:16:03 +00:00
try :
2022-10-15 12:07:15 +01:00
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. " )
2021-10-31 17:25:45 +00:00
2011-07-11 02:10:22 +01:00