diff options
-rw-r--r-- | modules/tracking.py | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/modules/tracking.py b/modules/tracking.py index 4b308b0..aaa0304 100644 --- a/modules/tracking.py +++ b/modules/tracking.py @@ -79,8 +79,13 @@ class PackageError(Exception): pass class NoPackageFound(PackageError): pass class TrackingResult: - def __init__(self, code, date, desc, delivered = False): - self.code, self.date, self.desc, self.delivered = code, date, desc, delivered + def __init__(self, code, date, desc, delivered = False, previous_code = None): + self.code = code + self.date = date + self.desc = desc + self.delivered = delivered + # Set when a package changes tracking code. + self.previous_code = previous_code def __str__(self): return '\002{code}\002 {date} - {desc}'.format(code = self.code, date = self.date, desc = self.desc) @@ -130,6 +135,10 @@ class PostenModule(TrackingModule): results = [] for package in packages: code = package.attrib['packageId'] + if 'previousPackageId' in package.attrib: + previous_code = package.attrib['previousPackageId'] + else: + previous_code = None eventset = package.find('{%s}EventSet' % ns) if not len(eventset): continue @@ -143,7 +152,7 @@ class PostenModule(TrackingModule): if city: desc = '%s (%s)' % (desc, city.encode('utf8')) date = last.find('{%s}OccuredAtDisplayDate' % ns).text + ' ' + last.find('{%s}OccuredAtDisplayTime' % ns).text - results.append(TrackingResult(code, isodate, desc, status == 'DELIVERED')) + results.append(TrackingResult(code, isodate, desc, status == 'DELIVERED', previous_code = previous_code)) return results def code_split(code): @@ -428,7 +437,12 @@ class Module: package_results = [] for data in package_results: try: - package = session.query(Package).filter(and_(Package.consignment_id == consignment.id, Package.code == data.code)).one() + package = session.query(Package).filter(Package.consignment_id == consignment.id) + if data.previous_code: + package = package.filter(Package.code.in_((data.code, data.previous_code))) + else: + package = package.filter(Package.code == data.code) + package = package.one() except NoResultFound: # don't add delivered packages if data.delivered: @@ -445,6 +459,14 @@ class Module: break package = session.query(Package).filter(and_(Package.consignment_id == consignment.id, Package.code == data.code)).one() + # This happens when the package changes code. + if package.code != data.code: + # Always announce. + msg = '%s: %s has changed code to \002%s\002' % (consignment.nick.encode('utf-8'), package, data.code) + self.irc.msg(target, msg) + package.code = data.code + session.add(package) + if package.last == None or data.date > package.last: code = data.code last = data.date |