lieferservice.py 2.9 KB

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