lieferservice.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import dateutil.parser
  4. import dingguo
  5. import email
  6. import email.utils
  7. import ioex
  8. import re
  9. def parse_order_confirmation_mail(mail):
  10. assert isinstance(mail, email.message.Message)
  11. text = mail.get_payload()[0].get_payload(decode = True).decode('utf-8').replace('\r\n', '\n')
  12. assert type(text) is unicode
  13. if not 'Lieferservice.at' in text:
  14. raise Exception('no lieferservice.at confirmation')
  15. msg_text = mail.get_payload()[0].get_payload(decode = True).decode('utf-8')
  16. order_match = re.search(
  17. ur'(Your order|Ihre Bestellung) \(.+\) (at|bei) (?P<restaurant>.*)\s+'
  18. + ur'(Your order reference is|Ihre Bestellnummer lautet): (?P<order_id>.*)\s+'
  19. + ur'[\W\w]+'
  20. + ur'(Your order|Ihre Bestellung)\s+'
  21. + ur'(?P<orders_text>[\W\w]+)'
  22. + ur'(Delivery costs|Lieferung):\s+(?P<delivery_costs>.*)\s+',
  23. text,
  24. re.UNICODE,
  25. )
  26. order_match_groups = order_match.groupdict()
  27. order = dingguo.Order(
  28. u'lieferservice.at',
  29. order_match_groups['order_id'].strip(),
  30. order_date = dateutil.parser.parse(mail['Date']),
  31. )
  32. restaurant = order_match_groups['restaurant'].strip('"')
  33. for article_match in re.finditer(
  34. ur'(?P<quantity>\d+)x\s'
  35. + ur'(?P<name>.*)\s'
  36. + ur'(?P<currency>.) (?P<price>-?\d+,\d+)\s',
  37. order_match_groups['orders_text'],
  38. re.UNICODE,
  39. ):
  40. article_match_groups = article_match.groupdict()
  41. quantity = int(article_match_groups['quantity'])
  42. assert quantity == 1
  43. name = re.sub(ur' +', ' ', article_match_groups['name'])
  44. price = dingguo.Sum(
  45. float(article_match_groups['price'].replace(',', '.')),
  46. article_match_groups['currency'],
  47. )
  48. if price.value < 0:
  49. price.value *= -1
  50. order.discounts.append(dingguo.Discount(
  51. name = name,
  52. amount = price,
  53. ))
  54. else:
  55. order.items.append(dingguo.Article(
  56. name = name,
  57. quantity = 1,
  58. price_brutto = price,
  59. reseller = restaurant,
  60. shipper = restaurant,
  61. ))
  62. delivery_costs = order_match_groups['delivery_costs'].strip()
  63. if delivery_costs in ['FREE', 'GRATIS']:
  64. order.items.append(dingguo.Item(
  65. name = u'Delivery',
  66. price_brutto = dingguo.Sum(0.0, u'EUR'),
  67. ))
  68. else:
  69. unit, value = delivery_costs.split(' ')
  70. order.items.append(dingguo.Item(
  71. name = u'Delivery',
  72. price_brutto = dingguo.Sum(float(value.replace(',', '.')), unit),
  73. ))
  74. return [order]