diff --git a/core/views/wallets_edit.py b/core/views/wallets_edit.py index c5468a4..fad7f11 100644 --- a/core/views/wallets_edit.py +++ b/core/views/wallets_edit.py @@ -315,7 +315,7 @@ def walletedit(request, path=None): wallet = f"{year}:{wnumber:02d}" return (None, wallet) - def identify_most_recent_wallet(wallet, y): + def identify_most_recent_wallet(wallet, currentyear): """ Need to find the last wallet of the previous year Has to cope with years when there are no wallets Has to cope with weirdly named imported wallets from 1999 & earlier @@ -328,47 +328,47 @@ def walletedit(request, path=None): try: allwallets = Wallet.objects.all().order_by('walletname') - previous_wallet = allwallets.first() + recent_wallet = allwallets.first() for w in allwallets: if len(w.walletname) < 5: continue if w.walletname[4] != "#": - continue + continue if w.walletname == current_name: break - if int(w.walletyear.year) >= int(y): + if int(w.walletyear.year) >= int(currentyear): break - previous_wallet = w - name = previous_wallet.walletname - - y = name[:4] - prevy = f"{int(y)-1}" - n = name[5:] - prev = f"{int(n):02d}" - + recent_wallet = w + recent_name = recent_wallet.walletname except: raise - prev = f"{int(n):02d}" + + recent_year = recent_name[:4] + recent_number = recent_name[5:] - print(prev, prevy, y) - return prev, prevy, y + print(f"---identify_most_recent_wallet: {recent_year=} {recent_number=}") + return recent_year, recent_number def create_nav_links(wallet): """Find the previous wallet and next wallet and create navigation shortcuts""" y = wallet[:4] n = wallet[5:] - nexty = f"{int(y)+1}" - prevy = f"{int(y)-1}" - next = f"{int(n)+1:02d}" - prev = f"{int(n)-1:02d}" if int(n) == 0: - prev, prevy, y = identify_most_recent_wallet(wallet, y) - - return next, nexty, prev, prevy, y + recent_year, recent_number = identify_most_recent_wallet(wallet, y) + prevy = recent_year # same as most recent wallet + recent_number = f"{int(recent_number):02d}" + else: + prevy = f"{int(y)-1}" # the previous year + recent_year = y # current year + recent_number = f"{int(n)-1:02d}" # previous number + + nexty = f"{int(y)+1}" + next = f"{int(n)+1:02d}" + return prevy, recent_year, recent_number, y, next, nexty - def read_json(): + def read_json(contents_path): """Read JSON from the wallet metadata file in the repo or fills with blank data if that files can't be read @@ -476,7 +476,112 @@ def walletedit(request, path=None): def get_logbook_trips(): return None + + def no_people(team): + return (team == ["Unknown"] + or team == [""] + or team == "") + + 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 + culling manually and only those relevant put in the JSON file""" + wallet_refs = [] + dates = [] + blocknames = [] + team = [] + try: + blocks = SurvexBlock.objects.filter(survexfile=svxfile) + for b in blocks: + print(f" - - {b=} {b.scanswallet=} {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) + except: + message = " - No associated survex blocks found for this wallet" + print(message) + return wallet_refs, dates, blocknames, team + + def scan_survexfiles(survex_paths): + """Read data from the list of survex file names attached to the wallet JSON file + + NEED TO ALSO CHECK survex files which have a *ref to this wallet ! + """ + cave_refs = [] + wallet_refs = [] + caves = [] + dates = [] + names = [] + team = [] + + if not type(survex_paths) == list: # a string also is a sequence type, so do it this way + survex_paths = [survex_paths] + + for svxf in survex_paths: + if not svxf: # not a blank string + continue + + print(f" - - {svxf=} ") + svx = Path(svxf) + if svx.suffix.lower() != ".svx": + svx = svx.with_suffix(".svx") + f = Path(settings.SURVEX_DATA) / svx + if not f.is_file(): + continue + + fpath = svx.parent / svx.stem + # print(f' - {fpath=}') + try: + svxfile = SurvexFile.objects.get(path=fpath) + + print(f" - {svxfile=}") + if svxfile.cave: + caves.append(svxfile.cave) + cave_refs.append(svxfile.cave.reference()) + + wallet_refs, dates, names, team = scan_survexblocks(svxfile) + 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] + + elif len(cave_refs) > 1: + print( + f" - More than one Cave {caves} in this wallet {wallet}. Not managed in this troggle release." + ) + + if len(names) == 1: + names = names[0] + elif len(names) > 1: + names = f"several, please edit: {names}" + print( + f" - More than one block name is relevant {names} in this wallet {wallet}. Not managed in this troggle release." + ) + + cave_refs = list(set(cave_refs)) + caves = list(set(caves)) + firstdate = None + if dates: + firstdate = min(dates).isoformat() + return firstdate, list(set(team)), caves, cave_refs, wallet_refs, names + checkboxes = [ "description written", "survex not required", @@ -493,7 +598,7 @@ def walletedit(request, path=None): redirect, wallet = preprocess_path(path) if redirect: return redirect - next, nexty, prev, prevy, year = create_nav_links(wallet) + prevy, recent_year, recent_number, year, next, nexty = create_nav_links(wallet) wurl = f"/walletedit/{wallet}".replace("#", ":") wallet = wallet.replace(":", "#") @@ -572,7 +677,7 @@ def walletedit(request, path=None): multiple = request.FILES.getlist("uploadfiles") fs = FileSystemStorage(os.path.join(dirpath)) # creates wallet folder if necessary - waldata = read_json() + waldata = read_json(contents_path) actual_saved = [] if multiple: for f in multiple: @@ -623,7 +728,7 @@ def walletedit(request, path=None): if dirs: dirs = sorted(dirs) try: - waldata = read_json() + waldata = read_json(contents_path) except: message = f"Nasty failure in parsing wallets metadata in {contents_path}. Probably backslash not forward slash in filename path" return render(request, "errors/generic.html", {"message": message}) @@ -646,251 +751,151 @@ def walletedit(request, path=None): trips = [] checked = {} context = {} - if waldata: # should always be true as populated by blank data if json file doesn't exist - if 'notes not required' not in waldata: - waldata['notes not required'] = False + if not waldata: # should always be true as populated by blank data if json file doesn't exist + message = f" !! No Wallet data initialised or read ! Should not happen." + print(message) + return render(request, "errors/generic.html", {"message": message}) - if ( - not waldata["date"] - or not waldata["people"] - or waldata["people"] == ["Unknown"] - or waldata["people"] == [""] - or waldata["cave"] == "" - ): # json file does not exist, blank data, or people not typed into JSON file - # refactor into separate functions for no date set or no people set or no cave set - # print(f'No date set') - print(f"\n - Incomplete, empty or default wallet data {wallet} {waldata=}") - refs = [] - dates = [] - team = [] - caverefs = [] - caves = [] - names = [] - svxf = "" - if waldata["survex file"]: - if not type(waldata["survex file"]) == list: # a string also is a sequence type, so do it this way - waldata["survex file"] = [waldata["survex file"]] - for svxf in waldata["survex file"]: - if svxf: - svx = Path(svxf) - if svx.suffix.lower() != ".svx": - svx = svx.with_suffix(".svx") - f = Path(settings.SURVEX_DATA) / svx - if f.is_file(): - fpath = svx.parent / svx.stem - # print(f' - {fpath=}') - try: - svxfile = SurvexFile.objects.get(path=fpath) + 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 - print(f" - {svxfile=}") - if svxfile.cave: - caves.append(svxfile.cave) - caverefs.append(svxfile.cave.reference()) - blocks = SurvexBlock.objects.filter(survexfile=svxfile) - for b in blocks: - print(f" - - {b=} {b.scanswallet=} {b.date=}") - if b.scanswallet: - refs.append(b.scanswallet) - if b.scanswallet.walletname == wallet: - if b.date: - dates.append(b.date) - if b.name != b.title: - names.append(str(b.name) + "|" + str(b.title)) - else: - names.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) - # else: - # print(f' - Wallet not matching *ref {b.scanswallet=} {wallet}') - except: - message = "Specified survex file not found - database may be empty, or this survex file is not *included anywhere." - # return render(request, 'errors/generic.html', {'message': message}) - pass + if "people" in waldata: + people = waldata["people"] # text string + else: + people = team + waldata["people"] = team - if dates: - waldata["date"] = min(dates).isoformat() - print(f" - - {team=} ") - team = list(set(team)) - waldata["people"] = team + if "cave" in waldata: + cave = waldata["cave"] # text string + else: + cave = caves + waldata["cave"] = caves + + if waldata["name"]: + psg = waldata["name"] + else: + psg = names + waldata["name"] = names + + if "free text" in waldata: + freetext = waldata["free text"] + + if 'notes not required' not in waldata: # cope with schema change + waldata['notes not required'] = False - caverefs = list(set(caverefs)) - caves = list(set(caves)) - - if len(caverefs) == 1: - waldata["cave"] = caverefs[0] - print(f" - Setting wallet cave to {caverefs[0]}") - # waldata["description url"] = caves[0] - elif len(caverefs) == 0: - waldata["cave"] = "" - # waldata["description url"] = "" - print(f" - No caves in this wallet {wallet}. ") - else: - waldata["cave"] = "several caves" - # waldata["description url"] = "several.." - print( - f" - More than one Cave {caves} in this wallet {wallet}. Not managed in this troggle release." - ) - if len(names) == 1: - if waldata["name"] == "": - waldata["name"] = names[0] - print(f" - Setting wallet name to {names[0]}") - elif len(names) == 0: - waldata["name"] = "" - print(" - Setting wallet name blank") - else: - waldata["name"] = f"several, please edit: {names}" - print( - f" - More than one block name is relevant {names} in this wallet {wallet}. Not managed in this troggle release." - ) - - if "cave" in waldata: - cave = waldata["cave"] # text string - else: - cave = "" - if waldata["name"]: - psg = waldata["name"] - if "free text" in waldata: - freetext = waldata["free text"] - - # find trips and survex files of the same date - if waldata["date"]: - datestr = waldata["date"].replace(".", "-") + # 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 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=} ") + except: try: - samedate = datetime.date.fromisoformat(datestr) + samedate = datetime.date.fromisoformat(datestr[:10]) except: - try: - samedate = datetime.date.fromisoformat(datestr[:10]) - except: - samedate = None - walletobject = make_wallet(wallet) - walletobject.walletdate = samedate - walletobject.save() - - try: - thisexpo = Expedition.objects.get(year=int(year)) - except: # creating a wallet for an expo that does not exist perhaps - message = f"Trying to access an Expo for '{year}' which does not exist (yet)." - message += " See /handbook/computing/newyear.html" - print(message) - return render(request, "errors/generic.html", {"message": message}) - if samedate: - svxothers = SurvexBlock.objects.filter(date=samedate) - trips = LogbookEntry.objects.filter(date=samedate) - else: - svxothers = None - trips = None + samedate = None + walletobject = make_wallet(wallet) + walletobject.walletdate = samedate + walletobject.save() + try: + thisexpo = Expedition.objects.get(year=int(year)) + except: # creating a wallet for an expo that does not exist perhaps + message = f"Trying to access an Expo for '{year}' which does not exist (yet)." + message += " See /handbook/computing/newyear.html" + print(message) + return render(request, "errors/generic.html", {"message": message}) + if samedate: + svxothers = SurvexBlock.objects.filter(date=samedate) + trips = LogbookEntry.objects.filter(date=samedate) else: svxothers = None trips = None - # Survex and survex complaints, comes from json file on disc, not as pre-populated as above - complaints, caveobject = get_complaints([], waldata, svxfiles, files, wallet, wurl) - # print(f' - {caveobject=}') + else: + svxothers = None + trips = None - for f in checkboxes: - if waldata[f]: - checked[f] = "checked" + # Survex and survex complaints, comes from json file on disc, not as pre-populated as above + complaints, caveobject = get_complaints([], waldata, svxfiles, files, wallet, wurl) + # print(f' - {caveobject=}') - survexsize = str(min(len(str(waldata["survex file"])), 46)) + for f in checkboxes: + if waldata[f]: + checked[f] = "checked" - try: - thiswallet = Wallet.objects.get(walletname=wallet) - caveifywallet(thiswallet) - thiswallet.ticks = thiswallet.get_ticks() # the complaints in colour form - # fixsurvextick(thiswallet, thiswallet.ticks) - # print(f"--- {wallet} {thiswallet} walletdate={thiswallet.walletdate} immediately before form render") - except: - thiswallet = None - context = { - "year": year, - "prev": prev, - "next": next, - "prevy": prevy, - "nexty": nexty, - "files": files, - "dirs": dirs, - "waldata": waldata, - "svxfiles": svxfiles, - "checked": checked, - "trips": trips, - "manywallets": [thiswallet], - "svxothers": svxothers, - "create": create, - "metadataurl": metadataurl, - "metadata": metadata, - "complaints": complaints, - "caveobject": caveobject, - "people": waldata["people"], - "peoplesize": str(len(str(waldata["people"]))), - "filesaved": filesaved, - "actual_saved": actual_saved, - } + survexsize = str(min(len(str(waldata["survex file"])), 46)) - return render( - request, - "walletform.html", - { - "form": form, - "wallet": wallet, - **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, - "psgsize": str(max(12, len(str(psg)))), - "freetextsize": str(max(60, len(str(freetext)))), - }, - ) - else: # no wallet data: should never happen as there should be default data in all cases - print(f"! - Should never get here ! Problem in wallet editing...") - context = { - "year": year, - "prev": prev, - "next": next, - "prevy": prevy, - "nexty": nexty, - "files": files, - "dirs": dirs, - "waldata": waldata, - "svxfiles": svxfiles, - "checked": checked, - "create": create, - "people": "", - "peoplesize": 12, - "filesaved": filesaved, - "actual_saved": actual_saved, - } + try: + thiswallet = Wallet.objects.get(walletname=wallet) + caveifywallet(thiswallet) + thiswallet.ticks = thiswallet.get_ticks() # the complaints in colour form + # fixsurvextick(thiswallet, thiswallet.ticks) + # print(f"--- {wallet} {thiswallet} walletdate={thiswallet.walletdate} immediately before form render") + except: + thiswallet = None + context = { + "year": year, + "recent_year": recent_year, + "recent_number": recent_number, + "next": next, + "prevy": prevy, + "nexty": nexty, + "files": files, + "dirs": dirs, + "waldata": waldata, + "svxfiles": svxfiles, + "checked": checked, + "trips": trips, + "manywallets": [thiswallet], + "svxothers": svxothers, + "create": create, + "metadataurl": metadataurl, + "metadata": metadata, + "complaints": complaints, + "caveobject": caveobject, + "people": people, + "peoplesize": str(len(str(people))), + "filesaved": filesaved, + "actual_saved": actual_saved, + } + + return render( + request, + "walletform.html", + { + "form": form, + "wallet": wallet, + **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, + "psgsize": str(max(12, len(str(psg)))), + "freetextsize": str(max(60, len(str(freetext)))), + }, + ) - return render( - request, - "walletform.html", - { - "form": form, - "wallet": wallet, - **context, - "date": "", - #'url': "", 'urlsize': 12, - "survex": "", - "survexsize": 46, - "cave": cave, - "psg": psg, - "freetext": freetext, - "psgsize": 12, - "freetextsize": 20, - }, - ) diff --git a/templates/walletform.html b/templates/walletform.html index 6ac419a..75f3d5f 100644 --- a/templates/walletform.html +++ b/templates/walletform.html @@ -31,7 +31,7 @@

{{prevy}}  ...  -{{year}}:{{prev}} +{{recent_year}}:{{recent_number}} ← {{wallet}} → {{year}}:{{next}}  ...  @@ -254,7 +254,7 @@ No other survex files found for this date.
{% endif %} - {% if metadataurl %}

+ {% if metadataurl %}
JSON
{{metadataurl}}