2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2024-11-25 08:41:51 +00:00

GPX upload

This commit is contained in:
Philip Sargent 2024-07-13 14:49:55 +02:00
parent fca95ce539
commit cef872d038
4 changed files with 268 additions and 3 deletions

View File

@ -143,6 +143,9 @@ class FilesRenameForm(forms.Form): # not a model-form, just a form-form
class TextForm(forms.Form): # not a model-form, just a form-form class TextForm(forms.Form): # not a model-form, just a form-form
photographer = forms.CharField(strip=True) photographer = forms.CharField(strip=True)
class TextProspectorForm(forms.Form): # not a model-form, just a form-form
prospector = forms.CharField(strip=True)
class ExpofileRenameForm(forms.Form): # not a model-form, just a form-form class ExpofileRenameForm(forms.Form): # not a model-form, just a form-form
renameto = forms.CharField(strip=True, required=False) renameto = forms.CharField(strip=True, required=False)
@ -726,6 +729,7 @@ def photoupload(request, folder=None):
if request.method == "POST": if request.method == "POST":
if "photographer" in request.POST: if "photographer" in request.POST:
# then we are creating a new folder
formd = TextForm(request.POST) formd = TextForm(request.POST)
if formd.is_valid(): if formd.is_valid():
newphotographer = sanitize_name(request.POST["photographer"]) newphotographer = sanitize_name(request.POST["photographer"])
@ -737,6 +741,7 @@ def photoupload(request, folder=None):
return render(request, "errors/generic.html", {"message": message}) return render(request, "errors/generic.html", {"message": message})
else: else:
# then we are renaming the file ?
form = FilesRenameForm(request.POST, request.FILES) form = FilesRenameForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():
f = request.FILES["uploadfiles"] f = request.FILES["uploadfiles"]
@ -815,6 +820,162 @@ def photoupload(request, folder=None):
}, },
) )
@login_required_if_public
def gpxupload(request, folder=None):
"""Copy of photo upload
folder is the "path"
"""
def gpxvalid(name):
if Path(name).suffix.lower() in [".xml", ".gpx"]:
return True # dangerous, we should check the actual file binary signature
return False
print(f"gpxupload() {folder=}")
year = current_expo()
filesaved = False
actual_saved = []
context = {"year": year, "placeholder": "AnathemaDevice"}
yearpath = Path(settings.EXPOFILES) / "gpslogs" / year
if folder == str(year) or folder == str(year) + "/":
folder = None
if folder is None:
folder = "" # improve this later
dirpath = yearpath
urlfile = f"/expofiles/gpslogs/{year}"
urldir = f"/gpxupload/{year}"
else: # it will contain the year as well as the prospector
dirpath = Path(settings.EXPOFILES) / "gpslogs" / folder
if dirpath.is_dir():
urlfile = f"/expofiles/gpslogs/{folder}"
urldir = Path("/gpxupload") / folder
else:
folder = "" # improve this later
dirpath = yearpath
urlfile = f"/expofiles/gpslogs/{year}"
urldir = f"/gpxupload/{year}"
print(f"gpxupload() {folder=} {dirpath=} {urlfile=} {urldir=}")
form = FilesRenameForm()
formd = TextProspectorForm()
print(f"gpxupload() {form=} {formd=} ")
if request.method == "POST":
print(f"gpxupload() method=POST")
for i in request.POST:
print(" ",i)
if "prospector" in request.POST:
print(f"gpxupload() {request.POST=}\n {request.POST["prospector"]=}")
formd = TextProspectorForm(request.POST)
if formd.is_valid():
newprospector = sanitize_name(request.POST["prospector"])
print(f"gpxupload() {newprospector=}")
try:
(yearpath / newprospector).mkdir(exist_ok=True)
except:
message = f'\n !! Permissions failure ?! 0 attempting to mkdir "{(yearpath / newprospector)}"'
print(message)
return render(request, "errors/generic.html", {"message": message})
else:
print(f"gpxupload() no prospector field")
print(f"gpxupload() {request.FILES=}")
for i in request.FILES:
print(" ",i)
form = FilesRenameForm(request.POST, request.FILES)
print(f"gpxupload() is the FilesRenameForm valid? {form=}")
for i in form:
print(" ",i)
if not form.is_valid():
print(f"gpxupload() Form is not valid {form=}")
else:
print(f"gpxupload() about to look at request.FILES")
f = request.FILES["uploadfiles"]
multiple = request.FILES.getlist("uploadfiles")
# NO CHECK that the files being uploaded are image files
fs = FileSystemStorage(dirpath)
renameto = sanitize_name(request.POST["renameto"])
actual_saved = []
if multiple:
if len(multiple) == 1:
if renameto != "":
try: # crashes in Django os.chmod call if on WSL, but does save file!
saved_filename = fs.save(renameto, content=f)
except:
print(
f'\n !! Permissions failure ?! 1 attempting to save "{f.name}" in "{dirpath}" {renameto=}'
)
if "saved_filename" in locals():
if saved_filename.is_file():
actual_saved.append(saved_filename)
filesaved = True
else: # multiple is the uploaded content
try: # crashes in Django os.chmod call if on WSL, but does save file!
saved_filename = fs.save(f.name, content=f)
except:
print(
f'\n !! Permissions failure ?! 2 attempting to save "{f.name}" in "{dirpath}" {renameto=}'
)
if "saved_filename" in locals():
if saved_filename.is_file():
actual_saved.append(saved_filename)
filesaved = True
else: # multiple is a list of content
for f in multiple:
try: # crashes in Django os.chmod call if on WSL, but does save file!
saved_filename = fs.save(f.name, content=f)
except:
print(
f'\n !! Permissions failure ?! 3 attempting to save "{f.name}" in "{dirpath}" {renameto=}'
)
if "saved_filename" in locals():
if saved_filename.is_file():
actual_saved.append(saved_filename)
filesaved = True
print(f"gpxupload() drop through")
files = []
dirs = []
try:
for f in dirpath.iterdir():
if f.is_dir():
dirs.append(f.name)
if f.is_file():
files.append(f.name)
except FileNotFoundError:
files.append("(no folder yet - would be created)")
except Exception as e:
print(f"gpxupload() EXCEPTION\n {e}")
if len(files) > 0:
files = sorted(files)
if dirs:
dirs = sorted(dirs)
print(f"gpxupload() about to render..")
return render(
request,
"gpxuploadform.html",
{
"form": form,
**context,
"urlfile": urlfile,
"urldir": urldir,
"folder": folder,
"files": files,
"dirs": dirs,
"filesaved": filesaved,
"actual_saved": actual_saved,
},
)
@login_required_if_public @login_required_if_public
def dwgupload(request, folder=None, gitdisable="no"): def dwgupload(request, folder=None, gitdisable="no"):

