From 8fc25de794dfd74b58421e0436f87b035c4529d9 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Sun, 5 Mar 2023 23:06:06 +0000 Subject: [PATCH] Initial attempts at saving edited survex file --- core/views/survex.py | 9 ++++++-- parsers/survex.py | 52 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/core/views/survex.py b/core/views/survex.py index 935ecd9..e2a7309 100644 --- a/core/views/survex.py +++ b/core/views/survex.py @@ -21,6 +21,7 @@ from troggle.core.models.caves import Cave from troggle.core.models.survex import SurvexFile, SurvexBlock from troggle.core.models.wallets import Wallet from troggle.core.utils import only_commit +from troggle.parsers.survex import parse_one_file """Everything that views survexfiles but also displays data on a cave or caves when there is ambiguity @@ -198,6 +199,10 @@ class SvxForm(forms.Form): comment = f"Online survex edit: {self.data['filename']}.svx on dev machine '{socket.gethostname()}' " only_commit(fname, comment) + + parse_one_file(self.data["filename"]) + + return "SAVED and committed to git (if there were differences)" def Process(self): @@ -307,9 +312,9 @@ def svx(request, survex_file): warning = True if not difflist: if svxfile: - difflist.append("No differences.") + difflist.append("No differences from last saved file.") else: - difflist.append("No differences from initial template.") + difflist.append("No differences from last saved file (or from initial template).") if message: difflist.insert(0, message) diff --git a/parsers/survex.py b/parsers/survex.py index 4a4cb85..57746e0 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -34,6 +34,9 @@ todo = """ - LoadSurvexFile() Creates a new current survexfile and valid .survexdirectory The survexblock passed-in is not necessarily the parent. FIX THIS. +- Finish writing the parse_one_file() function for survexfiles edited online. Perhaps + easier if this is a completely new file rather than an existing file.. nasty. + - When Olly implements LEG in the 'dump3d --legs' utility, then we can use that to get the length of all the legs in a survex block instead of adding them up oursleves. Which means that we can ignore all the Units and offset stuff, that troggle will work with survex files with backsights, @@ -330,6 +333,7 @@ class LoadingSurvex: currentteam = set() inheritteam = set() pending = [] + nocreate = False def __init__(self): self.caveslist = GetCaveLookup() @@ -1249,6 +1253,10 @@ class LoadingSurvex: svxid = included.groups()[0] if svxid.lower() == debugprinttrigger.lower(): debugprint = True + if self.nocreate: + # skip *include files if we are parsing just one file ?! + # Maybe do this as a setting in the survexfile SAVE form? + return self.LoadSurvexFile(svxid) self.stacksvxfiles.append(self.currentsurvexfile) @@ -2131,10 +2139,52 @@ def FindAndLoadSurvex(survexblockroot): def parse_one_file(fpath): # --------------------------------------in progress------------------- """Parse just one file. Use when re-loading after editing. NB careful of *include lines, which may exist! Ignore them. + + WORK IN PROGRESS. NONE OF THIS WORKS. + Currently just returns True without saving anything + Problems with re-setting multiple anonymous blocks in the survexfile + Need to delete them all and recreate all the links, e.g. to wallets and people """ - print("\n - Loading One Survex file (LinearLoad)", file=sys.stderr) + print(f"\n - Loading One Survex file '{fpath}'", file=sys.stderr) svx_load = LoadingSurvex() + collatefilename = Path(settings.SURVEX_DATA, (fpath + ".svx")) + print(f" - {collatefilename=}") + + + svxs = SurvexFile.objects.filter(path=fpath) + # If this SurvexFile object already exists in the database, we want to keep the parent survexblock + # but replace everything else by parsing the file. + # But we do not want to delete and recreate the object as other survex files may have this as the parent + # and we are not processing any *include we find + if svxs: + if len(svxs)>1: + print(f" ! Error. More than one survex file object in database with the same file-path {svx}") + raise + print(f" - pre-existing survexfile {svxs}") + + svx = svxs[0] # first and only member of QuerySet + b = SurvexBlock.objects.filter(survexfile=svx) + if len(b)>1: + print(f" ! Error. More than one survex file object in database attached to survexblock {b}") + raise + + survexblockroot=b[0] + print(f" - {survexblockroot=}") + + dir = svx.survexdirectory + svx_load.survexdict[dir] = [svx] + svx_load.svxdirs[""] = dir + return True + svx_load.nocreate = True + # ---------------------------------------------------------------- + svx_load.LinearLoad(survexblockroot, fpath, collatefilename) + # ---------------------------------------------------------------- + + else: + print(f" - Not seen this survexfile before '{fpath}'") + + return True omitsfileroot = MakeOmitFileRoot(fpath) # NO! This always creats a SurvexFile object. We are overwriting one.. survexomitsroot = SurvexBlock( name=OMITBLOCK, survexpath="", survexfile=omitsfileroot, legsall=0, legslength=0.0