Last active
March 29, 2018 16:54
-
-
Save hosteren/fd75176315597ec5cb4f231ed64e4da6 to your computer and use it in GitHub Desktop.
Odata er servicen hvor Borgen lægger deres stemmer, sager og personer m.v. op. Jeg har derfor lavet et lille Python script til at gøre det nemt.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
OdaWrapper er et lille script til på nemmere møde at aggregere | |
data fra oda.ft.dk. Odata er servicen hvor Borgen lægger deres | |
stemmer, sager og personer mv. op. | |
De har nok med vilje gjort det lidt uoverskuelig, og dette | |
script kræver stadig at man kender de forskellige tabeller. | |
""" | |
from math import ceil | |
import requests | |
import win_unicode_console | |
win_unicode_console.enable() | |
class OdaWrapper(object): | |
def __init__(self): | |
self.base_url = u"http://oda.ft.dk/api/" | |
self.all_url = u"?$inlinecount=allpages" | |
self.filter_url = u"&$filter=" | |
def getAll(self, table, filter=None, relation=None): | |
""" | |
Bruges til at hente alle elementer i en Odata Tabel | |
-> table: String, Tabel navn som 'Aktør', 'Sag', 'Møde', osv | |
-> filter: List/String, Hvis filter er en List skal vil det | |
sættes op således: filter[0] == filter[1] | |
-> relation: Dict(id, table), Hvis der skal hentes fx 'Stemme' | |
relateret til 'Aktør', vil 'relation.id' være et 'aktørid' | |
og 'relation.table' skal være 'Stemme' | |
""" | |
url = u"%s%s%s" % (self.base_url, table, self.all_url) | |
if relation is not None: | |
url = u"%s%s(%i)/%s%s" % (self.base_url, table, relation["id"], | |
relation["table"], self.all_url) | |
if filter is not None and isinstance(filter, list): | |
add = "%s%s eq %s" % (self.filter_url, filter[0], filter[1]) | |
url += add | |
elif filter is not None and isinstance(filter, str): | |
url += self.filter_url + filter | |
result = requests.get(url).json() | |
final = [] | |
for res in result['value']: | |
final.append(res) | |
if 'odata.count' in result: | |
url_range = range(int(ceil(int(result['odata.count'])/20)+1)) | |
for u in url_range: | |
skip = "&$skip=%i" % (u*20) | |
next_url = requests.get(url+skip).json() | |
for res in next_url['value']: | |
final.append(res) | |
return final | |
def getOne(self, table, id): | |
""" | |
Funktionen getOne henter én enkelt specificeret post. | |
-> table: String, Tabel hvor der skal hentes et element | |
-> id: Int, id på elementet. Lars Løkke har Aktør id 145 | |
""" | |
url = u"%s%s(%i)" % (self.base_url, table, id) | |
return requests.get(url).json() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment