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

fixing new survex file editing

This commit is contained in:
Philip Sargent 2024-07-18 20:12:18 +02:00
parent ff08e05485
commit 5740a6b0d6
2 changed files with 126 additions and 40 deletions

View File

@ -139,7 +139,7 @@ def get_survexfile(filename):
print(f"Number of SurvexFile objects found: {len(refs)}") print(f"Number of SurvexFile objects found: {len(refs)}")
for s in refs: for s in refs:
print (s.path, s.primary, s.cave) print (s.path, s.primary, s.cave)
# print(type(survexfile), filename) print(type(survexfile), filename)
return survexfile return survexfile
class SvxForm(forms.Form): class SvxForm(forms.Form):
@ -165,7 +165,12 @@ class SvxForm(forms.Form):
self.survexfile = False self.survexfile = False
return survextemplatefile return survextemplatefile
if not self.survexfile: if not self.survexfile:
self.survexfile = get_survexfile(self.data["filename"]) if sf := get_survexfile(self.data["filename"]): # walrus!
self.survexfile = sf
else:
print(">>> >>> WARNING - svx file not a SurvexFile object yet", fname, flush=True)
self.survexfile = fname
try: try:
fin = open(fname, "r", encoding="utf8", newline="") fin = open(fname, "r", encoding="utf8", newline="")
svxtext = fin.read() svxtext = fin.read()
@ -284,7 +289,7 @@ def svx(request, survex_file):
""" """
warning = False warning = False
print(survex_file) print(f"svx(): {survex_file=}")
if survex_file.lower().endswith(".svx"): if survex_file.lower().endswith(".svx"):
#cope with ".svx.svx" bollox #cope with ".svx.svx" bollox
survex_file = survex_file[:-4] survex_file = survex_file[:-4]
@ -344,7 +349,8 @@ def svx(request, survex_file):
form.data["code"] = rcode form.data["code"] = rcode
# GET, also fall-through after POST-specific handling # GET, also fall-through after POST-specific handling
svxfile = get_survexfile(survex_file) if svxfile := get_survexfile(survex_file):
print(f"svx(): a real SurvexFile object {svxfile=} {svxfile.id=}")
if "code" not in form.data: if "code" not in form.data:
form.data["code"] = form.GetDiscCode() form.data["code"] = form.GetDiscCode()
@ -377,6 +383,9 @@ def svx(request, survex_file):
except AttributeError: # some survexfiles just *include files and have no blocks themselves except AttributeError: # some survexfiles just *include files and have no blocks themselves
svxblocksall = [] svxblocksall = []
else: else:
svxfile = survex_file
print(f"svx(): NOT a real SurvexFile object '{svxfile=}'")
svxblocks = [] svxblocks = []
svxblocksall = [] svxblocksall = []
svxlength = 0.0 svxlength = 0.0

View File

