diff --git a/parsers/drawings.py b/parsers/drawings.py index 2a7108b..2c1bfc9 100644 --- a/parsers/drawings.py +++ b/parsers/drawings.py @@ -190,7 +190,7 @@ def parse_tnl_file(dwgfile, path): # Delegate to the unified reference processor for consistent behaviour _process_reference(dwgfile, path, parser_label="Tunnel") -def _find_renamed_x_wallet(old_wallet, scanfilename): +def _find_renamed_x_wallet(old_wallet, scanfilename, parser_label): """In past years we had a different naming convention for wallets containing electronic files but now these have been renamed simply as 20nn#nn without the X. """ @@ -210,28 +210,68 @@ def _find_renamed_x_wallet(old_wallet, scanfilename): valid_wallet = ss.wallet return valid_wallet +def _find_renamed_kh_wallet(old_wallet, scanfilename, parser_label): + """In past years we had a different naming convention for wallets + for Kaninchehohle (KH) and for non-KH caves. + """ + valid_wallet = False + if old_wallet == "smkhs": + # there is no valid wallet, but we could give a link to old_wallets["smkhs"] + message = f" ! Non-wallet {old_wallet}=>{old_wallets["smkhs"][0]}/{scanfilename}" + # print(message) + DataIssue.objects.update_or_create(parser=parser_label, message=message, url="") + return False + + for walletname in old_wallets[old_wallet]: + try: + wallet = Wallet.objects.get(walletname=walletname) + scans = SingleScan.objects.filter(wallet=wallet).order_by('-wallet__walletname') + for ss in scans: + if ss.name == scanfilename: + # print(f"FOUND {old_wallet}=>{ss.wallet.walletname}:{scanfilename}") + if valid_wallet: + message = f" - AMBIGUOUS scan filename {old_wallet}=>{ss.wallet.walletname}:{scanfilename}" + print(message) + DataIssue.objects.update_or_create(parser=parser_label, message=message, url="") + return False + else: + valid_wallet = ss.wallet + except Exception as e: + message = f" ! EXCEPTION scan filename {old_wallet}=>{walletname}:{scanfilename} {e}" + print(message) + DataIssue.objects.update_or_create(parser=parser_label, message=message, url="") + return False + return valid_wallet + def _handle_obsolete_wallets(old_wallet, dwgfile, scanfilename, parser_label): """Wallets, which are folders on the filesystem, have been renamed over the years but the filepaths emnbedded in drawing files are what they were when the drawing file was created. So we have to match up these old wallet names with what they are now. """ + message = "" if x := rx_x_wallet.search(old_wallet): # only doing 2016#X04 etc. as yet - if w_renamed := _find_renamed_x_wallet(old_wallet, scanfilename): + if w_renamed := _find_renamed_x_wallet(old_wallet, scanfilename, parser_label): return w_renamed - message = f"- Warning {parser_label} XFILES {old_wallet} {(old_wallet==x.group(1))} in {path}" + message = f" - Warning {parser_label} XFILES {old_wallet} {(old_wallet==x.group(1))} in {path}" print(message) DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{path}") return False - if old_wallet not in old_wallets: - message = f"- Warning {old_wallet} not a currently valid wallet name. In {path}" + if old_wallet in old_wallets: + if w_renamed := _find_renamed_kh_wallet(old_wallet, scanfilename, parser_label): + return w_renamed + if old_wallet != "smkhs": + message = f" ! FAILURE {old_wallet} was not handled properly. In {dwgfile.dwgpath}" + else: + message = f" ! ERROR {old_wallet} is an unrecognised invalid wallet name. In {dwgfile.dwgpath}" + if message: print(message) - DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{path}") - return False - + DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{dwgfile}") + return False + def _process_reference(dwgfile, path, parser_label="Tunnel"): """Unified processor to link drawing files to wallets/scans or referenced drawings. @@ -248,22 +288,23 @@ def _process_reference(dwgfile, path, parser_label="Tunnel"): if mscansdir := rx_wallet.search(path): walletname = mscansdir.group(1) scanfilename = mscansdir.group(2) - scanswalletl = Wallet.objects.filter(walletname=walletname) # wallet name - if len(scanswalletl): - wallet = scanswalletl[0] - if len(scanswalletl) > 1: - message = f"! More than one scan FOLDER matches filter query. [{scanswalletl[0]}]: {mscansdir.group(1)} {mscansdir.group(2)} {dwgfile.dwgpath} {path}" + n = Wallet.objects.filter(walletname=walletname).count() # wallet name + if n >= 1: + wallets = Wallet.objects.filter(walletname=walletname) # wallet name + wallet = wallets[0] + if n > 1: + message = f"! More than one scan FOLDER matches filter query. [{wallet}]: {walletname} {scanfilename} {dwgfile.dwgpath} {path}" print(message) DataIssue.objects.update_or_create(parser=parser_label, message=message) else: # found a wallet name, but it is not one we recognise as having been imported - wallet = _handle_obsolete_wallets(mscansdir.group(1),dwgfile, scanfilename, parser_label) + wallet = _handle_obsolete_wallets(walletname,dwgfile, scanfilename, parser_label) if wallet: scansfilel = wallet.singlescan_set.filter(name=scanfilename) # file name if len(scansfilel): if len(scansfilel) > 1: plist = [sf.ffile for sf in scansfilel] - message = f"! More than one image FILENAME matches filter query. [{scansfilel[0]}]: {mscansdir.group(1)} {mscansdir.group(2)} {dwgfile.dwgpath} {path} {plist}" + message = f"! More than one image FILENAME matches filter query. [{scansfilel[0]}]: {walletname} {scanfilename} {dwgfile.dwgpath} {path} {plist}" print(message) DataIssue.objects.update_or_create(parser=parser_label, message=message) scansfile = scansfilel[0] @@ -335,7 +376,7 @@ def _assign_wallets_for_model(model_obj, wallet_names, parser_label="Tunnel"): return wallets # Nothing found: record a DataIssue message = f" ! wallet(s) '{names}' not found from {getattr(model_obj, 'dwgpath', model_obj)}" - print(message) + # print(message) DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{getattr(model_obj, 'dwgpath', '')}") return [] except Exception as e: