Skip to content

Instantly share code, notes, and snippets.

@hosteren
Last active March 29, 2018 16:54
Show Gist options
  • Save hosteren/fd75176315597ec5cb4f231ed64e4da6 to your computer and use it in GitHub Desktop.
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.
#!/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