diff --git a/parsers/caves.py b/parsers/caves.py
index ce2eaa7..3a58748 100644
--- a/parsers/caves.py
+++ b/parsers/caves.py
@@ -23,6 +23,52 @@ entrances_xslug = {}
caves_xslug = {}
areas_xslug = {}
+def dummy_entrance(k, slug, msg="DUMMY"):
+ '''Returns an empty entrance object for either a PENDING cave or a DUMMY entrance if
+ user forgot to provide one when creating the cave
+ '''
+ ent = Entrance(
+ name = k,
+ entrance_description = "Dummy entrance: auto-created when registering a new cave " +
+ "and you forgot to create an entrance for it. Click on 'Edit' to enter the correct data, then 'Submit'.",
+ marking = '?')
+ if ent:
+ ent.save() # must save to have id before foreign keys work.
+ try: # Now create a entrance slug ID
+ es = EntranceSlug.objects.update_or_create(entrance = ent,
+ slug = slug, primary = False)
+ except:
+ message = f" ! {k:11s} {msg} entrance create failure"
+ DataIssue.objects.create(parser='caves', message=message, url=f'/cave/{slug}')
+ print(message)
+
+ ent.cached_primary_slug = slug
+ ent.filename = slug + ".html"
+ ent.save()
+ return ent
+ else:
+ message = f" ! {k:11s} {msg} cave SLUG '{slug}' create failure"
+ DataIssue.objects.create(parser='caves', message=message, url=f'/cave/{slug}')
+ print(message)
+ raise
+
+def set_dummy_entrance(id, slug, cave, msg="DUMMY"):
+ '''Entrance field either missing or holds a null string instead of a filename in a cave_data file.
+ '''
+ global entrances_xslug
+ try:
+ entrance = dummy_entrance(id, slug, msg="DUMMY")
+ letter = ""
+ entrances_xslug[slug] = entrance
+ ce = CaveAndEntrance.objects.update_or_create(cave = cave, entrance_letter = "", entrance = entrance)
+ message = f' ! Entrance Dummy setting WORKED, slug:"{slug}" cave id:"{id}" '
+ DataIssue.objects.create(parser='caves', message=message, url=f'/cave/{slug}')
+ print(message)
+ except:
+ message = f' ! Entrance Dummy setting failure, slug:"{slug}" cave id :"{id}" '
+ DataIssue.objects.create(parser='caves', message=message, url=f'/cave/{slug}')
+ print(message)
+
def do_pending_cave(k, url, area_1623):
'''
default for a PENDING cave, should be overwritten in the db later if a real cave of the same name exists
@@ -30,12 +76,14 @@ def do_pending_cave(k, url, area_1623):
'''
default_note = f"_Survex file found in loser repo but no description in expoweb
\n"
default_note += f"INSTRUCTIONS: First open 'This survex file' (link above the CaveView panel) to find the date and info. Then "
- default_note += f"
\n - search in the Expo for that year e.g. {k[0:4]} to find a "
+ default_note += f"
\n\n - (1) search in the survex file for the *ref to find a "
+ default_note += f"relevant wallet, e.g.2009#11 and read the notes image files
\n - "
+ default_note += f"
\n\n - (2) search in the Expo for that year e.g. {k[0:4]} to find a "
default_note += f"relevant logbook entry, then
\n - "
default_note += f"click on 'Edit this cave' and copy the information you find in the survex file and the logbook"
- default_note += f"
\n - "
+ default_note += f"
\n\n - "
default_note += f"When you Submit it will create a file file in expoweb/cave_data/ "
- default_note += f"
\n - Now you can edit the entrance info: click on Edit below for the dummy entrance. "
+ default_note += f"
\n\n - Now you can edit the entrance info: click on Edit below for the dummy entrance. "
default_note += f"and then Submit to save it. NB your entrance info will not be visible after a reboot of the server until a programmer has edited parser/caves.py (python code) to remove the cave form the [pending] list. But it won't be lost."
slug = "1623-" + k
@@ -65,41 +113,9 @@ def do_pending_cave(k, url, area_1623):
message = f' ! {k:11s} PENDING cave create failure'
DataIssue.objects.create(parser='caves', message=message)
print(message)
-
- ent = Entrance(
- name = k,
- entrance_description = "Dummy entrance: auto-created when registering a new cave." +
- "This file WILL NOT BE LOADED while the cave is in the pending[] list in parsers/caves.py",
- marking = '?')
- if ent:
- ent.save() # must save to have id before foreign keys work.
- try: # Now create a entrance slug ID
- es = EntranceSlug.objects.update_or_create(entrance = ent,
- slug = slug, primary = False)
- except:
- message = f" ! {k:11s} PENDING entrance create failure"
- DataIssue.objects.create(parser='caves', message=message)
- print(message)
-
- # Now we will actually write this default entrance slugfile. Yes it's naughty, but an extra
- # entrance file is less hassle than a missing one! And people always forget to save the entrance file
- # when they are saving the edited cave file.
-
- #This WILL then casue an error when the parser then tries to import this file and we get an import failure because
- # the entrance exists in the db.
- ent.cached_primary_slug = slug
- ent.filename = slug + ".html"
- ent.save()
- if not ent.get_file_path().is_file():
- # don't overwrite if by some chnace it exists
- # but the pre-existing file won't be parsed later until the cave is removed from the pending list
- ent.writeDataFile()
- else:
- message = f" ! {k:11s} PENDING cave SLUG '{slug}' create failure"
- DataIssue.objects.create(parser='caves', message=message)
- print(message)
try:
+ ent = dummy_entrance(k, slug, msg="PENDING")
ceinsts = CaveAndEntrance.objects.update_or_create(cave = cave, entrance_letter = "", entrance = ent)
for ceinst in ceinsts:
if str(ceinst) == str(cave): # magic runes... why is the next value a Bool?
@@ -116,10 +132,8 @@ def readcaves():
'''Reads the xml-format HTML files in the EXPOWEB repo, not from the loser repo.
'''
# For those caves which do not have cave_data/1623-xxx.html XML files even though they exist and have surveys
- pending = ["2007-06", "2009-02",
- "2010-06", "2010-07", "2012-ns-01", "2012-ns-02", "2010-04", "2012-ns-05", "2012-ns-06",
- "2012-ns-07", "2012-ns-08", "2012-ns-12", "2012-ns-14", "2012-ns-15", "2014-bl888",
- "2018-pf-01", "2018-pf-02"]
+ # should put this in a simple list which can be edited using 'Edit this file'
+ pending = settings.PENDING
with transaction.atomic():
print(" - Deleting Caves and Entrances")
@@ -153,11 +167,12 @@ def readcaves():
print(" - settings.CAVEDESCRIPTIONS: ", settings.CAVEDESCRIPTIONS)
print(" - Reading Entrances from entrance descriptions xml files")
for filename in next(os.walk(settings.ENTRANCEDESCRIPTIONS))[2]: #Should be a better way of getting a list of files
- if filename.endswith('.html'):
- if Path(filename).stem[5:] in pending:
- print(f'Skipping pending entrance dummy file <{filename}>')
- else:
- readentrance(filename)
+ # if filename.endswith('.html'):
+ # if Path(filename).stem[5:] in pending:
+ # print(f'Skipping pending entrance dummy file <{filename}>')
+ # else:
+ # readentrance(filename)
+ readentrance(filename)
print(" - Reading Caves from cave descriptions xml files")
for filename in next(os.walk(settings.CAVEDESCRIPTIONS))[2]: #Should be a better way of getting a list of files
@@ -298,8 +313,8 @@ def readcave(filename):
description_file = getXML(cavecontents, "description_file", maxItems = 1, context = context)
url = getXML(cavecontents, "url", maxItems = 1, context = context)
entrances = getXML(cavecontents, "entrance", context = context)
-
- if len(non_public) == 1 and len(slugs) >= 1 and len(official_name) == 1 and len(areas) >= 1 and len(kataster_code) == 1 and len(kataster_number) == 1 and len(unofficial_number) == 1 and len(explorers) == 1 and len(underground_description) == 1 and len(equipment) == 1 and len(references) == 1 and len(survey) == 1 and len(kataster_status) == 1 and len(underground_centre_line) == 1 and len(notes) == 1 and len(length) == 1 and len(depth) == 1 and len(extent) == 1 and len(survex_file) == 1 and len(description_file ) == 1 and len(url) == 1 and len(entrances) >= 1:
+
+ if len(non_public) == 1 and len(slugs) >= 1 and len(official_name) == 1 and len(areas) >= 1 and len(kataster_code) == 1 and len(kataster_number) == 1 and len(unofficial_number) == 1 and len(explorers) == 1 and len(underground_description) == 1 and len(equipment) == 1 and len(references) == 1 and len(survey) == 1 and len(kataster_status) == 1 and len(underground_centre_line) == 1 and len(notes) == 1 and len(length) == 1 and len(depth) == 1 and len(extent) == 1 and len(survex_file) == 1 and len(description_file ) == 1 and len(url) == 1:
try:
c, state = Cave.objects.update_or_create(non_public = {"True": True, "False": False, "true": True, "false": False,}[non_public[0]],
official_name = official_name[0],
@@ -363,21 +378,28 @@ def readcave(filename):
primary = False
- for entrance in entrances:
- eslug = getXML(entrance, "entranceslug", maxItems = 1, context = context)[0]
- letter = getXML(entrance, "letter", maxItems = 1, context = context)[0]
- try:
- if eslug in entrances_xslug:
- entrance = entrances_xslug[eslug]
+ if not entrances or len(entrances) < 1:
+ # missing entrance link in cave_data/1623-* .html file
+ set_dummy_entrance(slug[5:], slug, c, msg="DUMMY")
+ else:
+ for entrance in entrances:
+ eslug = getXML(entrance, "entranceslug", maxItems = 1, context = context)[0]
+ letter = getXML(entrance, "letter", maxItems = 1, context = context)[0]
+ if len(entrances) == 1 and not eslug: # may be empty:
+ set_dummy_entrance(slug[5:], slug, c, msg="DUMMY")
else:
- entrance = Entrance.objects.get(entranceslug__slug = eslug)
- entrances_xslug[eslug] = entrance
- ce = CaveAndEntrance.objects.update_or_create(cave = c, entrance_letter = letter, entrance = entrance)
- except:
- message = f' ! Entrance setting failure, slug:"{slug}" letter:"{letter}" cave:"{c}" filename:"{filename}"'
- DataIssue.objects.create(parser='caves', message=message)
- print(message)
-
+ try:
+ if eslug in entrances_xslug:
+ entrance = entrances_xslug[eslug]
+ else:
+ entrance = Entrance.objects.get(entranceslug__slug = eslug)
+ entrances_xslug[eslug] = entrance
+ ce = CaveAndEntrance.objects.update_or_create(cave = c, entrance_letter = letter, entrance = entrance)
+ except:
+ message = f' ! Entrance setting failure, slug:"{slug}" #entrances:{len(entrances)} {entrance} letter:"{letter}" cave:"{c}" filename:"cave_data/{filename}"'
+ DataIssue.objects.create(parser='caves', message=message)
+ print(message)
+
if survex_file[0]:
if not (Path(SURVEX_DATA) / survex_file[0]).is_file():
message = f' ! {slug:12} survex filename does not exist :LOSER:"{survex_file[0]}" in "{filename}"'
diff --git a/settings.py b/settings.py
index 8d34a9c..3420b60 100644
--- a/settings.py
+++ b/settings.py
@@ -105,6 +105,12 @@ LOGBOOK_PARSER_SETTINGS = {
"1982": ("1982/log.htm", "Parseloghtml01"),
}
+# Caves for which survex files exist, but are not otherwise registered
+PENDING = ["2007-06", "2009-02",
+ "2010-06", "2010-07", "2012-ns-01", "2012-ns-02", "2010-04", "2012-ns-05", "2012-ns-06",
+ "2012-ns-07", "2012-ns-08", "2012-ns-12", "2012-ns-14", "2012-ns-15", "2014-bl888",
+ "2018-pf-01", "2018-pf-02"]
+
APPEND_SLASH = False # never relevant because we have urls that match unknown files and produce an 'edit this page' response
SMART_APPEND_SLASH = True