1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import datetime
- 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<restaurant>.*)\s+'
- + ur'(Your order reference is|Ihre Bestellnummer lautet): (?P<order_id>.*)\s+'
- + ur'[\W\w]+'
- + ur'(Your order|Ihre Bestellung)\s+'
- + ur'(?P<orders_text>[\W\w]+)'
- + ur'(Delivery costs|Lieferung):\s+(?P<delivery_costs>.*)\s+',
- text,
- re.UNICODE,
- )
- order_match_groups = order_match.groupdict()
- import time
- order_date = datetime.datetime.fromtimestamp(
- time.mktime(email.utils.parsedate(mail['Date']))
- )
- order = dingguo.Order(
- u'lieferservice.at',
- order_match_groups['order_id'].strip(),
- order_date
- )
- restaurant = order_match_groups['restaurant'].strip('"')
- for article_match in re.finditer(
- ur'(?P<quantity>\d+)x\s'
- + ur'(?P<name>.*)\s'
- + ur'(?P<currency>.) (?P<price>-?\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]
|