NSD DATABASE FOR HØGRE UTDANNING(DBH)

Like dokumenter
NSD DATABASE FOR HØGRE UTDANNING(DBH) DBH-API. Tilgang til data via API

Dette er en demonstrasjonsside som vi skal bruke for å se litt nærmere på HTTP protokollen. Eksemplet vil også illustrere et par ting i PHP.

Innføring i bruk av CGI4VB

Betinget eksekvering og logiske tester i shell

Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

Gruppe prosjekt del 3. INFO134 Klientprogrammering Vår 2017 Kandidatnummer: 304, 298

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

FS-API Status og veien videre. Kai Quale og Mario Ledinscak KDTO

Educatia AS. Programmeringsgrensesnitt (API) for brukersynkronisering. Versjon: 1.1 ( ) Educatia AS

Test Beskrivelse Resultat Innhenting CBIS Programmet mottar data fra CBIS OK, men kun. Innhenting Tellus Programmet mottar data fra Tellus OK

Verktøy for boligkartlegging

Verktøy for boligkartlegging

PC-AXIS Brukerveiledning for tabelluttak og bearbeiding av data

Oppdatering av person/studentforekomster i FS mot folkeregisteret

GraphQL. Hva, hvorfor, hvordan

Dette vil pakke ut filer til mappen \Tillegg\msp2016 under Eldata sin installasjonsmappe på maskinen.

Veileder til levering og godkjenning av rapporteringsdata til DBH-F

Innføring i bruk av CGI4VB

En beskrivelse av API for innhenting av informasjon fra registeret for sentralt godkjente foretak Direktoratet for byggkvalitet

Dataporten sikker og enkel deling av data i UH-sektoren

Veiledning til STAR Tableau

Høgskoleni østfold EKSAMEN. Emne: Innføring i programmering

6107 Operativsystemer og nettverk

Løsningsforslag til eksamen 24. november 2015

V-R7000 V-R7100 V-T500. Fra programmeringsark til maskin

EKSAMEN. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad.

Øvingsforelesning i Python (TDT4110)

SMS overføringer av tekstmeldinger til mobiltelefon

PGZ - Hangman Ekspert Python Lærerveiledning

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Øvingsforelesning 3 Python (TDT4110)

ephorte Integration Services (eis) produktbeskrivelse

Metoder med parametre, løkker og arrayer

ISY G-prog Beskrivelse Endringsliste

API-søk. Innholdsfortegnelse. Kort beskrivelse. Parametere:

HØGSKOLEN I SØR-TRØNDELAG

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

Humanware. Trekker Breeze versjon

Oppgave 1 (Opprett en database og en tabell)

Innholdsfortegnelse. 1. Testing Feiltesting av koden Funksjonstesting: Kilder.10

DATAUTFORSKNING I EG, EG 7.1 OG EGENDEFINERTE FUNKSJONER SAS FANS I STAVANGER 4. MARS 2014, MARIT FISKAAEN

1. Arduino Bluetooth 2 HC-05 modul

P L A N I A 8 S Y S T E M K R A V PLANIA 8 SYSTEM KRAV. Plania 8 Systemkrav.docx av 8

Øvingsforelesning 1 Python (TDT4110)

HØGSKOLEN I SØR-TRØNDELAG

Oblig 4Hybelhus litt mer tips enn i oppgaven

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

SPARQL. Daniel Reinholdt. Trondheim Daniel Reinholdt (NTNU) SPARQL Trondheim / 17

Næringsregner på PC n versjon 1.1.0

Brukerveiledning for Admin i FEBDOK versjon 6.0

Som en del av den kontinuerlige utviklingen av systemet vil Visma Software AS kunne endre sammensetningen av pakkeløsninger, moduler og funksjoner.

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Http- og WebServices funksjoner

Siteimprove analytics Tekniske spesifikasjoner

Pen- tes'ng av webservices. Asbjørn Reglund Thorsen Gruppe- og utviklingsleder UIO/FSAT

Agio Forvaltning AS - Portal. Enkelt, effektivt og tidsbesparende!

NCE TOURISM FJORD NORWAY. FJORDNETT INTERNETTFORUM 2012 Bergen, 12./13. juni 2012

