summaryrefslogtreecommitdiffstats
path: root/core/view_surveys.py
blob: a70fa3da457eb603035c186e840cff861b1b24b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import os, stat
import re
from pathlib import Path
from urllib.parse import urljoin, unquote as urlunquote
from urllib.request import urlopen

from django.conf import settings
from django.shortcuts import render
from django.http import HttpResponse, Http404

from troggle.core.models_survex import ScansFolder, SingleScan, SurvexBlock, TunnelFile
from troggle.flatpages import views as flatviews
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.
'''

def surveyscansfolder(request, path):
    #print [ s.walletname  for s in ScansFolder.objects.all() ]
    scansfolder = ScansFolder.objects.get(walletname=urlunquote(path))
    return render(request, 'scansfolder.html', { 'scansfolder':scansfolder, 'settings': settings })

def surveyscansingle(request, path, file):
    '''sends a single binary file to the user,
    '''
    scansfolder = ScansFolder.objects.get(walletname=urlunquote(path))
    singlescan = SingleScan.objects.get(scansfolder=scansfolder, name=file)
    # print(" - surveyscansingle {}:{}:{}:".format(path, file, flatviews.getmimetype(file)))
    return HttpResponse(content=open(singlescan.ffile,"rb"), content_type=flatviews.getmimetype(file)) # any type of image


def surveyscansfolders(request):
    manyscansfolders = ScansFolder.objects.all()
    return render(request, 'manyscansfolders.html', { 'manyscansfolders':manyscansfolders, 'settings': settings })
    
    
def tunneldata(request):
    tunnelfiles = TunnelFile.objects.all()
    return render(request, 'tunnelfiles.html', { 'tunnelfiles':tunnelfiles, 'settings': settings })
    

def tunnelfilesingle(request, path):
    '''sends a single binary file to the user, We should have a renderer that syntax-colours this Tunnel xml 
    '''
    tunnelfile = TunnelFile.objects.get(tunnelpath=urlunquote(path))
    tfile = Path(settings.TUNNEL_DATA, tunnelfile.tunnelpath)
    return HttpResponse(content=open(tfile), content_type="text/xhtml") # for display not download
    
def tunnelfileupload(request, path):
    tunnelfile = TunnelFile.objects.get(tunnelpath=urlunquote(path))
    tfile = Path(settings.TUNNEL_DATA, tunnelfile.tunnelpath)
    
    project, user, password, tunnelversion = request.POST["tunnelproject"], request.POST["tunneluser"], request.POST["tunnelpassword"], request.POST["tunnelversion"]
    print((project, user, tunnelversion))
    
    
    assert len(list(request.FILES.values())) == 1, "only one file to upload"
    
    uploadedfile = list(request.FILES.values())[0]
        
    if uploadedfile.field_name != "sketch":
        return HttpResponse(content="Error: non-sketch file uploaded", content_type="text/plain")
    if uploadedfile.content_type != "text/plain":
        return HttpResponse(content="Error: non-plain content type", content_type="text/plain")
        
    # could use this to add new files
    if os.path.split(path)[1] != uploadedfile.name:  
        return HttpResponse(content="Error: name disagrees", content_type="text/plain")
    
    orgsize = tunnelfile.filesize   # = os.stat(tfile)[stat.ST_SIZE]
        
    ttext = uploadedfile.read()
    
    # could check that the user and projects agree here
    
    fout = open(tfile, "w")
    fout.write(ttext)
    fout.close()
    
    # redo its settings of 
    parsers.surveys.SetTunnelfileInfo(tunnelfile)
    tunnelfile.save()
    
    uploadedfile.close()
    message = "File size %d overwritten with size %d" % (orgsize, tunnelfile.filesize)
    return HttpResponse(content=message, content_type="text/plain")