diff options
author | Philip Sargent <philip.sargent@gmail.com> | 2023-10-25 01:56:30 +0300 |
---|---|---|
committer | Philip Sargent <philip.sargent@gmail.com> | 2023-10-25 01:56:30 +0300 |
commit | 0843a279660b9dd76a68164b60140d0a0e14f39a (patch) | |
tree | 05c407abcddea37b81df9b995d313d3361ff4618 /parsers/survex.py | |
parent | 33477f2b40a5e88379d2d05cfc5356afdbb06269 (diff) | |
download | troggle-0843a279660b9dd76a68164b60140d0a0e14f39a.tar.gz troggle-0843a279660b9dd76a68164b60140d0a0e14f39a.tar.bz2 troggle-0843a279660b9dd76a68164b60140d0a0e14f39a.zip |
Revised (faster, less brain damaged) wallet pages
Diffstat (limited to 'parsers/survex.py')
-rw-r--r-- | parsers/survex.py | 110 |
1 files changed, 89 insertions, 21 deletions
diff --git a/parsers/survex.py b/parsers/survex.py index a86399f..e668853 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -138,7 +138,7 @@ def get_offending_filename(path): """ return "/survexfile/" + path + ".svx" -# THIS SHOULD NOT BE GLOBAL ! SHould be per instance of file loader.. + trip_people_cache = {} # indexed by survexblock, so never needs cleaning out def get_team_on_trip(survexblock): """Uses a cache to avoid a database query if it doesn't need to. @@ -146,7 +146,8 @@ def get_team_on_trip(survexblock): global trip_people_cache if survexblock in trip_people_cache: - return trip_people_cache[survexblock] + if len(trip_people_cache[survexblock]) > 0: + return trip_people_cache[survexblock] qpeople = SurvexPersonRole.objects.filter(survexblock=survexblock) # not very good Django style trip_people_cache[survexblock] = qpeople # this is a query list @@ -154,7 +155,8 @@ def get_team_on_trip(survexblock): def get_people_on_trip(survexblock): """Gets the displayable names of the people on a survexbock trip. - Only used for complete team.""" + Only used for complete team. + Seems to be only used for error messages.""" qpeople = get_team_on_trip(survexblock) # qpeople is a Query List people = [] @@ -699,7 +701,7 @@ class LoadingSurvex: else: message = f"! DATE Warning LONG DATE '{oline}' ({survexblock}) {survexblock.survexfile.path}" print(self.insp+message) - stash_data_issue(parser='svxdate', message=message, url=None, sb=(survexblock.survexfile.path)) + stash_data_issue(parser='xSvxDate', message=message, url=None, sb=(survexblock.survexfile.path)) if len(line) == 10: @@ -712,7 +714,7 @@ class LoadingSurvex: message = f"! DATE Warning only accurate to the month, setting to 1st '{oline}' ({survexblock}) {survexblock.survexfile.path} {perps}" print(self.insp + message) stash_data_issue( - parser="svxdate", message=message, url=None, sb=(survexblock.survexfile.path) + parser="xSvxDate", message=message, url=None, sb=(survexblock.survexfile.path) ) survexblock.date = datetime.strptime(line.replace(".", "-"), "%Y-%m") # sets to first of month elif len(line) == 4: @@ -720,7 +722,7 @@ class LoadingSurvex: message = f"! DATE WARNING only accurate to the YEAR, setting to 1st January '{oline}' ({survexblock}) {survexblock.survexfile.path} {perps}" print(self.insp + message) stash_data_issue( - parser="svxdate", message=message, url=None, sb=(survexblock.survexfile.path) + parser="xSvxDate", message=message, url=None, sb=(survexblock.survexfile.path) ) survexblock.date = datetime.strptime(line, "%Y") # sets to January 1st elif len(line) == 9 or len(line) == 8: @@ -728,7 +730,7 @@ class LoadingSurvex: message = f"! DATE format WARNING, single digit day or month number,'{oline}' [{line[-5]}][{line[-2]}] ({survexblock}) {survexblock.survexfile.path}" print(self.insp + message) stash_data_issue( - parser="svxdate", message=message, url=None, sb=(survexblock.survexfile.path) + parser="xSvxDate", message=message, url=None, sb=(survexblock.survexfile.path) ) if line[-2] == "-" or line[-2] == ".": line = line[:-1] + '0' + line[-1] @@ -745,7 +747,7 @@ class LoadingSurvex: ) print(self.insp + message) stash_data_issue( - parser="svxdate", message=message, url=None, sb=(survexblock.survexfile.path) + parser="xSvxDate", message=message, url=None, sb=(survexblock.survexfile.path) ) else: # these errors are reporting the wrong survexblock, which is actually a SurvexFile (!) @@ -985,7 +987,7 @@ class LoadingSurvex: perps = get_people_on_trip(survexblock) message = f" ! Wallet *REF bad in '{survexblock.survexfile.path}' malformed id '{args}' {perps}" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) return if not letterx: @@ -994,24 +996,24 @@ class LoadingSurvex: letterx = "X" message = f" ! Wallet *REF has LETTER in '{survexblock.survexfile.path}' malformed id '{args}' {perps}" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) if len(wallet) < 2: wallet = "0" + wallet if not (int(yr) > 1960 and int(yr) < 2050): message = " ! Wallet year out of bounds {yr} '{refscan}' {survexblock.survexfile.path}" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) refscan = f"{yr}#{letterx}{wallet}" try: if int(wallet) > 99: message = f" ! Wallet *REF {refscan} - very big (more than 99) so probably wrong in '{survexblock.survexfile.path}'" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) except: message = f" ! Wallet *REF {refscan} - not numeric in '{survexblock.survexfile.path}'" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) manywallets = Wallet.objects.filter( walletname=refscan @@ -1020,13 +1022,13 @@ class LoadingSurvex: if len(manywallets) > 1: message = f" ! Wallet *REF {refscan} - more than one found {len(manywallets)} wallets in db with same id {survexblock.survexfile.path}" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) if survexblock.scanswallet: if survexblock.scanswallet.walletname != refscan: message = f" ! Wallet *REF {refscan} in {survexblock.survexfile.path} - Already a DIFFERENT wallet is set for this block '{survexblock.scanswallet.walletname}'" print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) else: survexblock.scanswallet = manywallets[0] # this is a ForeignKey field survexblock.save() @@ -1037,7 +1039,7 @@ class LoadingSurvex: perps = get_people_on_trip(survexblock) message = f" ! Wallet *REF bad in '{survexblock.survexfile.path}' '{refscan}' NOT in database i.e. wallet does not exist {perps}." print(self.insp + message) - stash_data_issue(parser="survex", message=message, url=url) + stash_data_issue(parser="ref", message=message, url=url) def LoadSurvexDataNormal(self, survexblock, args): """Sets the order for data elements in this and following blocks, e.g. @@ -2481,17 +2483,82 @@ def MakeFileRoot(svxpath): return fileroot -def caveifywallets(): +def set_survexblocks(wallet): + if svxfiles := wallet.survexfiles(): # reads from JSON, should be cached + for svx in svxfiles: + # svx is a string, need to resolve to a survexfile object + #o = SurvexFile.objects.get(path=svx) + blocks = SurvexBlock.objects.filter(survexfile__path=svx) + for b in blocks: + if b.scanswallet == wallet: + pass + else: + b.scanswallet = wallet + b.save() + # print(f"setting {wallet} on {b.survexfile} : {b}") + +def survexifywallets(): """Gets the caves from the list of survexblocks + + We seem to hve a LOT of blocks with no atatched scnaswallet. Is this because we are + not inheriting *ref properly in the survexfile ? """ + print(f" - Update wallets with survex data") + + start = time.time() + # if there is a wallet for a block, add the people to the wallet + sprsall = SurvexPersonRole.objects.all().select_related("person").select_related("survexblock") + for spr in sprsall: + w = spr.survexblock.scanswallet + if w: + w.persons.add(spr.person) + + duration = time.time() - start + print(f" - TIME: add people to wallets {duration:7.2f} s", file=sys.stderr) + start = time.time() + wallets = Wallet.objects.all() for w in wallets: - blocks = SurvexBlock.objects.filter(scanswallet=w) + set_survexblocks(w) # reads JSON, sets survexblocks if survexfiles specified on wallet JSON + + duration = time.time() - start + print(f" - TIME: set survexblock:wallet using JSON survexfiles {duration:7.2f} s", file=sys.stderr) + start = time.time() + + for w in wallets: + blocks = SurvexBlock.objects.filter(scanswallet=w).select_related("survexfile") for b in blocks: - # NB b.cave is not populated by parser. Use b.survexfile.cave instead, or we could parse b.survexpath if b.survexfile.cave: w.caves.add(b.survexfile.cave) - + w.save() + + duration = time.time() - start + print(f" - TIME: add caves to wallets {duration:7.2f} s", file=sys.stderr) + start = time.time() + + + + cuccblocks = set() + for spr in SurvexPersonRole.objects.all(): + cuccblocks.add(spr.survexblock) + + sentinelbad = Wallet.objects.get(walletname="1983#00") + for b in cuccblocks: + if b.date > date(2001, 1, 1): # do we care about older ones? 1999 certainly has different wallet system + if not b.scanswallet: + if b.parent.scanswallet: + if b.parent.scanswallet != sentinelbad: + b.scanswallet = b.parent.scanswallet + continue + message = f" ! *REF missing {b.date} {b.survexfile}.svx : '{b}'" + # print(message, file=sys.stderr) + url = get_offending_filename(b.survexfile.path) + DataIssue.objects.update_or_create(parser="ref", message=message, url=url) + + duration = time.time() - start + print(f" - TIME: check missing *ref on survexblocks {duration:7.2f} s", file=sys.stderr) + start = time.time() + def LoadSurvexBlocks(): global dup_includes @@ -2516,10 +2583,11 @@ def LoadSurvexBlocks(): global dataissues dataissues = [] DataIssue.objects.filter(parser="survex").delete() - DataIssue.objects.filter(parser="svxdate").delete() + DataIssue.objects.filter(parser="xSvxDate").delete() DataIssue.objects.filter(parser="survexleg").delete() DataIssue.objects.filter(parser="survexunits").delete() DataIssue.objects.filter(parser="survex team").delete() + DataIssue.objects.filter(parser="ref").delete() # DataIssue.objects.filter(parser="xEntrances").delete() print(" - survex Data Issues flushed") mem1 = get_process_memory() |