diff --git a/core/views/survex.py b/core/views/survex.py index c80c76d..57a8d1a 100644 --- a/core/views/survex.py +++ b/core/views/survex.py @@ -223,10 +223,12 @@ class SvxForm(forms.Form): comment = f"Online survex edit: {self.data['filename']}.svx on dev machine '{socket.gethostname()}' " only_commit(fname, comment) + msg = "SAVED and committed to git (if there were differences)" # should only call this is something changed - parse_one_file(self.data["filename"]) - - return "SAVED and committed to git (if there were differences)" + if parse_one_file(self.data["filename"]): + return msg + else: + return msg + "\nBUT PARSING failed. Do a completely new databaseReset." def Process(self): print(">>>>....\n....Processing\n") diff --git a/parsers/survex.py b/parsers/survex.py index 1e961c8..0156140 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -373,7 +373,7 @@ class LoadingSurvex: if self.inheritteam: message = ( - f"- INHERITING ({survexblock.parent})>({survexblock}) {survexblock.survexfile.path} '{self.inheritteam}'" + f"- no *team INHERITING ({survexblock.parent})>({survexblock}) {survexblock.survexfile.path} '{self.inheritteam}'" ) print(self.insp + message) # stash_data_issue( @@ -2315,85 +2315,31 @@ def parse_one_file(fpath): # --------------------------------------in progress-- It gets overwritten, and then nullified, on repeated SAVE & import. I should learn how to step through with the debugger. """ - def parse_new_svx(fpath): - newfileroot = MakeFileRoot(fpath) - survexblockparent = SurvexBlock( - name="adhoc_parent", survexpath="", survexfile=newfileroot, legsall=0, legslength=0.0 - ) - survexblockparent.save() - - svx_load.survexdict[newfileroot.survexdirectory] = [] - svx_load.survexdict[newfileroot.survexdirectory].append(newfileroot) - svx_load.svxdirs[""] = newfileroot.survexdirectory - - # ---------------------------------------------------------------- - svx_load.LinearLoad(survexblockparent, newfileroot.path, fname) - # ---------------------------------------------------------------- - - def reparse_existing_svx(svxs): - """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 - """ - svx = svxs[0] # first and only member of QuerySet - blocks = SurvexBlock.objects.filter(survexfile=svx) - - if len(blocks) >= 1: - print(f"Blocks in '{svx}': {blocks}") - survexblockparent=blocks[0].parent # all should have same parent - # But may have been obliterated by previous error - - # Stamp all over the accumulated lengths and legs in the parent block, - # This also obliterates survey lengths from all other 'sibling' survex files - # to the one being re-parsed - if survexblockparent: - survexblockparent.legsall=0 - survexblockparent.legslength=0.0 - survexblockparent.save() - - display_contents(blocks) - print(f"ABORTING - UNSOLVED BUGS. Do a complete databaseReset") - return True - blocks.delete() # deletes all pre-existing SurvexBlocks attached to this SurvexFile - bafter = SurvexBlock.objects.filter(survexfile=svx) - display_contents(bafter) - - # all these foreign keys should be recreated properly when the file is parsed. - # so why is /expedition/1996 crashing in nasty template error? - else: - print(f"ABORTING - UNSOLVED BUGS. Do a complete databaseReset") - return True + def parse_new_svx(fpath, blockroot=None, svxfileroot=None): + if svxfileroot == None: + svxfileroot = MakeFileRoot(fpath) + svxfileroot.save() + + if blockroot == None: + newname = "adhoc_" + str(Path(str(svxfileroot)).name) survexblockparent = SurvexBlock( - name="fresh_parent", survexpath="", survexfile=svx, legsall=0, legslength=0.0 + name=newname, survexpath="", survexfile=svxfileroot, legsall=0, legslength=0.0 ) survexblockparent.save() - - print(f" - {survexblockparent=}") + blockroot = survexblockparent + svx_load.survexdict[svxfileroot.survexdirectory] = [] + svx_load.survexdict[svxfileroot.survexdirectory].append(svxfileroot) + svx_load.svxdirs[""] = svxfileroot.survexdirectory - svx_load.survexdict[svx.survexdirectory] = [] - svx_load.survexdict[svx.survexdirectory].append(svx) - svx_load.svxdirs[""] = svx.survexdirectory - # ---------------------------------------------------------------- - svx_load.LinearLoad(survexblockparent, fpath, fname) + svx_load.LinearLoad(blockroot, svxfileroot.path, fname) # ---------------------------------------------------------------- - # For some reason I have not yet worked out, I am getting the parent block - # added in as one of the child blocks of the survexfile - # so explicitly remove it. - blocks = SurvexBlock.objects.filter(survexfile=svx) - print(f"\nAfter import. {svx=}") - display_contents(blocks) - #survexblockparent.survexfile = MakeFileRoot("") - survexblockparent.delete() - blocks = SurvexBlock.objects.filter(survexfile=svx) - print(f"\nAfter import, specific removal. {svx=}") - display_contents(blocks) print(f"\n - Loading One Survex file '{fpath}'", file=sys.stderr) svx_load = LoadingSurvex() + svx_load.survexdict = {} fname = Path(settings.SURVEX_DATA, (fpath + ".svx")) # print(f" - {fname=}") @@ -2403,9 +2349,54 @@ def parse_one_file(fpath): # --------------------------------------in progress-- if len(svxs)>1: print(f" ! Mistake? More than one survex file object in database with the same file-path {svxs}") print(f" - Aborting file parsing & import into database.") - return True + return False print(f" - Pre-existing survexfile {svxs}.") - reparse_existing_svx(svxs) + # reparse_existing_svx(svxs) + existingsvx = SurvexFile.objects.get(path=fpath) + existingcave = existingsvx.cave + print(f" - survexfile is {existingsvx} id={existingsvx.id} {existingcave}") + + sbs = existingsvx.survexblock_set.all() + existingparent = None + parents =set() + if sbs: + for sb in sbs: + print(f" - cleaning survex block {sb=}") + try: + if sb.parent: + parents.add(sb.parent) + except: + print(f" ! FAILURE to access sb.parent {sb=}") + sb.delete() + if parents: + print(f" - set of parent blocks {parents}") + if len(parents) > 1: + print(f" - WARNING more than one parent survex block!") + existingparent = parents.pop() + + # print(f" - deleting survex file {existingsvx=}") + # existingsvx.delete() + print(f" - Reloading and parsing this survexfile '{fpath}' Loading...") + + parse_new_svx(fpath, blockroot=existingparent, svxfileroot=existingsvx) + + svxs = SurvexFile.objects.filter(path=fpath) + if len(svxs)>1: + print(f" ! Mistake? More than one survex file object in database with the same file-path {svxs}") + print(f" - Aborting file parsing & import into database.") + return False + replacesvx = SurvexFile.objects.get(path=fpath) + replacesvx.cave = existingcave + print(f" - new/replacement survexfile {svxs}. id={replacesvx.id}") + replacesvx.save() + + if parents: + sbs = replacesvx.survexblock_set.all() + for sb in sbs: + print(f" - re-setting survex block parent{sb=}") + sb.parent = existingparent # should be all the same + sb.save() + else: print(f" - Not seen this survexfile before '{fpath}' Loading...") parse_new_svx(fpath) @@ -2420,9 +2411,10 @@ def parse_one_file(fpath): # --------------------------------------in progress-- tf += len(svx_load.survexdict[d]) print(f" - Number of SurvexFiles: {tf:,}") print(f" - Number of Survex legs: {legsnumber:,}") - print(f" - Length of Survex legs: {svx_load.slength:.2f}") + print(f" - Length of Survex legs: {svx_load.slength:.2f} m") svx_load = None + return True def MakeSurvexFileRoot(): """Returns a file_object.path = SURVEX_TOPNAME associated with directory_object.path = SURVEX_DATA""" @@ -2445,6 +2437,7 @@ def MakeFileRoot(fn): CHANGE THIS to just use the same block root as for SURVEX_TOPNAME ? """ + print(f" - making a new root survexfile for this import: {fn}") fileroot = SurvexFile(path=fn, cave=None) fileroot.survexdirectory = SurvexDirectory.objects.get(id=1) # just re-use the first thing we made fileroot.save() diff --git a/templates/svxfile.html b/templates/svxfile.html index ae0e20d..428d143 100644 --- a/templates/svxfile.html +++ b/templates/svxfile.html @@ -81,7 +81,7 @@ LOGMESSAGES {% endif %} underground survey length: {{svxlength|floatformat:2}} metres
-parent survex file {{survexfile.cave.survex_file}} for this cave
+parent survex file {{survexfile.cave.survex_file}} for this cave {{survexfile.cave}}
{% for sb in svxblocks %} block:({{sb}}) has parent block:({{sb.parent}}) {% empty %}