Many many bugs fixed for >1 svx file on a wallet

This commit is contained in:
2023-02-03 22:19:51 +00:00
parent c1231ff451
commit 175e71facf
4 changed files with 100 additions and 82 deletions

View File

@@ -347,7 +347,7 @@ def walletedit(request, path=None):
recent_year = recent_name[:4]
recent_number = recent_name[5:]
print(f"---identify_most_recent_wallet: {recent_year=} {recent_number=}")
# print(f"---identify_most_recent_wallet: {recent_year=} {recent_number=}")
return recent_year, recent_number
def create_nav_links(wallet):
@@ -481,7 +481,34 @@ def walletedit(request, path=None):
return (team == ["Unknown"]
or team == [""]
or team == "")
def empty_string(thing):
return (thing == [""]
or thing == []
or thing == ""
or thing == "[]"
or thing is None)
def make_valid_date(date):
datestr = date.replace(".", "-")
try:
samedate = datetime.date.fromisoformat(datestr)
except ValueError:
# probably a single digit day number. HACKUS MAXIMUS.
# clearly we need to fix this when we first import date strings..
datestr = datestr[:-1] + "0" + datestr[-1]
# datestr = f"{datestr:02d}"
print(f"! - ValueError, trying.. {datestr=} ")
try:
samedate = datetime.date.fromisoformat(datestr)
except:
try:
samedate = datetime.date.fromisoformat(datestr[:10])
except:
print(f"! - ValueError, FAILED {datestr=} ")
samedate = None
return samedate
def scan_survexblocks(svxfile):
"""Scans for *team people attached to all the survex blocks in this svxfile
This could be rather a lot for some compedious survex files! So would need
@@ -493,26 +520,25 @@ def walletedit(request, path=None):
try:
blocks = SurvexBlock.objects.filter(survexfile=svxfile)
for b in blocks:
print(f" - - {b=} {b.scanswallet=} {b.date=}")
# print(f" - - - - {b=} {b.scanswallet.walletname} {b.date=} ")
if b.scanswallet:
wallet_refs.append(b.scanswallet) # other wallets
if b.scanswallet.walletname == wallet:
if b.date:
dates.append(b.date)
if b.name != b.title:
blocknames.append(str(b.name) + "|" + str(b.title))
else:
blocknames.append(str(b.name))
# we can use the people, across all blocks that have this *ref
QSpeople = SurvexPersonRole.objects.filter(survexblock=b)
# print(f" - - {QSpeople=}")
for p in QSpeople:
print(f" - - {p.personname} ")
team.append(p.personname)
#if b.scanswallet.walletname == wallet: # only if we assume *ref all correct!
if b.date:
dates.append(b.date)
if b.name != b.title:
blocknames.append(str(b.name) + "|" + str(b.title))
else:
blocknames.append(str(b.name))
QSpeople = SurvexPersonRole.objects.filter(survexblock=b)
# print(f" - - {QSpeople=}")
for p in QSpeople:
# print(f" - - {p.personname} ")
team.append(p.personname)
except:
message = " - No associated survex blocks found for this wallet"
print(message)
# print(f" - - - ", wallet_refs, dates, blocknames, team)
return wallet_refs, dates, blocknames, team
def scan_survexfiles(survex_paths):
@@ -534,7 +560,7 @@ def walletedit(request, path=None):
if not svxf: # not a blank string
continue
print(f" - - {svxf=} ")
# print(f" - - {svxf=} ")
svx = Path(svxf)
if svx.suffix.lower() != ".svx":
svx = svx.with_suffix(".svx")
@@ -547,22 +573,26 @@ def walletedit(request, path=None):
try:
svxfile = SurvexFile.objects.get(path=fpath)
print(f" - {svxfile=}")
if svxfile.cave:
caves.append(svxfile.cave)
cave_refs.append(svxfile.cave.reference())
cave_refs.append(svxfile.cave.reference()) # this is a string?!
wallet_refs, dates, names, team = scan_survexblocks(svxfile)
w, d, n, t = scan_survexblocks(svxfile)
wallet_refs.extend(w)
dates.extend(d)
names.extend(n)
team.extend(t)
except:
message = "Specified survex file not found - database may be empty."
print(message)
# This failure will also get picked up by the "S" colour code red or orange
if len(cave_refs) == 1:
caves = cave_refs[0]
caves = list(set(caves))
if len(caves) == 1:
caves = caves[0]
elif len(cave_refs) > 1:
elif len(caves) > 1:
print(
f" - More than one Cave {caves} in this wallet {wallet}. Not managed in this troggle release."
)
@@ -576,7 +606,6 @@ def walletedit(request, path=None):
)
cave_refs = list(set(cave_refs))
caves = list(set(caves))
firstdate = None
if dates:
firstdate = min(dates).isoformat()
@@ -613,9 +642,11 @@ def walletedit(request, path=None):
# print(f'--- POST processing starts {wallet=} {path=}')
if "psg" in request.POST: # handle metadata form
formj = WalletForm(request.POST)
# Beware. All fields returned as strings. Must re-type them as lists etc. before using or re-saving
# 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
# Beware. All fields returned as strings. So must re-type them as
# lists etc. before using or re-saving
# Unset checkboxes do not return any value, checked ones return "True".
# So all need initialising to False
if formj.is_valid():
posted = request.POST.copy()
posted.pop("csrfmiddlewaretoken") # discard this
@@ -625,26 +656,35 @@ def walletedit(request, path=None):
# print(f'--- wd ${f}$ - {wd[f]}')
for f in posted:
wd[xlate[f]] = posted[f].replace("'", '"')
print(f"'{f}' -{xlate[f]}- {posted[f]}")
if posted[f] == "True":
wd[xlate[f]] = True
newdate = make_valid_date(posted["date"])
wd["people"] = wd["people"][1:-1].replace('"', "").split(",")
for i, elem in enumerate(wd["people"]):
wd["people"][i] = elem.strip()
if wd["cave"]:
if wd["cave"][0] == "[":
wd["cave"] = wd["cave"][1:-1].replace('"', "").split(",")
for i, elem in enumerate(wd["cave"]):
wd["cave"][i] = elem.strip()
# print(f'--- ${wd["survex file"]}$ - {type(wd["survex file"])}')
if wd["survex file"]: # allow for no survex file at all
if wd["survex file"][0] == "[":
wd["survex file"] = wd["survex file"][1:-1]
wd["survex file"] = wd["survex file"].replace('"', "").split(",")
for i, elem in enumerate(wd["survex file"]):
wd["survex file"][i] = elem.strip()
# print(f'--- {wd["survex file"]} - {type(wd["survex file"])}')
save_json(wd)
# will already exist as creation does not happen here anymore
# walletobject will already exist as creation does not happen here anymore
walletobject = make_wallet(wallet)
walletobject.walletdate = newdate # must be valid date
print(f"---Setting VALID new date to db {walletobject} {walletobject.walletdate}")
walletobject.save()
print(f"---Setting VALID new date to db {walletobject} {walletobject.walletdate}")
commit_json(wd)
else:
@@ -756,38 +796,31 @@ def walletedit(request, path=None):
print(message)
return render(request, "errors/generic.html", {"message": message})
if no_people(waldata["people"]):
team = []
names = []
refs = []
if "survex file" in waldata:
date, team, caves, caverefs, wallet_refs, names = scan_survexfiles(waldata["survex file"])
print(f"--- date from survexfiles scan {date}")
print(f"--- date from django object {Wallet.objects.filter(walletname=wallet)[0].walletdate}")
# Override the discovered values with those in the JSON file:
if not waldata["date"]: # either absent or empty string
waldata["date"] = date
if "people" in waldata:
people = waldata["people"] # text string
else:
if no_people(waldata["people"]):
people = team
waldata["people"] = team
else:
people = waldata["people"] # text string
if "cave" in waldata:
if empty_string(waldata["cave"]):
cave = caverefs # a list, potentially
waldata["cave"] = cave
else:
cave = waldata["cave"] # text string
else:
cave = caves
waldata["cave"] = caves
if waldata["name"]:
psg = waldata["name"]
else:
if empty_string(waldata["name"]):
psg = names
waldata["name"] = names
else:
psg = waldata["name"]
if "free text" in waldata:
freetext = waldata["free text"]
@@ -798,23 +831,9 @@ def walletedit(request, path=None):
# for a in waldata:
# print(f"'{waldata[a]}' {a}")
# find trips and survex files of the same date
if date:
datestr = date.replace(".", "-")
try:
samedate = datetime.date.fromisoformat(datestr)
except ValueError:
# probably a single digit day number. HACKUS MAXIMUS.
# clearly we need to fix this when we first import date strings..
datestr = datestr[:-1] + "0" + datestr[-1]
print(f" - {datestr=} ")
try:
samedate = datetime.date.fromisoformat(datestr)
except:
try:
samedate = datetime.date.fromisoformat(datestr[:10])
except:
samedate = None
walletobject = make_wallet(wallet)
walletobject = make_wallet(wallet)
if waldata["date"]:
samedate = make_valid_date(waldata["date"])
walletobject.walletdate = samedate
walletobject.save()
@@ -847,7 +866,7 @@ def walletedit(request, path=None):
survexsize = str(min(len(str(waldata["survex file"])), 46))
try:
thiswallet = Wallet.objects.get(walletname=wallet)
thiswallet = walletobject # Wallet.objects.get(walletname=wallet)
caveifywallet(thiswallet)
thiswallet.ticks = thiswallet.get_ticks() # the complaints in colour form
# fixsurvextick(thiswallet, thiswallet.ticks)
@@ -865,6 +884,8 @@ def walletedit(request, path=None):
"dirs": dirs,
"waldata": waldata,
"svxfiles": svxfiles,
"survex": waldata["survex file"],
"survexsize": survexsize,
"checked": checked,
"trips": trips,
"manywallets": [thiswallet],
@@ -889,8 +910,6 @@ def walletedit(request, path=None):
**context,
"date": waldata["date"],
#'url': waldata["description url"], 'urlsize': str(len(str(waldata["description url"]))),
"survex": waldata["survex file"],
"survexsize": survexsize,
"cave": cave,
"psg": psg,
"freetext": freetext,