kickstarter.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # -*- coding: utf-8 -*-
  2. import BeautifulSoup
  3. import datetime
  4. import dateutil.parser
  5. import dingguo
  6. import email.message
  7. import ioex
  8. import re
  9. def parse_order_confirmation_mail(mail):
  10. assert isinstance(mail, email.message.Message)
  11. html = mail.get_payload()[1].get_payload(decode = True).decode('utf-8')
  12. if not 'kickstarter' in html:
  13. raise Exception()
  14. email_recipient_address = mail['delivered-to'].decode('utf8')
  15. email_date = datetime.datetime.utcfromtimestamp(
  16. # seconds since the Epoch in UTC
  17. email.utils.mktime_tz(email.utils.parsedate_tz(mail['date']))
  18. )
  19. order = dingguo.Order(
  20. platform = u'kickstarter',
  21. order_id = '%s-%s' % (email_recipient_address, email_date.isoformat()),
  22. order_date = email_date,
  23. customer_id = email_recipient_address,
  24. )
  25. doc = BeautifulSoup.BeautifulSoup(html)
  26. def get_text(tag):
  27. return u''.join([c if type(c) is BeautifulSoup.NavigableString else get_text(c) for c in tag.contents])
  28. shipping_attr = re.search(
  29. ur'^Shipping(?P<dest>.*)\((?P<price>.*)\)$',
  30. doc.find(text = re.compile('Shipping')).parent.parent.text,
  31. ).groupdict()
  32. shipping = dingguo.Shipping(
  33. destination_point = shipping_attr['dest'].strip(),
  34. price_brutto = dingguo.Sum.parse_text(shipping_attr['price']),
  35. )
  36. pledge_amount = dingguo.Sum.parse_text(
  37. doc.find(text = re.compile('Amount pledged')).parent.parent.text.replace('Amount pledged', '')
  38. )
  39. order.items.append(dingguo.Pledge(
  40. campaign = dingguo.Campaign(
  41. name = doc.find('h2').text,
  42. founder = doc.find('h2').findNext('p').text[len('By '):],
  43. end = dateutil.parser.parse(
  44. doc.find(text = re.compile('your card will be charged on')).findNext('time')['datetime']
  45. ),
  46. ),
  47. price_brutto = pledge_amount - shipping.price_brutto,
  48. reward = get_text(doc.find(text = re.compile('Reward')).findPrevious('td'))
  49. .strip()[len('Reward'):].strip().replace('\r\n', '\n'),
  50. ))
  51. order.items.append(shipping)
  52. return [order]