2023-05-31 22:09:09 +01:00
|
|
|
import yaml, hashlib
|
|
|
|
import logger as log
|
|
|
|
import mongo
|
2023-05-08 19:55:09 +01:00
|
|
|
|
2023-05-31 22:59:38 +01:00
|
|
|
REBUILD :bool = False # Set to True to force rebuild
|
|
|
|
|
2023-05-31 22:09:09 +01:00
|
|
|
print("pis.py: PIS Module Loaded", "DBUG")
|
2023-05-31 22:59:38 +01:00
|
|
|
#file_location :str = "/app/data/pis/gwr.yaml" # Production & Testing
|
|
|
|
file_location :str = "/home/fred.boniface/git/owlboard/db-manager/data/pis/gwr.yaml" # Local Development
|
2023-05-31 22:09:09 +01:00
|
|
|
|
|
|
|
def runUpdate():
|
|
|
|
if (not requiresUpdate()):
|
|
|
|
log.out('pis.runUpdate: PIS Codes do not need updating', 'INFO')
|
|
|
|
return
|
|
|
|
log.out(f"pis.runUpdate: Update required", "INFO")
|
|
|
|
pis_data = load()
|
|
|
|
pis_parsed = parse(pis_data)
|
|
|
|
mongo.dropCollection("pis")
|
|
|
|
mongo.putMany("pis", pis_parsed)
|
2023-05-31 22:59:38 +01:00
|
|
|
mongo.createSingleIndex("pis", "stops")
|
|
|
|
mongo.createSingleIndex("pis", "tiplocs")
|
2023-05-31 22:09:09 +01:00
|
|
|
|
|
|
|
def requiresUpdate():
|
2023-05-31 22:59:38 +01:00
|
|
|
if REBUILD:
|
|
|
|
return True
|
2023-05-31 22:09:09 +01:00
|
|
|
currentHash = mongo.getMetaHash("pis")
|
|
|
|
with open(file_location, "r") as f:
|
|
|
|
text = f.read()
|
|
|
|
newHash = hashlib.md5(text.encode()).hexdigest()
|
|
|
|
if currentHash is None or newHash != currentHash:
|
|
|
|
log.out(f"pis.requiresUpdate: currentHash: {currentHash}, newHash: {newHash}", "INFO")
|
|
|
|
mongo.putMetaHash("pis", newHash)
|
|
|
|
return True
|
|
|
|
mongo.putMetaHash("pis", newHash)
|
|
|
|
return False
|
2023-05-08 19:55:09 +01:00
|
|
|
|
|
|
|
def load(): # Programatically add a `toc` field to each entry.
|
2023-05-31 22:09:09 +01:00
|
|
|
with open(file_location, "r") as data:
|
2023-05-08 19:55:09 +01:00
|
|
|
try:
|
|
|
|
pis = yaml.safe_load(data)
|
|
|
|
print(pis)
|
|
|
|
return pis["pis"]
|
|
|
|
except yaml.YAMLError as exc:
|
|
|
|
print(exc)
|
|
|
|
return exc
|
|
|
|
|
|
|
|
def parse(codeList):
|
|
|
|
StartLen = len(codeList)
|
2023-05-31 22:59:38 +01:00
|
|
|
log.out(f"pis.parse: codeList starting length: {StartLen}", "DBUG")
|
|
|
|
log.out(f"pis.parse: Removing duplicate codes & adding TIPLOCs")
|
2023-05-08 19:55:09 +01:00
|
|
|
for i in codeList:
|
|
|
|
stops = i['stops']
|
2023-05-31 22:59:38 +01:00
|
|
|
print(stops)
|
2023-05-08 19:55:09 +01:00
|
|
|
code = i['code']
|
|
|
|
for ii in codeList:
|
|
|
|
if stops == ii['stops'] and code != ii['code']:
|
|
|
|
print(f"Identical stopping pattern found: {ii['code']}")
|
|
|
|
codeList.remove(ii)
|
2023-05-31 22:59:38 +01:00
|
|
|
tiplocs = []
|
|
|
|
for iii in stops:
|
|
|
|
print(iii)
|
|
|
|
tiplocs.append(getTiploc(iii))
|
|
|
|
i['tiplocs'] = tiplocs
|
2023-05-08 19:55:09 +01:00
|
|
|
print(f"pis.parse: Removed {StartLen - len(codeList)} duplicates")
|
2023-05-31 22:59:38 +01:00
|
|
|
return codeList
|
|
|
|
|
|
|
|
def getTiploc(crs :str):
|
|
|
|
CRS = crs.upper()
|
|
|
|
#log.out(f"pis.getTiploc: Finding TIPLOC for {CRS}")
|
|
|
|
query = {
|
|
|
|
'3ALPHA': CRS
|
|
|
|
}
|
|
|
|
res = mongo.query("stations", query)
|
|
|
|
print(res)
|
|
|
|
if 'TIPLOC' in res:
|
|
|
|
return res['TIPLOC']
|
|
|
|
return "UNKNOWN"
|