2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2025-12-17 12:47:35 +00:00

refactoring warnings

This commit is contained in:
2025-12-15 22:50:08 +00:00
parent e23cab50ed
commit 39be4a2886
2 changed files with 30 additions and 44 deletions

View File

@@ -98,16 +98,6 @@ class DrawingsPathlibTests(TestCase):
self.assertIn(w, df.dwgwallets.all())
self.assertIn(ss, df.scans.all())
def test_findwalletimage_logs_missing_scan(self):
# Wallet exists but no scan inside. Should create a DataIssue
w = Wallet.objects.create(fpath='x', walletname='2026#01')
df = DrawingFile.objects.create(dwgpath='tst2.th2', dwgname='tst2')
drawings.findwalletimage(df, '2026#01/missing.jpg')
di = DataIssue.objects.filter(parser='Therion', message__contains='not actually found')
self.assertTrue(di.exists())
def test_drawing_reference_multiple_creates_dataissue(self):
df1 = DrawingFile.objects.create(dwgpath='ref1', dwgname='shared')
df2 = DrawingFile.objects.create(dwgpath='ref2', dwgname='shared')

View File

@@ -80,8 +80,7 @@ def fetch_drawingfiles_by_paths(paths, chunk_size: int = 500):
return mapping
rx_wallet = re.compile(r"""
# r"(\d\d\d\d#X?\d+\w?|1995-96kh|92-94Surveybookkh|1991surveybook|smkhs)/(.*?(?:png|jpg|pdf|jpeg|gif|txt))$", path
# This regex is designed to extract a specific directory prefix and a filename
# This regex is designed to extract a specific directory prefix (walletname) and a filename
# from the end of a path string.
# --- Group 1: Directory or Survey Prefix ---
@@ -111,7 +110,7 @@ rx_wallet = re.compile(r"""
| # OR
1991surveybook # Matches the literal string "1991surveybook"
| # OR
smkhs # Matches the literal string "smkhs"
smkhs # This is now expofiles/surveys/smkhs/ not in surveyscans/ at all.
) # End of Capture Group 1
/ # A literal forward slash separating the parts
@@ -137,7 +136,7 @@ def _set_filesize_and_check(fullpath, model_obj, parser_label, url_prefix="/dwgd
except Exception as e:
message = f"! Unable to stat file {fullpath}: {e}"
print(message)
DataIssue.objects.create(parser=parser_label, message=message, url=f"{url_prefix}/{getattr(model_obj, 'dwgpath', '')}")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"{url_prefix}/{getattr(model_obj, 'dwgpath', '')}")
return False
model_obj.filesize = size
@@ -145,7 +144,7 @@ def _set_filesize_and_check(fullpath, model_obj, parser_label, url_prefix="/dwgd
if size <= 0:
message = f"! Zero length {parser_label.lower()} file {fullpath}"
print(message)
DataIssue.objects.create(parser=parser_label, message=message, url=f"{url_prefix}/{getattr(model_obj, 'dwgpath', '')}")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"{url_prefix}/{getattr(model_obj, 'dwgpath', '')}")
return False
return True
@@ -181,6 +180,11 @@ def parse_tnl_file(dwgfile, path):
# Delegate to the unified reference processor for consistent behaviour
_process_reference(dwgfile, path, parser_label="Tunnel")
def _handle_obsolete_wallets(old_wallet, dwgfile, path, parser_label):
message = f"- Warning {old_wallet} not a currently valid wallet name. In {path}"
print(message)
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{path}")
def _process_reference(dwgfile, path, parser_label="Tunnel"):
"""Unified processor to link drawing files to wallets/scans or referenced drawings.
@@ -195,34 +199,42 @@ def _process_reference(dwgfile, path, parser_label="Tunnel"):
return None, None
if mscansdir := rx_wallet.search(path):
scanswalletl = Wallet.objects.filter(walletname=mscansdir.group(1))
scanswalletl = Wallet.objects.filter(walletname=mscansdir.group(1)) # 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}"
print(message)
DataIssue.objects.create(parser=parser_label, message=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
_handle_obsolete_wallets(mscansdir.group(1),dwgfile, path, parser_label)
if wallet:
scansfilel = wallet.singlescan_set.filter(name=mscansdir.group(2))
scansfilel = wallet.singlescan_set.filter(name=mscansdir.group(2)) # 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}"
print(message)
DataIssue.objects.create(parser=parser_label, message=message)
DataIssue.objects.update_or_create(parser=parser_label, message=message)
scansfile = scansfilel[0]
if wallet:
dwgfile.dwgwallets.add(wallet)
if scansfile:
dwgfile.scans.add(scansfile)
# If a wallet was found but no scan was associated from the wallet, record a DataIssue. There are a lot of these..
if wallet and not scansfile:
scanfilename = Path(path).name
message = f"! In '{wallet.walletname}' scanned file is not actually found '{scanfilename}' in '{path}'"
wurl = f"/survey_scans/{wallet.walletname}/".replace("#", ":")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=wurl)
return wallet, scansfile
# Not a wallet reference; check image extension and possibly drawing-to-drawing reference
suffix = Path(path).suffix.lower()
if _is_image_suffix(suffix):
# It's an image/scanned file type; we don't treat it as a referenced drawing
# It's an image/scanned file type; we don't treat it as a referenced drawing, though in future we should note the link
return None, None
# Not an image file: perhaps a reference to another drawing (no ext or other ext)
@@ -233,28 +245,13 @@ def _process_reference(dwgfile, path, parser_label="Tunnel"):
plist = [df.dwgpath for df in rdwgfilel]
message = f"- Warning {len(rdwgfilel)} files named '{name}' {plist}"
print(message)
DataIssue.objects.create(parser=parser_label, message=message, url=f"/dwgdataraw/{path}")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{path}")
rdwgfile = rdwgfilel[0]
if hasattr(dwgfile, 'dwgcontains'): # implement model change in models/survex.py to use this
dwgfile.dwgcontains.add(rdwgfile)
return None, None
def findwalletimage(therionfile, foundpath):
"""Tries to link the drawing file (Therion format) to the referenced image (scan) file"""
# Delegate to the unified reference processor for consistent behaviour
foundpath = foundpath.strip("{}")
wallet, scansfile = _process_reference(therionfile, foundpath, parser_label="Therion")
# If a wallet was found but no scan was associated from the wallet, record a DataIssue
if wallet and not scansfile:
scanfilename = Path(foundpath).name
message = f'! In {wallet.walletname} scanned file is not actually found {scanfilename} mentioned in "{therionfile.dwgpath}"'
wurl = f"/survey_scans/{wallet.walletname}/".replace("#", ":")
DataIssue.objects.create(parser="Therion", message=message, url=wurl)
def findimportinsert(therionfile, imp):
"""Tries to link the scrap (Therion format) to the referenced therion scrap"""
pass
@@ -290,12 +287,12 @@ def _assign_wallets_for_model(model_obj, wallet_names, parser_label="Tunnel"):
# Nothing found: record a DataIssue
message = f" ! wallet(s) '{names}' not found from {getattr(model_obj, 'dwgpath', model_obj)}"
print(message)
DataIssue.objects.create(parser=parser_label, message=message, url=f"/dwgdataraw/{getattr(model_obj, 'dwgpath', '')}")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{getattr(model_obj, 'dwgpath', '')}")
return []
except Exception as e:
message = f" ! Exception while looking up wallet(s) '{names}' from {getattr(model_obj, 'dwgpath', model_obj)} -- ({e})"
print(message)
DataIssue.objects.create(parser=parser_label, message=message, url=f"/dwgdataraw/{getattr(model_obj, 'dwgpath', '')}")
DataIssue.objects.update_or_create(parser=parser_label, message=message, url=f"/dwgdataraw/{getattr(model_obj, 'dwgpath', '')}")
return []
@@ -334,22 +331,21 @@ def settherionfileinfo(filetuple):
# Surely not needed for .th files ?? only .th2 ?
message = f"! Un-parsed image filename: {therionfile.dwgname} : {xth_me.split()[-3]} - {therionfile.dwgpath}"
# print(message)
# DataIssue.objects.create(parser='xTherion', message=message, url=f'/dwgdataraw/{therionfile.dwgpath}')
# DataIssue.objects.update_or_create(parser='xTherion', message=message, url=f'/dwgdataraw/{therionfile.dwgpath}')
# ! Un-parsed image filename: 107coldest : ../../../expofiles/surveyscans/2015/2015#20/notes.jpg - therion/plan/107coldest.th2
with open("therionrefs.log", "a") as lg:
lg.write(message + "\n")
findwalletimage(therionfile, xth_me.split()[-3])
# print(f"{therionfile.dwgname} :{xth_me.split()[-3]}")
# therionfile.save()
foundpath = xth_me.split()[-3].strip("{}")
_process_reference(therionfile, foundpath, parser_label="Therion")
for inp in rx_input.findall(ttext):
# if this 'input' is a .th2 file we have already seen, then we can assign this as a sub-file
# but we would need to disentangle to get the current path properly
message = f"! Un-set (?) Therion .th2 input: - {therionfile.dwgname} : {inp} - {therionfile.dwgpath}"
# print(message)
DataIssue.objects.create(parser="xTherion", message=message, url=f"/dwgdataraw/{therionfile.dwgpath}")
DataIssue.objects.update_or_create(parser="xTherion", message=message, url=f"/dwgdataraw/{therionfile.dwgpath}")
findimportinsert(therionfile, inp)
# Defer saving scalar fields; caller will perform bulk_update.