View File

@ -37,8 +37,8 @@
<div class="toolbarlinks"> <div class="toolbarlinks">
{% endif %} {% endif %}
<a href="/logbookedit/">Logbook Entry</a> | <a href="/logbookedit/">Logbook Entry</a> |
<a href="/1626/359/359.html">359 (HC)</a> | <!--<a href="/1626/359/359.html">359 (HC)</a> |-->
<a id="cavesLink" href="/caves">caves</a> | <a id="cavesLink" href="/caves">Caves</a> |
<a id="qmsLink" href="{% url "caveQMs" "1623-290" %}">QMs</a> | <a id="qmsLink" href="{% url "caveQMs" "1623-290" %}">QMs</a> |
<a href="/survexfile/">Survex</a> | <a href="/survexfile/">Survex</a> |
<a href="{% url "survexcaveslist" %}">All Survex</a> | <a href="{% url "survexcaveslist" %}">All Survex</a> |
@ -47,6 +47,7 @@
<a href="{% url "dwgallfiles" %}">Drawings</a> | <a href="{% url "dwgallfiles" %}">Drawings</a> |
<a href="{% url "dwgupload" %}">Upload Drawings</a> | <a href="{% url "dwgupload" %}">Upload Drawings</a> |
<a href="{% url "photoupload" %}">Upload Photos</a> | <a href="{% url "photoupload" %}">Upload Photos</a> |
<a href="{% url "gpxupload" %}">Upload GPX</a> |
<br> <br>

View File

