aboutsummaryrefslogtreecommitdiff
path: root/budget/utils.py
diff options
context:
space:
mode:
author0livd <0livd@users.noreply.github.com>2017-02-22 23:40:52 +0100
committer0livd <0livd@users.noreply.github.com>2017-03-09 23:24:18 +0100
commite35480d6b7adf76f5bc4d46153b621abd722c681 (patch)
treeb80cbf5ae0ddee631cb0c0aa31940f71d94d5855 /budget/utils.py
parent8c412b391f9402f3840728ad1e6b8043e4ed8b7b (diff)
downloadihatemoney-mirror-e35480d6b7adf76f5bc4d46153b621abd722c681.zip
ihatemoney-mirror-e35480d6b7adf76f5bc4d46153b621abd722c681.tar.gz
ihatemoney-mirror-e35480d6b7adf76f5bc4d46153b621abd722c681.tar.bz2
Add export feature
Bills and transactions can now be exported to json or csv ref #28
Diffstat (limited to 'budget/utils.py')
-rw-r--r--budget/utils.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/budget/utils.py b/budget/utils.py
index c849af0..8f5d3d5 100644
--- a/budget/utils.py
+++ b/budget/utils.py
@@ -2,8 +2,12 @@ import re
import inspect
from jinja2 import filters
+from json import dumps
from flask import redirect
from werkzeug.routing import HTTPException, RoutingException
+from io import BytesIO
+
+import csv
def slugify(value):
@@ -77,3 +81,30 @@ def minimal_round(*args, **kw):
# return depending on it
ires = int(res)
return (res if res != ires else ires)
+
+def list_of_dicts2json(dict_to_convert):
+ """Take a list of dictionnaries and turns it into
+ a json in-memory file
+ """
+ bytes_io = BytesIO()
+ bytes_io.write(dumps(dict_to_convert))
+ bytes_io.seek(0)
+ return bytes_io
+
+def list_of_dicts2csv(dict_to_convert):
+ """Take a list of dictionnaries and turns it into
+ a csv in-memory file, assume all dict have the same keys
+ """
+ bytes_io = BytesIO()
+ try:
+ csv_data = [dict_to_convert[0].keys()]
+ for dic in dict_to_convert:
+ csv_data.append([dic[h].encode('utf8')
+ if isinstance(dic[h], unicode) else str(dic[h]).encode('utf8')
+ for h in dict_to_convert[0].keys()])
+ except (KeyError, IndexError):
+ csv_data = []
+ writer = csv.writer(bytes_io)
+ writer.writerows(csv_data)
+ bytes_io.seek(0)
+ return bytes_io