diff --git a/modules/amazon/browser.py b/modules/amazon/browser.py index 547ef583..ea04ed7c 100644 --- a/modules/amazon/browser.py +++ b/modules/amazon/browser.py @@ -22,6 +22,7 @@ from requests.exceptions import Timeout, ConnectionError from weboob.browser import LoginBrowser, URL, need_login from weboob.browser.exceptions import ServerError, HTTPNotFound +from weboob.capabilities.bill import Subscription, Bill from weboob.capabilities.shop import OrderNotFound from weboob.exceptions import BrowserIncorrectPassword @@ -112,3 +113,24 @@ class Amazon(LoginBrowser): except (ServerError, Timeout, ConnectionError) as e: pass raise e + + @need_login + def get_subscription_list(self): + sub = Subscription() + sub.label = u'amazon' + sub.id = u'amazon' + yield sub + + @need_login + def iter_bills(self, subscription): + orders = self.iter_orders() + for o in orders: + b = Bill() + b._url = o._bill['url'] + b.id = '%s.%s' % (subscription.id, o.id) + b.date = o.date + b.price = o.total + b.format = o._bill['format'] + b.currency = self.get_currency() + b.vat = o.tax + yield b diff --git a/modules/amazon/fr/pages.py b/modules/amazon/fr/pages.py index 9169598b..6ccccfaf 100644 --- a/modules/amazon/fr/pages.py +++ b/modules/amazon/fr/pages.py @@ -111,8 +111,16 @@ class OrderNewPage(OrderPage): order.discount = self.discount() order.shipping = self.shipping() order.total = self.grand_total() + order._bill = self.bill() return order + def bill(self): + pdf = self.doc.xpath(u'//a[contains(text(), "Imprimer une facture")]') + htlm = self.doc.xpath(u'//a[contains(text(), "Imprimer un récapitulatif de commande")]') + format = u'pdf' if pdf else u'html' + url = pdf[0].attrib['href'] if pdf else htlm[0].attrib['href'] + return {'url': url, 'format': format} + def order_date(self): return datetime.strptime( re.match(u'.*Commandé le ([0-9]+ [0-9]+ [0-9]+) .*', diff --git a/modules/amazon/module.py b/modules/amazon/module.py index 074c839b..dbc6da0d 100644 --- a/modules/amazon/module.py +++ b/modules/amazon/module.py @@ -18,7 +18,9 @@ # along with weboob. If not, see . +from weboob.capabilities.bill import CapBill, Subscription, Bill, SubscriptionNotFound, BillNotFound from weboob.capabilities.shop import CapShop, Order +from weboob.capabilities.base import find_object from weboob.tools.backend import Module, BackendConfig from weboob.tools.value import Value, ValueBackendPassword from weboob.tools.ordereddict import OrderedDict @@ -29,7 +31,7 @@ from .fr.browser import AmazonFR __all__ = ['AmazonModule'] -class AmazonModule(Module, CapShop): +class AmazonModule(Module, CapShop, CapBill): NAME = 'amazon' MAINTAINER = u'Oleg Plakhotniuk' EMAIL = 'olegus8@gmail.com' @@ -75,3 +77,26 @@ class AmazonModule(Module, CapShop): if not isinstance(order, Order): order = self.get_order(order) return self.browser.iter_items(order) + + def iter_subscription(self): + return self.browser.get_subscription_list() + + def get_subscription(self, _id): + return find_object(self.iter_subscription(), id=_id, error=SubscriptionNotFound) + + def get_bill(self, _id): + subid = _id.split('.')[0] + subscription = self.get_subscription(subid) + return find_object(self.iter_bills(subscription), id=_id, error=BillNotFound) + + def iter_bills(self, subscription): + if not isinstance(subscription, Subscription): + subscription = self.get_subscription(subscription) + return self.browser.iter_bills(subscription) + + def download_bill(self, bill): + if not isinstance(bill, Bill): + bill = self.get_bill(bill) + if bill._url: + return self.browser.open(bill._url).content + return None