Lønn 5.0. Veiledning for ASP leverandører

Kom i gang med Stata for Windows på UiO - hurtigstart for begynnere

Innstallasjon og oppsett av Wordpress

Kjøre Wordpress på OSX

Begynnerkurs i Stata. UiO vår 2019, Knut Waagan 1 / 95

Visma Reconciliation NYHETER OG FORBEDRINGER

InfoRed Publisering. - produktbeskrivelse. TalkPool WebServices Postboks Åneby

Primus Brukerveiledning for masseimport av bilder. Primus 5.6.5

Rutenettsmodell Import av Laserscan datafiler

Litt info om Unix-nettet/maskinene. Hvorfor kjøre matlab på Unix. Overføring av filer mellom PC og Unix. Hvordan få tilgang/unix-bruker

Åsveien 9, 3475 Sætre Telefon: Mobiltelefon: Faks: E-post:

Del 1 En oversikt over C-programmering

1 Guide til flerbrukerinstallasjon av e-lector

Askeladden Release-logg 30. august 2012

Brukerdokumentasjon for registrering og rapportering beredskapsutstyr hos Post og Teletilsynet

Lotus Traveler - Manual for installasjon

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Linux-programmer som bruker regulæruttrykk: grep, sed, awk

EKSAMEN ITF Webprogrammering 1 Dato: Eksamenstid: Hjelpemidler: 2 A4 ark (4 sider) med egenproduserte notater (håndskrevne/maskinskrevne)

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

BEGYNNERKURS I SPSS. Anne Schad Bergsaker 12. februar 2019

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Sikkerhet i Pindena Påmeldingssystem

Øvingsforelesning 5 Python (TDT4110)

Hvordan aktivere pakker og enkelttitler

som blanker skjermen (clear screen). Du får en oversikt over alle kommandoene ved å skrive,

Informasjon Eksamen i IN1000 høsten 2017

IN2000. Gjennomgang av tekniske oppgaver på prøveeksamen. Erlend Stenlund og Steffen Almås + innspill fra Gaute Berge

lage og bruke funksjoner som tar argumenter lage og bruke funksjoner med returverdier forklare forskjellen mellom globale og lokale variabler

Scan Secure GTS PAS

6105 Windows Server og datanett

ORDBMS og OODBMS i praksis

StudInfo Vortex FS Syllabus. Nye systemer som prater sammen... Hvem er vi. Ingen kvalitetsreform uten teknologi. Denne forelesningen:

Her skal du lære å programmere micro:biten slik at du kan spille stein, saks, papir med den eller mot den.

Tillitsforvaltning og inndatavalidering

kpmg KPMG Kundeportal Brukerveiledning

Multi-Faktor Autentisering. Brukerveiledning

Oppgave 1 - Linux kommandolinje (%)

En internett basert og fleksibel database som kan tilpasses til ethvert behov, og som vil vokse med bedriften/institusjonen.

Kom i gang med Python

Brukerdokumentasjon for LabOra portal - forfattere

Doc.no. Date Version. PoliTerm PT8XX. Oppsett og konfigurasjon

Transkript:

NSD DATABASE FOR HØGRE UTDANNING(DBH) DBH-API koding Eksempel på kode og programbibliotek for å bruke DBH-API Noen enkle eksempler på kode for å komme i gang med å bruke API-et.

Innhold Veiledning for spørringer mot API... 1 Statuskode... 2 Teknisk informasjon for å hente data fra API via program - curl... 2 Eksempel på AJAX query fra klient... 3 curl: Eksempel på spørringen med en inputfil: querybody.json... 4 Excel Overføring av datasett via API klient.... 5 Sammenligning DBH Api og DBH Rapporter :... 6 O2AUTH bruk i PHYTON.... 7 R programmering... 7 Eksempel1 med R programmering... 7 Eksempel2 - R programmering... 8 Eksempel3 med R programmering... 10 Veiledning for spørringer mot API Data kan hentes via Curl eller fra andre program. Data er organisasjonsdata, studietilbud, studentdata, doktorgradsdata, økonomidata, publiseringsdata fra kanalregisteret, personaldata og andre data(som for eksempel areal). Dette utgjør en statistikkbank. Spørringer mot DBH API er p.t tilgjengelig via Http REST - POST og JSON format (JavaScript Object Notation). Du kan endre inputverdiene ( values ) programmatisk. POST er valgt fordi det gir en mer fleksibel måte å spørre på i forhold til GET. Vanligvis angir POST oppdatering. Dette er ikke tilfelle i API spørringen. Logon fra maskin software via Json Web Token (JWT) vil vare i 1 time. Bruker må selv lage rutiner for å hente nytt token før det gamle er gått ut på tid. For eksempel i form av en loop. Der er eksempel på dette i dette dokumentet. Data som genereres via API blir ikke lagret hos DBH. Det er flere veier inn til DBH data via API. 1. Via klient https://api.nsd.no/dbhapiklient/. 2. Programvare. Bruk av curl, Post, R, Javascript eller annen programvare. DBH API dokumentasjon Side 1

