From 284e044a03caccab0d5dfa2cd1ac56949b80c20b Mon Sep 17 00:00:00 2001 From: Philip Sargent <philip.sargent@klebos.com> Date: Sun, 14 Aug 2022 22:52:14 +0300 Subject: [PATCH] Fix wallets scan upload faults --- core/views/uploads.py | 54 +++++++++++++++++++++++++++------------ parsers/drawings.py | 4 +-- parsers/scans.py | 34 ++++++++++++------------ parsers/survex.py | 6 +++++ templates/walletform.html | 20 ++++++++++++--- 5 files changed, 80 insertions(+), 38 deletions(-) diff --git a/core/views/uploads.py b/core/views/uploads.py index 369e297..f76b38b 100644 --- a/core/views/uploads.py +++ b/core/views/uploads.py @@ -23,7 +23,7 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned #from troggle import settings from troggle.parsers.imports import import_caves, import_people, import_surveyscans from troggle.parsers.imports import import_logbooks, import_QMs, import_drawingsfiles, import_survex -from troggle.parsers.scans import wallet_blank_json, wallet_blank_html, contentsjson, indexhtml, CopyWalletData +from troggle.parsers.scans import wallet_blank_json, contentsjson, CopyWalletData # from databaseReset import reinit_db # don't do this. databaseRest runs code *at import time* from troggle.core.models.troggle import DataIssue from troggle.core.models.troggle import Expedition, Person, PersonExpedition @@ -63,6 +63,9 @@ class FilesForm(forms.Form): # not a model-form, just a form-form class FilesRenameForm(forms.Form): # not a model-form, just a form-form uploadfiles = forms.FileField() renameto = forms.CharField(strip=True, required=False) + +class WalletGotoForm(forms.Form): # not a model-form, just a form-form + walletgoto = forms.CharField(strip=True, required=False) class TextForm(forms.Form): # not a model-form, just a form-form photographer = forms.CharField(strip=True) @@ -200,6 +203,10 @@ def scanupload(request, path=None): '''Upload scanned image files into a wallet on /expofiles Also display AND EDIT the contents.json data in the wallet. + The Wallet object and the contents.json file are only created when the user + edits the JSON data, not when they upload files. This may be a bad idea + as the wallet will not appear in reports untilt his is done. + This does NOT use a Django model linked to a Django form. Just a simple Django form. You will find the Django documentation on forms very confusing, This is simpler. @@ -269,7 +276,6 @@ def scanupload(request, path=None): # Also lots of hassle with lists of strings interpreted as a single string # Unset checkboxes do not return any value, checked ones return "True". So need initialising to False if formj.is_valid(): - #print(f'--- JSON Update form is VALID, saving to {contents_path}') posted = request.POST.copy() posted.pop("csrfmiddlewaretoken") # discard this wd = wallet_blank_json @@ -295,11 +301,17 @@ def scanupload(request, path=None): wd["survex file"][i] = elem.strip() #print(f'--- {wd["survex file"]} - {type(wd["survex file"])}') + newfolder = contents_path.parent + print(f'--- wallet directory in :drawings: repo {newfolder=}') + if not os.path.exists(contents_path.parent): + print(f'--- No wallet directory in :drawings: repo, so creating it') + os.makedirs(contents_path.parent) + with open(contents_path, "w") as jfile: json.dump(wd, jfile, indent = 1) - # print(f'--- FINISHED saving to JSON\n') + print(f'--- FINISHED saving to JSON at {contents_path}') - # This copies the new data to the drawings repo and commits it + # This commits it, # needs the troggle object wallet, not a string try: @@ -311,7 +323,8 @@ def scanupload(request, path=None): except: print(f'wallet string {wallet}, FAIL TO GET or create WALLET OBJECT') raise - + + # now we do the git add and commit destfolder = contents_path.parent dr_add = subprocess.run([git, "add", contentsjson], cwd=destfolder, capture_output=True, text=True) if dr_add.returncode != 0: @@ -333,6 +346,13 @@ def scanupload(request, path=None): print(formj.errors) return render(request,'errors/generic.html', {'message': formj.errors}) + elif "walletgoto" in request.POST: # not editing wallet data, uploading a file.. going direct to a named wallet + formg = WalletGotoForm(request.POST,request.FILES) + if formg.is_valid(): + walletgoto = request.POST["walletgoto"] + + return HttpResponseRedirect(f'/scanupload/{walletgoto.replace("#",":")}') + else: # not editing wallet data, uploading a file.. form = FilesForm(request.POST,request.FILES) @@ -354,15 +374,18 @@ def scanupload(request, path=None): # print(f'! - FORM scanupload multiple {actual_saved}') filesaved = True - if not contents_path.is_file(): # double-check - with open(contents_path, "w") as json_file: - json.dump(wallet_blank_json, json_file, sort_keys=True, indent = 1) - index_path = dirpath / indexhtml - if not index_path.is_file(): # double-check - thishtml = wallet_blank_html.replace("YEAR", str(year)) - thishtml = thishtml.replace("WALLET", str(wallet)) - with open(index_path, "w") as html_file: - html_file.write(thishtml ) + # Don't do this when uploading a file. + # The contents.json file will be created when the wallet data is edited for the first time. + # if not contents_path.is_file(): # double-check: it doesn't exist yet so create it when uploading a file. + # with open(contents_path, "w") as json_file: + # json.dump(wallet_blank_json, json_file, sort_keys=True, indent = 1) + + # index_path = dirpath / indexhtml + # if not index_path.is_file(): # double-check it doesn't exist yet + # thishtml = wallet_blank_html.replace("YEAR", str(year)) + # thishtml = thishtml.replace("WALLET", str,(wallet)) + # with open(index_path, "w") as html_file: + # html_file.write(thishtml ) files = [] dirs = [] @@ -374,8 +397,7 @@ def scanupload(request, path=None): if f.is_dir(): dirs.append(f.name) if f.is_file(): - if f.name != 'contents.json' and f.name != 'walletindex.html': - files.append(f.name) + files.append(f.name) except FileNotFoundError: files.append('(no wallet yet. It would be created if you upload a scan)') else: diff --git a/parsers/drawings.py b/parsers/drawings.py index 1c5a1e8..4f52889 100644 --- a/parsers/drawings.py +++ b/parsers/drawings.py @@ -18,7 +18,7 @@ from troggle.core.utils import save_carefully, GetListDir for tunnel and therion files ''' -todo=''' +todo='''Rename functions more consistently between tunnel and therion variants ''' def find_dwg_file(dwgfile, path): @@ -104,7 +104,7 @@ def findwalletimage(therionfile, foundpath): else: message = f'! Scanned file {scanfilename} mentioned in "{therionfile.dwgpath}" is not actually found in {wallet.walletname}' wurl = f'/survey_scans/{wallet.walletname}/'.replace("#",":") - print(message) + # print(message) DataIssue.objects.create(parser='Therion', message=message, url = wurl) diff --git a/parsers/scans.py b/parsers/scans.py index 6439549..400bd74 100644 --- a/parsers/scans.py +++ b/parsers/scans.py @@ -21,7 +21,7 @@ from troggle.core.views.scans import datewallet ''' contentsjson = "contents.json" -indexhtml = "walletindex.html" +#indexhtml = "walletindex.html" git = settings.GIT # to do: create a 'low priority' field, so that any such wallet does not appear in summary reports @@ -44,22 +44,22 @@ wallet_blank_json = { "survex not required": False, "website updated": False} -wallet_blank_html = '''<html><body><H1>Wallet WALLET</H1> -<p>List of trips: <a href="http://expo.survex.com/expedition/YEAR">expedition/YEAR</a> -- troggle-processed .svx files and logbook entries on server</p> -<p>Date: </p><p>People: Unknown,</p> -<p>Cave <a href='http://expo.survex.com/caves/'>Guidebook description</a> -- A description is indicated as being needed, so may need adding into this cave page. -<p>Survex file: not identified yet -<H2>Issues</H2> -<p>The description needs writing</p> -<p>The QMs needs writing</p><p>The website is marked as needing updating (using the guidebook description)</p> -<p>Tunnel / Therion drawing files need drawing</p> -<H2>Files</H2> -<UL> -</UL> -</body></html> -''' +# wallet_blank_html = '''<html><body><H1>Wallet WALLET</H1> +# <p>List of trips: <a href="http://expo.survex.com/expedition/YEAR">expedition/YEAR</a> +# - troggle-processed .svx files and logbook entries on server</p> +# <p>Date: </p><p>People: Unknown,</p> +# <p>Cave <a href='http://expo.survex.com/caves/'>Guidebook description</a> +# - A description is indicated as being needed, so may need adding into this cave page. +# <p>Survex file: not identified yet +# <H2>Issues</H2> +# <p>The description needs writing</p> +# <p>The QMs needs writing</p><p>The website is marked as needing updating (using the guidebook description)</p> +# <p>Tunnel / Therion drawing files need drawing</p> +# <H2>Files</H2> +# <UL> +# </UL> +# </body></html> +# ''' def CheckEmptyDate(wallet): '''If date is not set, get it from a linked survex file. diff --git a/parsers/survex.py b/parsers/survex.py index d5ed15f..07f5799 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -1528,6 +1528,12 @@ def LoadSurvexBlocks(): survexblockroot = SurvexBlock(name=ROOTBLOCK, survexpath="", cave=None, survexfile=survexfileroot, legsall=0, legslength=0.0) # crashes here sometimes on MariaDB complaining that cave_id should not be null. But it should be. + #django.db.utils.IntegrityError: (1048, "Column 'cave_id' cannot be null") + # fix by restarting db on server + # sudo service mariadb stop + # sudo service mariadb start + + survexblockroot.save() print(' - Loading Survex Blocks...') diff --git a/templates/walletform.html b/templates/walletform.html index bf859f0..c9d9f4b 100644 --- a/templates/walletform.html +++ b/templates/walletform.html @@ -10,6 +10,18 @@ <h2>Wallet {{wallet}}</h2> {% endif %} + <form method ='post' style="text-align: center"> + {% csrf_token %} + <button class="fancybutton" style="padding: 0.5em 25px; font-size: 80%;" type = "submit" value = "Go to" > + Go directly to this wallet: → + </button> + <input + label = "WalletGoto" name = "walletgoto" size="7" + title="Wallet name to go to directly" + placeholder="2022#11" /> + + + </form> <p style="font-family: monospace; font-weight: bold; font-size: 130%; text-align: center"> <a style="font-weight: normal;" href="/scanupload/{{prevy}}:01">{{prevy}}</a> ... @@ -18,8 +30,9 @@ <a href="/scanupload/{{year}}:{{next}}">{{year}}:{{next}}</a> ... <a style="font-weight: normal;" href="/scanupload/{{nexty}}:01">{{nexty}}</a> -</p> +</p> + <div style = "max-width:35%; margin-left:20%; text-align: center; " > <form method ='post' enctype ="multipart/form-data"> {% csrf_token %} @@ -53,9 +66,10 @@ {% if create %} This online wallet does not yet exist. {% if user.username %} - <br>It will be created and initialised automatically when you upload a file. + <br>It will be created and initialised automatically when you upload a file, and then edit the date in the form below and save it. {% else %} - <br>It will be created and initialised automatically when you upload a file, but you need to log on first. + <br>It will be created and initialised automatically when you upload a file, and then edit the date in the form below and save it. + <br>But you need to log in first <a href=/accounts/login/">Log In </a> {% endif %} {% endif %}