ikea.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import dingguo
  4. import email
  5. import re
  6. def parse_order_confirmation_mail(mail):
  7. assert isinstance(mail, email.message.Message)
  8. mail_text = mail.get_payload()[0].get_payload(decode = True).decode('iso-8859-1')
  9. if not u'Danke für deine Bestellung bei IKEA' in mail_text:
  10. raise Exception('no ikea order confirmation')
  11. order = dingguo.Order(
  12. order_id = re.search(ur'Bestellnummer:\s+(\d+)', mail_text).group(1),
  13. order_date = datetime.datetime.strptime(
  14. re.search(ur'Bestelldatum:\s+(\d\d-\d\d-\d{4})', mail_text).group(1),
  15. '%d-%m-%Y',
  16. ).date(),
  17. platform = u'ikea',
  18. )
  19. # Menge 1
  20. # Produkt KOMPLEMENT
  21. # Bügel, ausziehbar , dunkelgrau
  22. # Tiefe: 58 cm
  23. # Max Belastung: 4 kg
  24. # Artikelnummer: 202.624.87
  25. # Einzelpreis ? 10,-
  26. # Gesamtpreis ? 10,-
  27. # Menge 1
  28. # Produkt ÄPPLARÖ
  29. # Hocker/außen , braun faltbar braun las.
  30. # Breite: 40 cm
  31. # Tiefe: 38 cm
  32. # Höhe: 42 cm
  33. # Artikelnummer: 202.049.25
  34. # Einzelpreis ? 19,99
  35. # Gesamtpreis ? 19,99
  36. for article_text in re.findall(ur'Menge[\W\w]+?Gesamtpreis', mail_text):
  37. article_attr = re.match(
  38. ur'Menge\s+(?P<quantity>\d+)\s+'
  39. + ur'Produkt\s+(?P<name>.+)\s+'
  40. + ur'(?P<label>.+)\s+'
  41. + ur'(Breite: (?P<width>\d+) (?P<width_unit>[^\s]+)\s+)?'
  42. + ur'(Tiefe: (?P<depth>\d+) (?P<depth_unit>[^\s]+)\s+)?'
  43. + ur'(Höhe: (?P<height>\d+) (?P<height_unit>[^\s]+)\s+)?'
  44. + ur'(Max Belastung: (?P<maximum_load>\d+) (?P<maximum_load_unit>[^\s]+)\s+)?'
  45. + ur'Artikelnummer: (?P<product_id>[\d\.]+)\s+'
  46. + ur'Einzelpreis \? (?P<price>\d+,\d*)-?\s+'
  47. + ur'Gesamtpreis',
  48. article_text,
  49. re.UNICODE,
  50. ).groupdict()
  51. order.items.append(dingguo.Article(
  52. depth = dingguo.ScalarFigure(float(article_attr['depth']), article_attr['depth_unit']) if article_attr['depth'] else None,
  53. height = dingguo.ScalarFigure(float(article_attr['height']), article_attr['height_unit']) if article_attr['height'] else None,
  54. maximum_load = dingguo.ScalarFigure(float(article_attr['maximum_load']), article_attr['maximum_load_unit']) if article_attr['maximum_load'] else None,
  55. name = u'%s %s' % (article_attr['name'].strip(), article_attr['label'].strip().replace(' , ', ', ')),
  56. price_brutto = dingguo.Sum(float(article_attr['price'].replace(',', '.')), u'EUR'),
  57. product_id = article_attr['product_id'],
  58. quantity = int(article_attr['quantity']),
  59. width = dingguo.ScalarFigure(float(article_attr['width']), article_attr['width_unit']) if article_attr['width'] else None,
  60. ))
  61. return [order]