Bruk av API via programvare krever pålogging via klient_id og secret_id. Vi tenker oss at når bruker skal sette opp en maskin til maskin kobling, så går han først inn i API klienten og prøver ut spørringen. Deretter kan han prøve spørringen i curl og til sist kan han programmere inn i egne program. curl finnes på de fleste Linux maskiner. Hvis spørringen blir lastet ned på Windows maskin og deretter overført til Linux, må tegnsettet konverteres (f.eks Dos2Unix ev. Unix2Dos). Vi ser feil ved tegnsett hvis æøå er feil. For eksempel Å...rstall. Linjeskift er også forskjellig fra dos til unix format. Systemet er et plug and play system og det er laget en toolboks (ligger på DBH sine nettsider) med eksempel på queries mot de fleste tabellene. Noen av variablene, for eksempel Institusjonskode eller Avdelingskode, er NSD sine egne verdier og er slik sett ikke offisielle verdier. Statuskode Sammen med http metoder som API responderer til, vil det bli returnert http statuskoder. Status 200 indikerer at request er ok. Returkoder i 400 segmentet, indikerer at noe gikk galt. Det kan være syntaks i JSON, Innhold i JSON eller at du prøver å gjøre noe du ikke er autorisert for. Dette er klientside problem og skyldes gjerne feil ved JSON inn eller innholdet i denne. Returkoder i 500 segmentet indikerer et server-side problem, slik at forespørselen ikke kan utføres. Du får det også når du ikke får kontakt med server. Teknisk informasjon for å hente data fra API via program - curl Illustrert med curl. Det forventes at bruker behersker curl. Returdata er JSON eller CSV, avhengig av om du velger å kalle /hentcsvtabelldata eller /hentjsontabelldata. For det siste valget er det mulig å få ut en statuslinje. URL som du skal bruke, vil stå i konfigureringsbildet for API et. Den brukes i forbindelse med https POST spørring over linje til NSD. Hent token: curl --data "grant_type=client_credentials" --user sso_id:sso_secret https://sso.nsd.no/oauth/token Klient-id og secret-id må institusjonen selv administrere via NSD sitt brukersystem når dette er klart. Foreløpig må institusjonen gi beskjed til NSD om å legge inn klientmaskinen. DBH API dokumentasjon Side 2

Eksempel på curl spørring av rapport 060.: export JWT=<sett inn token som er hentet her> curl -o./result/060-result.dat -i -d "@./querybody/060-querybody.json" -H "Content-Type: application/json;charset=utf-8" --header "Authorization: Bearer $JWT" -v -X POST https://api.nsd.no/dbhapitjener/tabeller/hentjsontabelldata 2>&1 Her blir query hentet fra./querybody/060-querybody.json og data lagt i /Resultat/060-resultat.dat Etter først å ha fått et gyldig token (pålogging) fra NSD. :set fileformat=unix #!/bin/bash # -i gir informasjon om overføring av data. echo "Starter uthenting av fil 060." export JWT= curl -o./result/060-result.dat -i -d "@./querybody/060-querybody.json" -H "Content-Type: application/json;charset=utf-8" --header "Authorization: Bearer $JWT" -v -X POST https://api.nsd.no/dbhapitjener/tabeller/hentjsontabelldata 2>&1 -i gir statusinformasjon og kan tas bort etter ønske. Eksempel på AJAX query fra klient (Representert ved javascript biblioteket AXIOS). stitilapi = <sti til api> jsonquery = innhold i spørring boksen i bildet. let config = { onuploadprogress: function(progressevent) { let percentcompleted = Math.round( (progressevent.loaded * 100) / progressevent.total );, //progressindikator headers: { 'Authorization': 'Bearer ' + this.props.hashtoken, ; Spørring via Javascript - Axios: Axios.post(stitilapi, { node: jsonquery,config).catch(error => { if (error.response) {.. else if (error.request) {.. else {.. ); DBH API dokumentasjon Side 3

