diff --git a/README.md b/README.md index e351648..07bade9 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,15 @@ map should have at the following three keys: required by the associated Weboob backend. * `id` should be a unique string of your choice, to uniquely identify this run of the specified module with the specified set of parameters. +* `actions` is an optional list of actions to perform. It should contains two + keys, `fetch` and `download`. For each key, you can either pass `true` to + completely handle the actions, or a map of capabilities associated to list + of contents to fetch. + Typically, you can pass `"fetch": { "CapDocument": ["bills"]}` to fetch only + bills from the `CapDocuments` capability. You can also pass + `"download": { "CapDocument": ["someID"] }` to download a specific id (which + can be either type of fields in the `CapDocument` capability). + If not provided, the default is to fetch only, and do not download anything. ## Output JSON file diff --git a/cozyweboob/__main__.py b/cozyweboob/__main__.py index df0c5bf..6590126 100644 --- a/cozyweboob/__main__.py +++ b/cozyweboob/__main__.py @@ -1,4 +1,5 @@ """ +Main script for this module """ from __future__ import print_function @@ -63,7 +64,11 @@ def main_fetch(used_modules): # Fetch data and merge them with the ones from other # capabilities fetched_data[module["id"]].update( - fetching_function(backend) + fetching_function( + backend, + # If no actions specified, fetch but don't download + module.get("actions", {"fetch": True, "download": False}) + ) ) except AttributeError: # In case the converter does not exist on our side diff --git a/cozyweboob/capabilities/CapDocument.py b/cozyweboob/capabilities/CapDocument.py index 366e184..0d82a4d 100644 --- a/cozyweboob/capabilities/CapDocument.py +++ b/cozyweboob/capabilities/CapDocument.py @@ -6,26 +6,34 @@ from base import clean_object from weboob.capabilities.bill import Bill -def to_cozy(document): +def fetch_subscriptions(document): """ - Export a CapDocument object to a JSON-serializable dict, to pass it to Cozy - instance. + Fetch the list of subscriptions Args: document: The CapDocument object to handle. - Returns: A JSON-serializable dict for the input object. + Returns: A list of subscriptions """ - # Get the BASEURL to generate absolute URLs - base_url = document.browser.BASEURL - # Fetch the list of subscriptions try: subscriptions = list(document.iter_subscription()) except NotImplementedError: subscriptions = None + return subscriptions - # Fetch and clean the list of bills - # Bills are formatted final documents emitted by the third party (typically - # monthly bills for a phone service provider) + +def fetch_documents(document, subscriptions): + """ + Fetch and clean the list of bills + + Bills are formatted final documents emitted by the third party (typically + monthly bills for a phone service provider) + Documents are more general and can be contracts, terms etc. + + Args: + document: The CapDocument object to handle. + subscriptions: A list of subscriptions for the CapDocument object. + Returns: A tuple of cleaned list of documents and bills. + """ try: assert subscriptions raw_documents = { @@ -53,11 +61,22 @@ def to_cozy(document): except (NotImplementedError, AssertionError): documents = None bills = None + return documents, bills - # Fetch and clean the list of details of the subscription (detailed - # consumption) - # Details are aggregated billing counts (typically aggregated counts by - # communication type for a phone service provider) + +def fetch_details(document, subscriptions): + """ + Fetch and clean the list of details of the subscription (detailed + consumption) + + Details are aggregated billing counts (typically aggregated counts by + communication type for a phone service provider) + + Args: + document: The CapDocument object to handle. + subscriptions: A list of subscriptions for the CapDocument object. + Returns: A cleaned list of detailed bills. + """ try: assert subscriptions detailed_bills = { @@ -69,10 +88,21 @@ def to_cozy(document): } except (NotImplementedError, AssertionError): detailed_bills = None + return detailed_bills - # Fetch and clean the list of history bills - # History bills are detailed bills for any event that resulted in a bill - # (typically any communication for a phone service provider) + +def fetch_history(document, subscriptions): + """ + Fetch and clean the list of history bills + + History bills are detailed bills for any event that resulted in a bill + (typically any communication for a phone service provider) + + Args: + document: The CapDocument object to handle. + subscriptions: A list of subscriptions for the CapDocument object. + Returns: A cleaned list of history bills. + """ try: assert subscriptions history_bills = { @@ -85,6 +115,40 @@ def to_cozy(document): } except (NotImplementedError, AssertionError): history_bills = None + return history_bills + + + +def to_cozy(document, actions={"fetch": True, "download": False}): + """ + Export a CapDocument object to a JSON-serializable dict, to pass it to Cozy + instance. + + Args: + document: The CapDocument object to handle. + actions: A dict describing what should be fetched (see README.md). + Returns: A JSON-serializable dict for the input object. + """ + # Get the BASEURL to generate absolute URLs + base_url = document.browser.BASEURL + + if actions["fetch"] is True or "CapDocument" in actions["fetch"]: + subscriptions = fetch_subscriptions(document) + + if actions["fetch"] is True or "documents" in actions["fetch"]["CapDocument"]: + documents, bills = fetch_documents(document, subscriptions) + else: + documents, bills = None, None + + if actions["fetch"] is True or "detailed_bills" in actions["fetch"]["CapDocument"]: + detailed_bills = fetch_details(document, subscriptions) + else: + detailed_bills = None + + if actions["fetch"] is True or "history_bills" in actions["fetch"]["CapDocument"]: + history_bills = fetch_history(document, subscriptions) + else: + history_bills = None # Return a formatted dict with all the infos return { diff --git a/doc/capabilities/CapDocument.md b/doc/capabilities/CapDocument.md index ab1dda6..629c175 100644 --- a/doc/capabilities/CapDocument.md +++ b/doc/capabilities/CapDocument.md @@ -7,6 +7,7 @@ This capability is used for modules that have billing support. |-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| | subscriptions | List of subscriptions (contracts) | Subscription | | bills | Map of bills for each subscription. Bills are final document produced by the third party. | Bill | +| documents | Map of documents for each subscription. Documents are final document produced by the third party, but not bills (typically contract, terms, etc). | Document | | history_bills | Map of history bills for each subscription. History bills are detailed counts for any event resulting in a transaction (typically any communication for a phone service provider) | Detail | | detailed_bills | Map of detailed bills for each subscription. Detailed bills are aggregated counts by facturation type (typically voice and texts for a phone service provider) | Detail | diff --git a/server.py b/server.py index 1b840b4..8d5a985 100755 --- a/server.py +++ b/server.py @@ -26,6 +26,16 @@ def fetch_view(): return pretty_json(cozyweboob(params)) +@post("/download") +def download_view(): + """ + Download from weboob modules. + """ + params = request.forms.get("params") + response.content_type = "application/json" + # TODO return pretty_json(proxy.download(params)) + + @route("/list") def list_view(): """