@ -829,7 +829,6 @@ class LoadingSurvex:
parser="survex", message=message, url=None, sb=(survexblock.survexfile.path) parser="survex", message=message, url=None, sb=(survexblock.survexfile.path)
) )
print(f" {type(survexblock)=}") # survexblock.parent fails as a SurvexFile has no .parent ...ugh. print(f" {type(survexblock)=}") # survexblock.parent fails as a SurvexFile has no .parent ...ugh.
print(f" {survexblock.survexpath=}")
print(f" {survexblock.survexfile=}") print(f" {survexblock.survexfile=}")
# Not setting 'year' crashes entire import on databaseReset. # Not setting 'year' crashes entire import on databaseReset.
year = line[:4] year = line[:4]
@ -1148,7 +1147,7 @@ class LoadingSurvex:
elif ls[0] == "normal" or ls[0] == "topofil": elif ls[0] == "normal" or ls[0] == "topofil":
if not ("from" in datastar and "to" in datastar): if not ("from" in datastar and "to" in datastar):
message = ( message = (
f" ! - Unrecognised *data normal statement '{args}' {survexblock.name}|{survexblock.survexpath}" f" ! - Unrecognised *data normal statement '{args}' {survexblock.name}"
) )
print(message) print(message)
print(message, file=sys.stderr) print(message, file=sys.stderr)
@ -1178,19 +1177,19 @@ class LoadingSurvex:
self.datastar = copy.deepcopy(datastar) self.datastar = copy.deepcopy(datastar)
return return
elif ls[0] == "passage" or ls[0] == "nosurvey" or ls[0] == "diving" or ls[0] == "cylpolar": elif ls[0] == "passage" or ls[0] == "nosurvey" or ls[0] == "diving" or ls[0] == "cylpolar":
# message = " ! - *data {} blocks ignored. {}|{}" '{}' .format(ls[0].upper(), survexblock.name, survexblock.survexpath, args) # message = " ! - *data {} blocks ignored. {}|{}" '{}' .format(ls[0].upper(), survexblock.name, args)
# print(message) # print(message)
# print(message,file=sys.stderr) # print(message,file=sys.stderr)
# stash_data_issue(parser='survex', message=message) # stash_data_issue(parser='survex', message=message)
self.datastar["type"] = ls[0] self.datastar["type"] = ls[0]
elif ls[0] == "cartesian": # We should not ignore this ?! Default for Germans ? elif ls[0] == "cartesian": # We should not ignore this ?! Default for Germans ?
# message = " ! - *data {} blocks ignored. {}|{}" '{}' .format(ls[0].upper(), survexblock.name, survexblock.survexpath, args) # message = " ! - *data {} blocks ignored. {}|{}" '{}' .format(ls[0].upper(), survexblock.name, args)
# print(message) # print(message)
# print(message,file=sys.stderr) # print(message,file=sys.stderr)
# stash_data_issue(parser='survex', message=message) # stash_data_issue(parser='survex', message=message)
self.datastar["type"] = ls[0] self.datastar["type"] = ls[0]
else: else:
message = f" ! - Unrecognised *data statement '{args}' {survexblock.name}|{survexblock.survexpath}" message = f" ! - Unrecognised *data statement '{args}' {survexblock.name}"
print(message) print(message)
print(message, file=sys.stderr) print(message, file=sys.stderr)
stash_data_issue( stash_data_issue(
@ -1258,7 +1257,7 @@ class LoadingSurvex:
kataster kataster
fixedpts/gps fixedpts/gps
and everything at top level, directly in caves-1623/ not in a subdir and everything at top level, directly in caves-1623/ not in a subdir
NOTE self.cavelist is a superset of GCaveLookup, which already contains both uppercase and lowercase aliases NOTE self.cavelist is a superset of GetCaveLookup, which already contains both uppercase and lowercase aliases
why is this called with cavepath="caves-1623/2023-kt-02" when this is a cave where the files are in "caves-1623/2023-kt-02/" why is this called with cavepath="caves-1623/2023-kt-02" when this is a cave where the files are in "caves-1623/2023-kt-02/"
cavepath = 'surface/1623' when svxis is 'surface/1623/2004-18to298.svx' cavepath = 'surface/1623' when svxis is 'surface/1623/2004-18to298.svx'
@ -1281,7 +1280,7 @@ class LoadingSurvex:
# print(message, file=sys.stderr) # print(message, file=sys.stderr)
return False return False
if cavepath.lower() in self.caveslist: # primed with GCaveLookup if cavepath.lower() in self.caveslist: # primed with GetCaveLookup
return self.caveslist[cavepath.lower()] return self.caveslist[cavepath.lower()]
rx_svxcollection = re.compile(r"(?i)caves-(\d\d\d\d)/(.*)$") rx_svxcollection = re.compile(r"(?i)caves-(\d\d\d\d)/(.*)$")
@ -1290,7 +1289,7 @@ class LoadingSurvex:
if path_match: if path_match:
area = path_match.group(1) area = path_match.group(1)
caveid = path_match.group(2) caveid = path_match.group(2)
sluggy = f"{area}-{caveid}".lower() # GCaveLookup is all UPPER() and all lower() but not mixed sluggy = f"{area}-{caveid}".lower() # GetCaveLookup is all UPPER() and all lower() but not mixed
# if this comes from editing a survex file, we may already have loaded 3-digit aliases for 1623- from old wallets, # if this comes from editing a survex file, we may already have loaded 3-digit aliases for 1623- from old wallets,
# so be careful here.. # so be careful here..
seek = {sluggy, sluggy.replace("1623-","")} # {} is a set seek = {sluggy, sluggy.replace("1623-","")} # {} is a set
@ -1761,7 +1760,6 @@ class LoadingSurvex:
newsurvexblock = SurvexBlock( newsurvexblock = SurvexBlock(
name=blkid, name=blkid,
parent=survexblock, parent=survexblock,
# survexpath=pathlist, # use the debug file, not this, for debugging
survexfile=self.currentsurvexfile, survexfile=self.currentsurvexfile,
legsall=0, legsall=0,
legslength=0.0, legslength=0.0,
@ -2468,7 +2466,97 @@ def parse_one_file(fpath): # --------------------------------------in progress--
In the initial file parsing in databaseReset, the *include expansion is done In the initial file parsing in databaseReset, the *include expansion is done
in an earlier stange than LinearLoad(). By the time LinearLoad() is called, in an earlier stange than LinearLoad(). By the time LinearLoad() is called,
all the *include expansion has happened. all the *include expansion has happened.
There are two cases:
1. the path is for an existing cave 1626-359:
svxpath = 'caves-1626/359/new_passage'
or
svxpath = 'caves-1623/161/triassic/new_passage'
or possibly
svxpath = 'caves-1623/161/new_series/new_passage'
2. the path is for an entirely new cave which does not exist '2030-BL-99'
svxpath = 'caves-1626/2030-BL-99/first_explore'
This creates its own LoadingSurvex() class instance called svx_load
""" """
def find_cave_from_path(svxpath):
""" Seems simple enough.. but needs refactoring with Class method IdentifyCave()
This will normally be called from MakeRoot only when creating a new survex file
from inside the survexfile editor page by overwriting the URL in the
browser bar.
"""
cavelist = GetCaveLookup()
rx_cavepath = re.compile(r"(?i)caves-(\d\d\d\d)/([-\d\w]+|\d\d\d\d-?\w+-\d+)/?.*")
print(f"find_cave_from_path({svxpath})")
path_match = rx_cavepath.search(svxpath)
if path_match:
area = path_match.group(1)
caveid = path_match.group(2)
caveslug = f"{area}-{caveid}".lower() # GetCaveLookup is all UPPER() and all lower() but not mixed
print(f"find_cave_from_path({svxpath}): {caveslug=}")
if caveslug.lower() in cavelist:
print(f"find_cave_from_path({svxpath}): {caveslug=} YES {cavelist[caveslug.lower()]=}")
return cavelist[caveslug.lower()]
else:
print(f"find_cave_from_path({svxpath}) FAIL with correct format, trying with short-form...")
rx_alias = re.compile(r"(?i)([-\d\w]+|\d\d\d\d-?\w+-\d+)/?.*")
print(f"find_cave_from_path({svxpath}) attempting short form alias")
path_match = rx_alias.search(svxpath)
if path_match:
caveid = path_match.group(1)
print(f"find_cave_from_path({svxpath}): {caveid=}")
if caveid.lower() in cavelist:
print(f"find_cave_from_path({svxpath}): {caveid=} YES {cavelist[caveid.lower()]=}")
return cavelist[caveid.lower()]
def make_fileroot(svxpath):
"""Returns a SurvexFile, not a file_object.path
Used by the online survex file editor when re-parsing
or tries to find the primary survex file for this cave
"""
cave = find_cave_from_path(svxpath)
if cave:
cave_svxpath = cave.survex_file[:-4] # remove .svx
fileroot = SurvexFile.objects.get(path=cave_svxpath)
print(f" - Setting the root survexfile for this import: {svxpath} to be that for cave {cave}")
return fileroot
# make a dummy SurvexFile object, which will be removed later
dummyroot = SurvexFile(path=svxpath)
dummyroot.save()
print(f" - Making/finding a new dummy root survexfile for this import: {svxpath}")
print(f" - new fileroot {type(dummyroot)} for {svxpath} with cave {cave}\n - {dummyroot.primary=} {dummyroot.path=} {dummyroot.cave=} ")
return dummyroot
""" for f in IGNOREFILES:
if svxid.lower().startswith(f):
return False
for i in IGNOREPREFIX:
if cavepath.lower().startswith(i) or cavepath[11:].lower().startswith(i):
# message = (f" - {cavepath} is an <IGNOREPREFIX> (while looking at '{svxid}.svx' )")
# print(message, file=sys.stderr)
return False
cave = create_new_cave(cavepath, svxid, f"Cave mentioned only in a survex file {svxid=}") # uses the pending code
self.caveslist[cavepath.lower()] = cave
return cave
else:
path_match = rx_svxcollection.search(svxid)
if path_match:
# message = f" ! Recognised survex file in area {path_match.group(1)} which is not a cave at {svxid=}"
# stash_data_issue(parser="survex", message=message, url=None, sb=(svxid))
# print(message, file=sys.stderr)
return False
else: # probably a top level file immediately in the loser directory. No worries.
message = f" ! Warning: no cave identifiable for '{svxid}.svx' {cavepath=} "
print("\n" + message)
stash_data_issue(parser="survex", message=message, url="{svxid}.svx", sb=(svxid))
return False
"""
def parse_new_svx(fpath, svx_load, svxfileroot=None): def parse_new_svx(fpath, svx_load, svxfileroot=None):
"""We need a dummy survex block which has the survexfile being parsed """We need a dummy survex block which has the survexfile being parsed
as its .survexfile field. But it is used in two ways, it is also as its .survexfile field. But it is used in two ways, it is also
@ -2478,21 +2566,27 @@ def parse_one_file(fpath): # --------------------------------------in progress--
We also need to re-plumb the fileroot after importing, so that We also need to re-plumb the fileroot after importing, so that
the new survexfile appears in the survexdirectory lists? the new survexfile appears in the survexdirectory lists?
Rather than just arbitrarily creating something,
we should see if this is a known cave first. If it isn't dont' bother
as it might be a fixedpts survex file not a cave survex file
""" """
if svxfileroot == None: if svxfileroot == None:
svxfileroot = MakeFileRoot(fpath) # Not seen this survexfile before, so it does not exist
svxfileroot.save() # but we don't create it yet..
svxfileroot = make_fileroot(fpath)
print(f"## parse_new_svx(): {svxfileroot=} from {fpath}")
# It is vital that the block has attached the survexfile object which is being parsed. # It is vital that the block has attached the survexfile object which is being parsed.
block_dummy = SurvexBlock( block_dummy = SurvexBlock( name="",
name="dummy", survexfile=svxfileroot, legsall=0, legslength=0.0 survexfile=svxfileroot, legsall=0, legslength=0.0
) )
svxfileroot.save()
block_dummy.name=f"#{block_dummy.id}_{str(Path(str(svxfileroot)))}",
#svxfileroot.save()
block_dummy.save() block_dummy.save()
newname = f"#{block_dummy.id}_" + str(Path(str(svxfileroot)).name) print(f" - block_dummy now '{block_dummy}' {type(block_dummy)} id={block_dummy.id} f:{block_dummy.survexfile}\n -- {block_dummy.name=}")
block_dummy.name = newname
block_dummy.save()
print(f" - block_dummy now '{block_dummy}' {type(block_dummy)} id={block_dummy.id} f:{block_dummy.survexfile}")
# ---------------------------------------------------------------- # ----------------------------------------------------------------
svx_load.LinearLoad(block_dummy, svxfileroot.path, fname) svx_load.LinearLoad(block_dummy, svxfileroot.path, fname)
@ -2573,24 +2667,7 @@ def parse_one_file(fpath): # --------------------------------------in progress--
svx_load = None svx_load = None
return True return True
def MakeFileRoot(svxpath):
"""Returns a file_object.path
Used by the online survex file editor when re-parsing
or tries to find the primary survex file for this cave
Looks horrible, rewrite all this..
"""
cave = IdentifyCave(svxpath)
if not cave:
if svxpath != UNSEENS:
cave = create_new_cave(svxpath, "", "Make dummy Cave for MakeFileRoot {svxpath}")
# is this really necessary ?!
fileroot = SurvexFile(path=svxpath, cave=cave)
fileroot.save()
print(f" - Making/finding a new dummy root survexfile for this import: {svxpath} with cave {cave}")
print(f" - new fileroot {type(fileroot)} for {svxpath} with cave {cave}\n - {fileroot.primary} {fileroot.path} {fileroot.cave} ")
return fileroot
def set_survexblocks(): def set_survexblocks():
"""Need to find the optimal Django way of doing this query. """Need to find the optimal Django way of doing this query.