HTTP error vil vise i linjen for Statuskode i konsollet eller leses ut fra "error" seksjonen. I Axios er ikke \ nødvendig, slik som det er gjort i eksempelet nedenfor. curl: Eksempel på spørringen med en inputfil: querybody.json Denne filen kopieres direkte fra spørringen som er lastet ned fra klienten. Om det blir brukt Linux kan filen kopieres fra Windows til Linux. På Linux må det kjøres fromdos kommando, eller tilsvarende, for å konvertere tegnsett. {"tabell_id":132,"api_versjon":1, "statuslinje":"n", "kodetekst":"n","decimal_separator":".", "groupby":["institusjonskode", "Avdelingskode", "Årstall"], "sortby":["institusjonskode", "Avdelingskode", "Årstall"], "filter":[ { "variabel": "Institusjonskode", "selection": { "filter": "all", "values": [ "*" ], { "variabel": "Avdelingskode", "selection": { "filter": "all", "values": [ "*" ], { "variabel": "Årstall", "selection": { "filter": "top", "values": [ "2" ] ] Import fra Last ned CSV resultat. Velge Data Fra tekst Importer Data med skilletegn Filopprinnelse: Unicode (Utf-8) Skilletegn Semikolon. Dette er standardmettoden for import av datafilen. DBH API dokumentasjon Side 4

Ved å velge importer som tekst på feltnivå, vil feltet vise slik som i datafilen. Excel Overføring av datasett via API klient. Eksempel på spørring: Disse dataene kan vi legge over i Excel. DBH API dokumentasjon Side 5

Her viser vi tabell for utenlandske kvinnelige studenter fra 1992 til 2016. Sammenligning DBH Api og DBH Rapporter : I noen tilfeller ser vi at det er differanser mellom summene som vises i DBH rapportdel og de summene som vises i API. De vanligste årsakene er: - Valg/avkryssinger i DBH rapport. I API/Klient henter bruker ofte hele tabellen hun/han ønsker å se. I rapportdelen gjøres valg som fører til at data blir filtrert bort. Derfor kan det oppstå større differanser. I API oppretter vi et forslag til spørring som bruker kan endre og legge inn nye filter. Forslaget er basert på at alle data hentes. Bruker kan selv legge inn begrensninger på data som skal leveres. - Valg av avrunding i DBH rapporter. Av og til ser vi differanser på 1(f.eks) mellom API og Rapport. Dette skyldes mest sannsynlig avrunding av data i Rapportdelen. I API avrunder vi ikke data. Om du er pålogget på Statstikksiden, kan du velge å ta bort avrunding. Da vil små differanser vanligvis forsvinne. - Pålogging i API. Om du ikke er definert for å se persondata (små tall) for egen institusjon, må du opprette bruker. Velg Logg inn og opprett bruker i API klient bildet. Send deretter beskjed til DBH om at vi må opprette autorisering til å se små tall Logg deretter inn og spør på nytt. DBH API dokumentasjon Side 6

Om nødvendig kan du teste med å sette "statuslinje":"j". Da vil du få beskjed om antall skjerminger. O2AUTH bruk i PHYTON. auth = ( my-id, my-secret ) # Bytte ut disse post_data = {"grant_type": "client_credentials" response = requests.post("https://sso.nsd.no/oauth/token", auth=auth, data=post_data) response_object = response.json() api_token = response_object["access_token"] library(rjson) library(jsonlite) library(httr) library(tidyverse) R programmering Når vi henter data programatisk, krever vi pålogging. D.v.s maskinen må være definert hos NSD. Det må hentes et logon token og dette vil vare en time. Progammerer må derfor ordnedette for eksempel med en loop som gjør at programmet for henting våkner en gang i timen. Det må også taes hensyn til kodesett når det gjelder spørringen (Windows/Dos/Unix). Eksempel1 med R programmering Dette eksempelet bruker ikke token pålogging. Tar ikke hensyn til norsk tegnsett. #Eksempel med httr library(foreign) library(jsonlite) library(httr) library(rjstat) options(encoding="utf-8") #Henter query setwd(file.path("c:/sync/fak/2018/apier/querybody")) resultat<- POST(url="https://api.nsd.no/dbhapitjener/Tabeller/hentJSONTabellData", add_headers("content-type: application/json"), body=upload_file('060-querybody2.json'), encode='json') resultat_data <- fromjson(content(resultat, "text")) DBH API dokumentasjon Side 7

setwd(file.path("c:/sync/fak/2018/apier/result")) #Fjerner linje 1 i data som inneholder Statuslinje resultat_data = resultat_data[-1,] #Fjerner alle variable med status i navnet #resultat_data_clean<-resultat_data[,!names(resultat_data) %in% c("status")] #Skriver til en csv-fil write.csv(resultat_data_clean, file = "Tabell_060.csv") Eksempel2 - R programmering Dette eksempelet bruker ikke token pålogging. Tar hensyn til norsk tegnsett. ## DBH-API tabeller i jsnon format ---- dbh_api_tabell <- function(spørring, tabellformat = "json", status = TRUE, api_versjon = 1, decimal_mark = locale()$decimal_mark, stringsasfactors = FALSE) { tabellformat = str_to_upper(tabellformat) if (tabellformat!="json") warning(str_c(tabellformat, " er ikke et gyldig format, bruker JSON i stedet")) post_body = rjson::tojson( c(list( api_versjon = api_versjon, statuslinje = "N", decimal_separator = decimal_mark), spørring)) resultat <- POST(url = "https://api.nsd.no/dbhapitjener/tabeller/hentjsontabelldata", add_headers(`content-type` = "application/json"), body = post_body, encode = "json") json_resultat <- fromjson(content(resultat, "text")) resultat_data = json_resultat[-1,] resultat_data<-resultat_data[,!names(resultat_data)%in% c("status")] ## Tegn utenfor ASCII virker ikke i spørringene (via rjson::tojson) når de DBH API dokumentasjon Side 8

## tastes rett inn, men virker når de tastes inn via Unicode-koden (selv om ## resultatet i konsollen vises likt). Virker heller ikke når de kodes via ## funksjoner som utf8::utf8_encode(as.character(s), utf8 = FALSE)) eller ## stringi::stri_escape_unicode(s) kod_norske_tegn <- function(s) { str_replace_all(s, c( "Æ" = "\u00c6", "Ø" = "\u00d8", "Å" = "\u00c5", "æ" = "\u00e6", "ø" = "\u00f8", "å" = "\u00e5" )) ## Funksjon for å lage spørring i DBH-API-format ---- dbh_api_spørring <- function(tabell_id, filter_variabler, filter_koder, filter_verdier, group_by = list(), sort_by = list()) { var_len <- length(filter_variabler) filter_variabler<-map(rep_len(filter_variabler, var_len), kod_norske_tegn) filter_koder<-map(rep_len(filter_koder, var_len), kod_norske_tegn) filter_verdier<-map(rep_len(filter_verdier, var_len), kod_norske_tegn) group_by = map(group_by, kod_norske_tegn) sort_by = map(sort_by, kod_norske_tegn) list(tabell_id = tabell_id, groupby = group_by, sortby = sort_by, filter = pmap( list(filter_variabler, filter_koder, filter_verdier), function(filter_var, filter_kode, filter_verdi) { list(variabel = filter_var, selection = list(filter = filter_kode, values = if(length(filter_verdi) == 1) list(filter_verdi) else filter_verdi)) )) #Studiepoeng DBH API dokumentasjon Side 9

studiepoeng<-dbh_api_tabell(dbh_api_spørring(900,"årstall", "top", "3")) #Kandidatar kandidatar<-dbh_api_tabell(dbh_api_spørring(907,"årstall", "item", "2016","2017")) #Institusjontype institusjon_type<-dbh_api_tabell(dbh_api_spørring(287,"institusjonstypekode", "all","*")) #Doktorgrad doktorgrader<-dbh_api_tabell(dbh_api_spørring(101,group_by = list("institusjonskode", "Årstall"), sort_by =list ("Institusjonskode"),filter_variabler = "Årstall", filter_kode = "top", filter_verdier = "3" )) # DOktorgrad samarbeid Doktorgrad_samarbeid<-dbh_api_tabell(dbh_api_spørring(100,"Årstall", "top", "3")) #Utveksling studenter utveksling<-dbh_api_tabell(dbh_api_spørring(142, group_by=list("institusjonskode","årstall","type","utvekslingsavtale"), sort_by ="Institusjonskode",filter_variabler = "Årstall", filter_kode = "top", filter_verdier ="3")) View(utveksling) Eksempel3 med R programmering Dette eksempelet bruker token pålogging. Tar hensyn til norsk tegnsett. ## Laster pakker ---- library(rjson) library(jsonlite) library(httr) library(magrittr) library(stringr) library(lubridate) library(tidyverse) ## Håndterer token-innlogging ---- # Globale variabler for nåværende token og utløpstid dbh_api_token_utløpstid <- Sys.time() dbh_api_token_innhold <- "" DBH API dokumentasjon Side 10

# Henter nytt token dbh_api_token_hent_nytt <- function() { res <- POST(url = "https://sso.nsd.no/oauth/token", authenticate(user = "sso_id", password = "sso_secret"), body = list(grant_type = "client_credentials"), encode = "form") %>% content("text") %>% fromjson() return(res$access_token) # Returnerer nåværende token fra global variabel, eller henter nytt token hvis # utløpt dbh_api_token <- function() { t <- Sys.time() if (t >= dbh_api_token_utløpstid) { walk2( str_c("dbh_api_token_", c("utløpstid", "innhold")), list(t + 3600, dbh_api_token_hent_nytt()), assign, env =.GlobalEnv ) return(dbh_api_token_innhold) ## Funksjon for å hente tabeller i DBH-API ---- dbh_api_tabell <- function(spørring, tabellformat = "json", status = TRUE, api_versjon = 1, decimal_mark = locale()$decimal_mark) { tabellformat = str_to_upper(tabellformat) if (! tabellformat %in% c("csv", "JSON")) warning(str_c(tabellformat, " er ikke et gyldig format, bruker JSON i stedet")) post_body = rjson::tojson( c(list( api_versjon = api_versjon, statuslinje = if_else(status, "J", "N"), decimal_separator = decimal_mark), spørring)) res <- POST(url = sprintf("https://api.nsd.no/dbhapitjener/tabeller/hent%stabelldata", tabellformat), add_headers(`content-type` = "application/json", Authorization = str_c("bearer ", dbh_api_token())), DBH API dokumentasjon Side 11

body = post_body, encode = "json") %>% content("text") if (tabellformat == "JSON") { json_res <- jsonlite::fromjson(res) status = drop_na(as_tibble(json_res$status)) # fjerner første kolonne (som er$status og inneholder nøstet df) og første rad (som er fylt i $status, og tom i øvrige kolonner) data = as_tibble(json_res[-1,-1]) else { status = NULL data = read_delim(res, delim = ";", col_types = cols(.default = col_character()), locale = locale(decimal_mark = decimal_mark), na = "", trim_ws = TRUE ) return(list(status = status, data = data)) ## Tegn utenfor ASCII virker ikke i spørringene (via rjson::tojson) når de ## tastes rett inn, men virker når de tastes inn via Unicode-koden (selv om ## resultatet i konsollen vises likt). Virker heller ikke når de kodes via ## funksjoner som utf8::utf8_encode(as.character(s), utf8 = FALSE)) eller ## stringi::stri_escape_unicode(s) kod_norske_tegn <- function(s) { str_replace_all(s, c( "Æ" = "\u00c6", "Ø" = "\u00d8", "Å" = "\u00c5", "æ" = "\u00e6", "ø" = "\u00f8", "å" = "\u00e5" )) ## Funksjon for å lage spørring i DBH-API-format ---- dbh_api_spørring <- function(tabell_id, filter_variabler, filter_koder, filter_verdier, group_by = list(), sort_by = list()) { var_len <- length(filter_variabler) filter_koder <- rep_len(filter_koder, var_len) DBH API dokumentasjon Side 12

filter_verdier <- rep_len(filter_verdier, var_len) filter_variabler <- map(filter_variabler, kod_norske_tegn) filter_koder <- map(filter_koder, kod_norske_tegn) filter_verdier <- map(filter_verdier, kod_norske_tegn) group_by = map(group_by, kod_norske_tegn) sort_by = map(sort_by, kod_norske_tegn) list(tabell_id = parse_integer(tabell_id), groupby = group_by, sortby = sort_by, filter = pmap( list(filter_variabler, filter_koder, filter_verdier), function(filter_var, filter_kode, filter_verdi) { list(variabel = filter_var, selection = list(filter = filter_kode, values = if(length(filter_verdi) == 1) list(filter_verdi) else filter_verdi)) )) # Hjelpefunksjon som laster ned spørringer til filer (separat for data og status) dbh_hent_spørring_til_fil <- function(spørringer, datanavn) { cat("\n", datanavn, "\n") pb <- progress_estimated(length(spørringer)) data_l <- spørringer %>% map(~{ pb$tick()$print() dbh_api_tabell(.) ) %>% transpose() status <- data_l$status %>% bind_rows() names(data_l$data) <- status$leveransenr data <- data_l$data %>% `[`(!is.na(status$leveransenr)) %>% bind_rows(.id = "leveransenr") write_tsv(data, str_c(datanavn, ".csv"), na = "") write_tsv(status, str_c(datanavn, "_status.csv"), na = "") pb$stop()$print() DBH API dokumentasjon Side 13

## Håndterer institusjoner ---- institusjoner <- dbh_api_tabell(dbh_api_spørring(211, "Institusjonskode", "all", "*")) institusjoner_status <- institusjoner$status institusjoner <- institusjoner$data # Leser manuell liste over fusjoner institusjonsendringer <- read_tsv("institusjonsendringer.tsv", na ="") # Hjelpefunksjon for å finne siste institusjon hvor det er rekker av fusjoner. # Foreløpig en forenkling som ser bort fra gyldighetsinformasjon i DBH og dato # for sammenslåing. finn_nyeste <- function(aktuell_ny, nye, gamle) { if (! aktuell_ny %in% gamle) { return(aktuell_ny) else { return(finn_nyeste(nye[match(aktuell_ny, gamle)], nye, gamle)) institusjonsendringer <- institusjonsendringer %>% mutate( institusjonskode_nyeste = map_chr( institusjonskode_ny, finn_nyeste, institusjonskode_ny, institusjonskode_gammel ) ) institusjoner <- institusjoner %>% mutate(institusjonskode_nyeste = institusjonsendringer$institusjonskode_nyeste[match(institusjonskode, institusjonsendringer$institusjonskode_gammel)], institusjonskode_nyeste = if_else(is.na(institusjonskode_nyeste), Institusjonskode, institusjonskode_nyeste)) # Behandler metadata og spørringer for utvalg av tabeller ---- tabeller <- tribble(~tab, ~tabell_id, "studiepoeng", 900, "doktorgrader", 101, "publisering", 373, DBH API dokumentasjon Side 14

"utveksling", 142) # Legger til info til spørringer (group_by) tabeller <- full_join(tabeller, tribble( ~ tabell_id, ~ group_by_spørring, 373, list( "Institusjonskode", "Årstall", "Kode for publikasjonsform", "Kode for publiseringskanal", "Kode for type publiseringskanal" ), 142, list( "Institusjonskode", "Årstall", "Type", "Utvekslingsavtale" ), 101, list( "Institusjonskode", "Avdelingskode", "Årstall", "Semester", "Kvalifikasjonskode", "Studieprogramkode", "Finansieringskildekode" ) ), by = "tabell_id") # Bytter ut NULL med list() (p.t. bare aktuelt for group_by) tabeller <- tabeller %>% mutate_all(funs(ifelse(map_lgl(., is.null), map(seq_along(.), ~list()),.))) spørringer <- tabeller %>% pmap(function(tabell_id, group_by_spørring, tab,...) { map(institusjoner$institusjonskode, ~dbh_api_spørring(tabell_id, filter_variabler = "Institusjonskode", filter_kode = "item", filter_verdier =., group_by = group_by_spørring)) %>% DBH API dokumentasjon Side 15

list(.) %>% setnames(., tab) ) %>% unlist(recursive = FALSE) # Laster ned alle tabellene i spørringer/tabeller og skriver til fil walk2(spørringer, names(spørringer), dbh_hent_spørring_til_fil) # Leser tabeller fra fil til minne walk(names(spørringer), ~{ str_c(., c("", "_status")) %>% walk(~assign(., read_tsv(str_c(., ".csv"), na = "", col_types = cols(.default = col_character())), envir =.GlobalEnv)) ) # Sammenligne API-data med leveranse til finansieringssystemet ---- studiepoeng_agg <- studiepoeng %>% filter(str_to_upper(studentkategori) == "S") %>% rename(kategori = `Finmodekode emne`, indikatorverdi = `Ny produksjon egentfin`) %>% mutate(kategori = str_to_upper(kategori), indikatorverdi = parse_number(indikatorverdi)) %>% group_by(årstall, Institusjonskode, kategori) %>% summarise_at("indikatorverdi", sum) %>% ungroup() %>% mutate(indikator = "studiepoeng") utveksling_agg <- utveksling %>% mutate_at(c("type", "Utvekslingsavtale"), str_to_upper) %>% filter(utvekslingsavtale!= "INDIVID") %>% select(årstall, Institusjonskode, Type, kategori = Utvekslingsavtale, indikatorverdi = `Antall totalt`) %>% mutate( indikator = "utveksling", indikatorverdi = parse_number(indikatorverdi), kategori = DBH API dokumentasjon Side 16

) case_when( kategori == "ERASMUS+" & Type == "NORSK" ~ "Erasmus+", TRUE ~ "") doktorgrader_agg <- doktorgrader %>% mutate(indikator = "doktorgrader", kategori = "", indikatorverdi = parse_number(`antall totalt`)) %>% group_by(årstall, Institusjonskode, indikator, kategori) %>% summarise_at("indikatorverdi", sum) %>% ungroup() publisering_agg <- publisering %>% mutate(indikator = "publisering", kategori = "", indikatorverdi = parse_number(publiseringspoeng)) %>% group_by(årstall, Institusjonskode, indikator, kategori) %>% summarise_at("indikatorverdi", sum) %>% ungroup() samlet_agg_17 <- bind_rows(studiepoeng_agg, utveksling_agg, doktorgrader_agg, publisering_agg) %>% filter(årstall == "2017") %>% left_join(select(institusjoner, Institusjonskode, institusjonskode_nyeste), by = "Institusjonskode") %>% group_by(institusjonskode_nyeste, indikator, kategori) %>% summarise_at("indikatorverdi", sum) %>% ungroup() # Les finsysdata-leveranse i Excel til finsys_data source("finsys_data_excel.r") fasit_utvalg <- finsys_data %>% rename(institusjonskode_nyeste = instkode) %>% filter(indikator %in% c("studiepoeng", "utveksling", "doktorgrader", "publisering")) %>% select(institusjonskode_nyeste, indikator, kategori, indikatorverdi) sjekk_fasit <- full_join(samlet_agg_17, fasit_utvalg, by = c("institusjonskode_nyeste", DBH API dokumentasjon Side 17

"indikator", "kategori")) %>% rename(indikatorverdi_api = indikatorverdi.x, indikatorverdi_fasit = indikatorverdi.y) %>% mutate(diff = indikatorverdi_api - indikatorverdi_fasit) avvik_api_fasit <- sjekk_fasit %>% filter(kategori %in% c(letters[1:6], "", "Erasmus+"),!is.na(diff), round(diff, 5)!= 0) %>% left_join(select(institusjoner, institusjonskode_nyeste = Institusjonskode, Institusjonsnavn), by = "institusjonskode_nyeste") %>% arrange(indikator, desc(abs(diff))) export(avvik_api_fasit, "avvik_dbh_api.xlsx") DBH API dokumentasjon Side 18