# -*- coding: utf-8 -*- import datetime import dateutil.parser import dingguo import email import email.utils import ioex import re def parse_order_confirmation_mail(mail): assert isinstance(mail, email.message.Message) text = mail.get_payload()[0].get_payload(decode = True).decode('utf-8').replace('\r\n', '\n') assert type(text) is unicode if not 'Lieferservice.at' in text: raise Exception('no lieferservice.at confirmation') msg_text = mail.get_payload()[0].get_payload(decode = True).decode('utf-8') order_match = re.search( ur'(Your order|Ihre Bestellung) \(.+\) (at|bei) (?P.*)\s+' + ur'(Your order reference is|Ihre Bestellnummer lautet): (?P.*)\s+' + ur'[\W\w]+' + ur'(Your order|Ihre Bestellung)\s+' + ur'(?P[\W\w]+)' + ur'(Delivery costs|Lieferung):\s+(?P.*)\s+', text, re.UNICODE, ) order_match_groups = order_match.groupdict() order = dingguo.Order( u'lieferservice.at', order_match_groups['order_id'].strip(), order_date = dateutil.parser.parse(mail['Date']), ) restaurant = order_match_groups['restaurant'].strip('"') for article_match in re.finditer( ur'(?P\d+)x\s' + ur'(?P.*)\s' + ur'(?P.) (?P-?\d+,\d+)\s', order_match_groups['orders_text'], re.UNICODE, ): article_match_groups = article_match.groupdict() quantity = int(article_match_groups['quantity']) assert quantity == 1 name = re.sub(ur' +', ' ', article_match_groups['name']) price = dingguo.Sum( float(article_match_groups['price'].replace(',', '.')), article_match_groups['currency'], ) if price.value < 0: price.value *= -1 order.discounts.append(dingguo.Discount( name = name, amount = price, )) else: order.items.append(dingguo.Article( name = name, quantity = 1, price_brutto = price, reseller = restaurant, shipper = restaurant, )) delivery_costs = order_match_groups['delivery_costs'].strip() if delivery_costs in ['FREE', 'GRATIS']: order.items.append(dingguo.Item( name = u'Delivery', price_brutto = dingguo.Sum(0.0, u'EUR'), )) else: unit, value = delivery_costs.split(' ') order.items.append(dingguo.Item( name = u'Delivery', price_brutto = dingguo.Sum(float(value.replace(',', '.')), unit), )) return [order]