# -*- coding: utf-8 -*- import BeautifulSoup import datetime import dateutil.parser import dingguo import email import ioex import re def parse_order_confirmation_mail(mail): assert isinstance(mail, email.message.Message) text = mail.get_payload()[0].get_payload()[0].get_payload(decode = True).decode('utf-8') if not u'Vielen Dank für deine Bestellung bei yipbee' in text: raise Exception('no yipbee confirmation') order_match_groups = re.search( ur'[\W\w]+' + ur'BESTELLUNG: (?P\w+) vom (?P\d\d.\d\d.\d{4} \d\d:\d\d:\d\d)' + ur'[\W\w]+' + ur'GESAMTPREIS\s+' + ur'(?P[\W\w]+)' + ur'(?PARTIKEL [\W\w]+)', text, re.UNICODE ).groupdict() order = dingguo.Order( u'yipbee', order_match_groups['order_id'], datetime.datetime.strptime(order_match_groups['order_time'], '%d.%m.%Y %H:%M:%S') .replace(tzinfo = dateutil.parser.parse(mail['Date']).tzinfo), ) for article_match in re.finditer( ur'(?P[\w\-\.\:,%\(\) ]+ (Klasse \d|[\w\-\. ]+[^\d ]))' + ur'(?P\d+,\d\d) €(?P\d)(?P\d+,\d\d) €', order_match_groups['articles_and_discount_text'].replace('\n', ' '), re.UNICODE, ): article_match_groups = article_match.groupdict() total_price = float(article_match_groups['total_price'].replace(',', '.')) total_price_2 = float(article_match_groups['total_price_2'].replace(',', '.')) assert abs(total_price - total_price_2) < 0.01, 'expected %f, received %f' % (total_price, total_price_2) quantity = int(article_match_groups['quantity']) order.items.append(dingguo.Article( name = article_match_groups['name'], price_brutto = dingguo.Sum(round(total_price / quantity, 2), u'EUR'), quantity = quantity, reseller = u'yipbee', shipper = u'yipbee', )) articles_price = float(text.split('RABATTE')[0].split('ARTIKEL')[-1].strip().split(' ')[0].replace(',', '.')) assert abs(articles_price - sum([a.price_brutto.value * a.quantity for a in order.items])) < 0.01 discount_tag = BeautifulSoup.BeautifulSoup( order_match_groups['articles_and_discount_text'], convertEntities = BeautifulSoup.BeautifulSoup.HTML_ENTITIES, ).find('tr') if discount_tag: name_tag, value_tag = discount_tag.findAll('td', recursive = False) value, currency = value_tag.text.split(' ') order.discounts.append(dingguo.Discount( name = name_tag.text, amount = dingguo.Sum(float(value.replace(',', '.')) * -1, currency), )) delivery_price = order_match_groups['summary_text'].split('VERSAND')[1].split('STEUERN')[0].strip() delivery_price_value, delivery_price_currency = delivery_price.split(' ') order.items.append(dingguo.Item( name = u'Delivery', price_brutto = dingguo.Sum(float(delivery_price_value.replace(',', '.')), delivery_price_currency), )) return [order]