@ -0,0 +1,101 @@
{% extends "base.html" %}
{% block title %}Simple Fileupload (GPX files){% endblock %}
{% block content %}
{% if folder %}
<h2>Upload GPX files into /gpslogs/{{folder}}/</h2>
{% else %}
<h2>Upload GPX files into /gpslogs/{{year}}/</h2>
{% endif %}
<div style = "max-width:35%; margin-left:20%; text-align: center; " >
<form method ='post' enctype ="multipart/form-data">
{% csrf_token %}
<br>
<input class="fancybutton2" type = "file" multiple="multiple"
name = "uploadfiles" id="uploadfiles" />
<br><br><br>
<input class="fancybutton2" style="padding: 0.5em 25px; margin-left: 125px"
label = "Rename to" name = "renameto" id="renameto"
pattern="[A-Za-z][A-Za-z0-9_-\.]*"/>
<br />
<label
style="padding: 0.5em 25px; margin-left: 110px"
for="renameto">If uploading a single file, you can rename it<br></label>
<br><br><br>
<button class="fancybutton2" style="padding: 0.5em 25px; margin-left: 155px" type = "submit" value = "Upload" >
Upload
</button>
</form>
</div>
<div style = "max-width:29%; margin-left:20%; text-align: left" >
{% if filesaved %}
<p>
<b>File(s) saved as <br>
{% for f in actual_saved %}
<em>{{f}}</em> <br>
{% endfor %}
</p>
{% endif %}
<strong style="font-size: 110%;">Files:</strong><br>
{% for f in files %}
<a href="{{urlfile|urlencode}}/{{f|urlencode}}">{{f}}</a><br />
{% empty %}
<p>&lt;No files here&gt;
{% endfor %}
<p><strong style="font-size: 110%;">Prospector Directories:</strong><br>
{% if folder %}
<a href="{{urldir}}/..">[up]</a><br />
{% endif %}
{% for f in dirs %}
<a href="{{urldir}}/{{f}}">/{{f}}/</a><br />
{% empty %}
<p>&lt;No subdirectories&gt;
{% endfor %}
</div>
{% if folder %}
<p>You can upload your GPX tracks here.
<p>You cannot create sub-folders here.
<p>Note that only GPX files are accepted: all other types of files are refused.
{% else %}
<p>You can upload your GPX tracks to any of these folders, and you can create a new folder in your name for your gpslogs.
<p>Note that only GPX files are accepted: all other types of files are refused.
<hr>
<h2>Create new prospector folder in /gpslogs/{{year}}/</h2>
<div style = "max-width:35%; margin-left:20%; text-align: center; " >
<form method ='post'>
{% csrf_token %}
<br>
<input class="fancybutton2" style="padding: 0.5em 25px; margin-left: 125px"
label = "prospector" name = "prospector" id="prospector"
pattern="[A-Za-z]+"
placeholder="{{placeholder}}" required />
<label
style="padding: 0.5em 25px; margin-left: 110px"
for="prospector">prospector's name<br></label>
<label
style="padding: 0.5em 25px; margin-left: 110px"
for="prospector">(no spaces, only letters)</label>
<br><br><br>
<button class="fancybutton2" style="padding: 0.5em 25px; margin-left: 155px" type = "submit" value = "Create" >
Create folder
</button>
</form>
</div>
<p>
{% endif %}
<hr />
{% endblock %}

View File

@ -24,7 +24,7 @@ from troggle.core.views.other import (controlpanel, exportlogbook, frontpage,
from troggle.core.views.prospect import prospecting from troggle.core.views.prospect import prospecting
from troggle.core.views.scans import (allscans, cavewallets, scansingle, from troggle.core.views.scans import (allscans, cavewallets, scansingle,
walletslistperson, walletslistyear) walletslistperson, walletslistyear)
from troggle.core.views.uploads import dwgupload, photoupload, expofilerename, logbookedit from troggle.core.views.uploads import dwgupload, photoupload, gpxupload, expofilerename, logbookedit
from troggle.core.views.wallets_edit import walletedit from troggle.core.views.wallets_edit import walletedit
"""This sets the actualurlpatterns[] and urlpatterns[] lists which django uses """This sets the actualurlpatterns[] and urlpatterns[] lists which django uses
to resolve urls - in both directions as these are declarative. to resolve urls - in both directions as these are declarative.
@ -115,6 +115,8 @@ trogglepatterns = [
path('walletedit/<path:path>', walletedit, name='walletedit'), # path=2020#01 path('walletedit/<path:path>', walletedit, name='walletedit'), # path=2020#01
path('photoupload/', photoupload, name='photoupload'), # restricted to current year path('photoupload/', photoupload, name='photoupload'), # restricted to current year
path('photoupload/<path:folder>', photoupload, name='photoupload'), # restricted to current year path('photoupload/<path:folder>', photoupload, name='photoupload'), # restricted to current year
path('gpxupload/', gpxupload, name='gpxupload'), # restricted to current year
path('gpxupload/<path:folder>', gpxupload, name='gpxupload'), # restricted to current year
path('dwgupload/<path:folder>', dwgupload, name='dwgupload'), path('dwgupload/<path:folder>', dwgupload, name='dwgupload'),
path('dwgupload/', dwgupload, name='dwgupload'), path('dwgupload/', dwgupload, name='dwgupload'),
path('dwguploadnogit/', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing path('dwguploadnogit/', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing