First demo of JSON export for Amazon
This commit is contained in:
commit
0abbf06225
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.pyc
|
0
capabilities/__init__.py
Normal file
0
capabilities/__init__.py
Normal file
14
capabilities/base.py
Normal file
14
capabilities/base.py
Normal file
@ -0,0 +1,14 @@
|
||||
from weboob.capabilities.base import empty
|
||||
|
||||
|
||||
def clean_object(o):
|
||||
"""
|
||||
Returns a JSON-serializable dict from a Weboob object.
|
||||
"""
|
||||
o = o.to_dict()
|
||||
for k, v in o.items():
|
||||
if empty(v):
|
||||
# Replace empty values by None, avoid "NotLoaded is not
|
||||
# serializable" error
|
||||
o[k] = None
|
||||
return o
|
21
capabilities/bill.py
Normal file
21
capabilities/bill.py
Normal file
@ -0,0 +1,21 @@
|
||||
from base import clean_object
|
||||
|
||||
|
||||
def to_cozy(document):
|
||||
"""
|
||||
Export a CapDocument object to JSON, to pass it to Cozy instance.
|
||||
"""
|
||||
# Fetch the list of subscriptions
|
||||
subscriptions = list(document.iter_subscription())
|
||||
# Return a formatted dict with all the infos
|
||||
return {
|
||||
"subscriptions": [ # List of subscriptions
|
||||
clean_object(subscription) for subscription in subscriptions
|
||||
],
|
||||
"bills": { # List of bills for each subscription
|
||||
subscription.id: [
|
||||
clean_object(bill) for bill in document.iter_bills(subscription)
|
||||
]
|
||||
for subscription in subscriptions
|
||||
}
|
||||
}
|
73
cozyweboob.py
Executable file
73
cozyweboob.py
Executable file
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python2
|
||||
from __future__ import print_function
|
||||
|
||||
import getpass
|
||||
|
||||
from weboob.core import Weboob
|
||||
|
||||
from capabilities import bill
|
||||
from tools.jsonwriter import pretty_json
|
||||
|
||||
|
||||
class Connector(object):
|
||||
"""
|
||||
Connector is a tool that connects to common websites like bank website,
|
||||
phone operator website... and that grabs personal data from there.
|
||||
Credentials are required to make this operation.
|
||||
|
||||
Technically, connectors are weboob backend wrappers.
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def version():
|
||||
return Weboob.VERSION
|
||||
|
||||
def update(self):
|
||||
return self.weboob.update()
|
||||
|
||||
def __init__(self, modulename, parameters):
|
||||
"""
|
||||
Create a Weboob handle and try to load the modules.
|
||||
"""
|
||||
self.weboob = Weboob()
|
||||
|
||||
# Careful: this is extracted from weboob's code.
|
||||
# Install the module if necessary and hide the progress.
|
||||
class DummyProgress:
|
||||
def progress(self, a, b):
|
||||
pass
|
||||
|
||||
repositories = self.weboob.repositories
|
||||
minfo = repositories.get_module_info(modulename)
|
||||
if minfo is not None and not minfo.is_installed():
|
||||
repositories.install(minfo, progress=DummyProgress())
|
||||
|
||||
# Calls the backend.
|
||||
self.backend = self.weboob.build_backend(modulename, parameters)
|
||||
|
||||
|
||||
def main(email, password=None):
|
||||
"""
|
||||
Main code
|
||||
"""
|
||||
if password is None:
|
||||
# Ask for password if not provided
|
||||
password = getpass.getpass("Password? ")
|
||||
|
||||
connector = Connector(
|
||||
"amazon",
|
||||
{
|
||||
"website": "www.amazon.fr",
|
||||
"email": email,
|
||||
"password": password
|
||||
}
|
||||
)
|
||||
return bill.to_cozy(connector.backend)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(
|
||||
pretty_json(
|
||||
main(raw_input("Email? "))
|
||||
)
|
||||
)
|
0
tools/__init__.py
Normal file
0
tools/__init__.py
Normal file
27
tools/jsonwriter.py
Normal file
27
tools/jsonwriter.py
Normal file
@ -0,0 +1,27 @@
|
||||
import json
|
||||
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
class CustomJSONEncoder(json.JSONEncoder):
|
||||
"""
|
||||
Custom JSONEncoder to support more types.
|
||||
"""
|
||||
def default(self, o):
|
||||
if isinstance(o, datetime):
|
||||
# Serialize datetime objects to ISO dates
|
||||
return o.isoformat()
|
||||
elif isinstance(o, Decimal):
|
||||
# Serialize Decimal objects to string
|
||||
return str(o)
|
||||
return json.JSONEncoder.default(self, o)
|
||||
|
||||
|
||||
def pretty_json(foo):
|
||||
"""
|
||||
Pretty printing of JSON output, using the custom JSONEncoder.
|
||||
"""
|
||||
return json.dumps(foo, sort_keys=True,
|
||||
indent=4, separators=(',', ': '),
|
||||
cls=CustomJSONEncoder)
|
Loading…
Reference in New Issue
Block a user