summaryrefslogtreecommitdiff
path: root/ofxhome
diff options
context:
space:
mode:
authorAndrej Shadura <andrewsh@debian.org>2018-04-30 11:06:34 +0200
committerAndrej Shadura <andrewsh@debian.org>2018-04-30 11:06:34 +0200
commit2052b74bffed8b6ee7e458f8dc50dc504fcf7f46 (patch)
tree004161271712d956d3b70deac9fe362fade72726 /ofxhome
Import Upstream version 0.3.1
Diffstat (limited to 'ofxhome')
-rw-r--r--ofxhome/__init__.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/ofxhome/__init__.py b/ofxhome/__init__.py
new file mode 100644
index 0000000..6ca3aeb
--- /dev/null
+++ b/ofxhome/__init__.py
@@ -0,0 +1,128 @@
+import urllib
+from datetime import datetime
+from xml.dom.minidom import parseString
+
+__version__ = '0.3.1'
+
+API_URL='http://www.ofxhome.com/api.php'
+
+class OFXHome:
+
+ @staticmethod
+ def lookup(id):
+ """
+ Get financial institution OFX info given an ofxhome.com 'id'
+
+ Returns: Institution
+
+ bank = OFXHome.lookup('456')
+ print bank.name _ bank.url _ bank.fid
+ """
+ return Institution(_xml_request({ 'lookup': id }))
+
+ @staticmethod
+ def all():
+ """
+ List every available bank that ofxhome.com knows about
+
+ Returns: InstitutionList
+
+ See also: OFXHome.search()
+ """
+ return search()
+
+ @staticmethod
+ def search(name=None):
+ """
+ Search for a financial institution by name.
+
+ Returns: InstitutionList
+
+ If no name is provided , or a name of None is provided then
+ it is the same as calling OFXHome.all(). Note that passing a
+ string of '' will not be the same thing and will result in no
+ results.
+
+ banks = OFXHome.search('America')
+ for res in banks:
+ print res.id _ res.name
+
+ bank = OFXHome.lookup(res.id)
+ print bank.name _ bank.url _ bank.fid
+ """
+ if name is None:
+ params = { 'all': 'yes' }
+ else:
+ params = { 'search': name }
+ return InstitutionList(_xml_request(params))
+
+def _attr(node,name):
+ return node.getAttribute(name)
+
+def _text(parent,name):
+ rc = []
+ for node in parent.getElementsByTagName(name)[0].childNodes:
+ if node.nodeType == node.TEXT_NODE:
+ rc.append(node.data)
+ return ''.join(rc)
+
+def _xml_request(params=None):
+ encoded = urllib.urlencode(params)
+ xml = urllib.urlopen("%s?%s" % (API_URL,encoded)).read()
+ return xml
+
+#---------------------------------------------
+class InstitutionList:
+ def __init__(self,xml):
+ root = parseString(xml).documentElement
+ data = []
+ for node in root.getElementsByTagName('institutionid'):
+ data.append({ 'name': _attr(node,'name'), 'id': _attr(node,'id') })
+ self.items = data
+ self.xml = xml
+
+ @staticmethod
+ def from_file(file):
+ return InstitutionList(open(file,'r').read())
+
+ def __getitem__(self,item):
+ return self.items[item]
+
+ def __len__(self):
+ return len(self.items)
+
+ def __iter__(self):
+ for i in self.items:
+ yield i
+
+ def __str__(self):
+ return self.xml
+#---------------------------------------------
+class Institution:
+ def __init__(self,xml):
+
+ dom = parseString(xml)
+ root = dom.documentElement
+
+ self.id = _attr(root,'id')
+ self.name = _text(root,'name')
+ self.fid = _text(root,'fid')
+ self.org = _text(root,'org')
+ self.url = _text(root,'url')
+ self.brokerid = _text(root,'brokerid')
+ self.ofxfail = _text(root,'ofxfail')
+ self.sslfail = _text(root,'sslfail')
+ self.lastofxvalidation = datetime.strptime(_text(root,'lastofxvalidation'),"%Y-%m-%d %H:%M:%S")
+ self.lastsslvalidation = datetime.strptime(_text(root,'lastsslvalidation'),"%Y-%m-%d %H:%M:%S")
+
+ self.xml = xml
+
+ def __getitem__(self,item):
+ return self.__dict__[item]
+
+ def __setitem__(self,item,value):
+ self.__dict__[item] = value
+
+ @staticmethod
+ def from_file(file):
+ return Institution(open(file,'r').read())