kickstarter.py 2.3 KB

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