diff --git a/parsers/survex.py b/parsers/survex.py index 959bd26..fdc48f8 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -63,10 +63,22 @@ class LoadSurvex(): survexlegsnumber = 0 insp = "" callcount = 0 + stardata ={} def __init__(self): pass + def LoadSurvexDate(self, survexblock, line): + # we should make this a date range for everything + if len(line) == 10: + survexblock.date = make_aware(datetime.strptime(re.sub(r"\.", "-", line), '%Y-%m-%d'), get_current_timezone()) + expeditions = models.Expedition.objects.filter(year=line[:4]) + if expeditions: + assert len(expeditions) == 1 + survexblock.expedition = expeditions[0] + survexblock.expeditionday = survexblock.expedition.get_expedition_day(survexblock.date) + survexblock.save() + def LoadSurvexLineLeg(self, survexblock, stardata, sline, comment): """This reads compass, clino and tape data but only keeps the tape lengths, the rest is discarded after error-checking. @@ -147,7 +159,7 @@ class LoadSurvex(): # do not import this: *data passage.. data which is LRUD not tape/compass/clino pass - def LoadSurvexRef(self, insp, survexblock, mstar): + def LoadSurvexRef(self, survexblock, mstar): # *REF but also ; Ref yr,letterx,wallet = mstar.groups() if not letterx: @@ -165,15 +177,15 @@ class LoadSurvex(): survexblock.save() if len(manyscansfolders) > 1: message = ' ! Wallet *REF {} - multiple scan folders found {}'.format(refscan, survexblock.survexfile.path) - print((insp+message)) + print((self.insp+message)) models.DataIssue.objects.create(parser='survex', message=message) else: message = ' ! Wallet *REF {} - NOT found in manyscansfolders {}'.format(refscan, survexblock.survexfile.path) - print((insp+message)) + print((self.insp+message)) models.DataIssue.objects.create(parser='survex', message=message) - def LoadSurvexQM(self, insp, qmline): + def LoadSurvexQM(self, insp, survexblock, qmline): qm_no = qmline.group(1) qm_grade = qmline.group(2) qm_from_section = qmline.group(3) @@ -210,11 +222,13 @@ class LoadSurvex(): grade=qm_grade.upper(), location_description=qm_notes) else: - message = ' ! QM in svx file NOT resolved and NOT found {}'.format(qm_notes) + message = ' ! QM {} in {} NOT resolved and NOT found'.format(qm_no, survexblock.survexfile.path) print(insp+message) models.DataIssue.objects.create(parser='survex', message=message) else: - print(insp+' - QM found but resolved {}'.format(qm_notes)) + message = ' ! QM {} in {} found and resolved as {}'.format(qm_no, survexblock.survexfile.path,qm_resolve_section) + print(insp+message) + models.DataIssue.objects.create(parser='survex', message=message) pass @@ -222,7 +236,7 @@ class LoadSurvex(): """Follows the *include links in all the survex files from the root file 1623.svx and reads in the survex blocks, other data and the wallet references (scansfolder) as it goes. This part of the data import process is where the maximum memory is used and where it - crashes on memory-constrained machines. + crashes on memory-constrained machines. Begin-end blocks may also be nested. """ iblankbegins = 0 text = [ ] @@ -256,14 +270,13 @@ class LoadSurvex(): lineno += 1 # break the line at the comment sline, comment = self.rx_comment.match(svxline.strip()).groups() - # detect ref line pointing to the scans directory mref = comment and self.rx_ref.match(comment) if mref: - self.LoadSurvexRef(insp, survexblock, mref) + self.LoadSurvexRef(survexblock, mref) qmline = comment and self.rx_qm.match(comment) if qmline: - self.LoadSurvexQM(insp, qmline) + self.LoadSurvexQM(insp, survexblock, qmline) if not sline: continue @@ -271,7 +284,7 @@ class LoadSurvex(): # detect the star ref command mstar = self.rx_starref.match(sline) if mstar: - self.LoadSurvexRef(insp, survexblock, mstar) + self.LoadSurvexRef(survexblock, mstar) # detect the star command mstar = self.rx_star.match(sline) @@ -368,19 +381,10 @@ class LoadSurvex(): print(insp+" - LEGS: {} (previous: {}, now:{})".format(legsinblock,previousnlegs,self.survexlegsnumber)) survexblock.legsall = legsinblock survexblock.save() - endstamp = datetime.now() - timetaken = endstamp - stamp return elif re.match("date$(?i)", cmd): - if len(line) == 10: - survexblock.date = make_aware(datetime.strptime(re.sub(r"\.", "-", line), '%Y-%m-%d'), get_current_timezone()) - expeditions = models.Expedition.objects.filter(year=line[:4]) - if expeditions: - assert len(expeditions) == 1 - survexblock.expedition = expeditions[0] - survexblock.expeditionday = survexblock.expedition.get_expedition_day(survexblock.date) - survexblock.save() + self.LoadSurvexDate(survexblock, line) elif re.match("team$(?i)", cmd): pass @@ -411,6 +415,7 @@ class LoadSurvex(): stardata = { "type":ls[0] } for i in range(0, len(ls)): stardata[self.stardataparamconvert.get(ls[i], ls[i])] = i - 1 + self.stardata = stardata if ls[0] in ["normal", "cartesian", "nosurvey"]: assert (("from" in stardata and "to" in stardata) or "station" in stardata), line elif ls[0] == "default":