Gå til hovedinnhold

Fra FSWS-Studrapp til FS GraphQL API

FSWS-Studrapp er under utfasing, og deler av tjenesten er nå erstattet av FS GraphQL API. Studrapp-tjenesten består av endepunkter som er laget til litt forskjellige formål:

  • Studentdata og grunnlagsdata om undervisning og vurdering
  • Rapportering av godkjent utenlandsopphold til Lånekassen
  • Synkronisering av data mellom FS og timeplanleggingssystemet TP

Studentdata og grunnlagsdata om undervisning og vurdering

Disse endepunktene henter data for en bestemt student og/eller en bestemt termin. Det er som regel mulig å konstruere en GraphQL-spørring som gir omtrent samme data, selv om datatastrukturen kan være litt forskjellig. Under gir vi eksempler for hvert enkelt endepunkt. GraphQL gir imidlertid stor fleksibilitet når det gjelder hvordan du henter dataene. Vi anbefaler at du bruker tid på å sette sammen en spørring som passer ditt behov.

Merk: FS GraphQL API bruker base64-enkodede sammensatte nøkler som IDer. Eksemplene nedenfor viser hvordan du henter disse IDene via oppslag.

For eksempel, for å hente student-ID basert på Feide-brukernavn:

query HentStudentId {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["yngve@spusers.feide.no"]
) {
id
}
}

Eksempel på svar:

{
"data": {
"studenterGittFeideBrukere": [
{
"id": "OTk6MTIzNCw5MDA"
}
]
}
}

Hent data for en student

Dette endepunktet henter grunnleggende informasjon om en student identifisert med brukernavn, inkludert personalia, studieprogram, semesterregistreringer, fakturaer og vurderingsmeldinger. For å hente samme data via FS GraphQL API kan du bruke spørringen studenterGittFeideBrukere. Du kan legge til eller fjerne nøstede felt etter behov.

query HentStudentdata {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["18628790120@spusers.feide.no"]
) {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
institusjonsEpost
privatEpost
mobilTelefon {
landnummer
nummer
}
fodselsnummer
fodselsdato
postadresse {
gate
postnummerOgSted
}
}
programStudieretter {
nodes {
studieprogram {
kode
}
studentstatus {
kode
}
}
}
semesterregistreringer(
filter: {erSemesterregistrert: true}
) {
nodes {
termin {
betegnelse {
kode
}
arstall
}
erSemesterregistrert
harBetaltSemesteravgiftV2
}
}
fakturaerForInnevarendeTermin {
termin {
betegnelse {
kode
}
arstall
}
betal
}
vurderingsmeldinger {
vurderingsenhet {
emne {
kode
}
vurderingsperiode {
gjelderTermin {
betegnelse {
kode
}
arstall
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"studenterGittFeideBrukere": [
{
"studentnummer": "070056",
"personProfil": {
"navn": {
"fornavn": "Anders",
"etternavn": "Adelsen"
},
"institusjonsEpost": null,
"privatEpost": null,
"mobilTelefon": {
"landnummer": "+46",
"nummer": "703796001"
},
"fodselsnummer": "18628790120",
"fodselsdato": "1987-12-18",
"postadresse": {
"gate": "Forskningsveien 3 B",
"postnummerOgSted": "0260 OSLO"
}
},
"programStudieretter": {
"nodes": [
{
"studieprogram": {
"kode": "AMH-MUS1"
},
"studentstatus": {
"kode": "AKTIV"
}
},
{
"studieprogram": {
"kode": "BA-SVF"
},
"studentstatus": {
"kode": "SLUTTET"
}
}
]
},
"semesterregistreringer": {
"nodes": [
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2018
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": true
},
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2019
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": true
},
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2020
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": false
}
]
},
"fakturaerForInnevarendeTermin": [
{
"termin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2025
},
"betalt": true
},
{
"termin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2025
},
"betalt": false
}
],
"vurderingsmeldinger": [
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-EXFAC"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2019
}
}
}
},
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-EXFAC"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2020
}
}
}
},
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-MUS1006"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2023
}
}
}
}
]
}
]
}
}

Hent aktive emner

Dette endepunktet henter emner som har undervisning i en gitt termin. For å hente samme data via FS GraphQL API kan du bruke spørringen undervisningsterminerForEmner filtrert på termin. Du må først hente termin-ID via terminerGittTerminkoder.

Steg 1: Hent termin-ID

query HentTerminId {
terminerGittTerminkoder(
eierOrganisasjonskode: "1234"
terminkoder: [{
arstall: 2023
betegnelse: "HØST"
}]
) {
id
}
}

Eksempel på svar:

{
"data": {
"terminerGittTerminkoder": [
{
"id": "MTE2OjEyMzQsMjAyMyxIw5hTVA"
}
]
}
}

Steg 2: Hent undervisningsterminer for emner i terminen

query HentAktiveEmner {
undervisningsterminerForEmner(
filter: {
eierOrganisasjonskode: "1234"
gjelderForTerminer: ["MTE2OjEyMzQsMjAxNSxIw5hTVA"]
}
first: 5
) {
nodes {
terminnummer
emne {
kode
versjonskode
navnAlleSprak {
nb
}
studieansvarligOrganisasjonsenhet {
navnAlleSprak {
nb
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"undervisningsterminerForEmner": {
"nodes": [
{
"terminnummer": 1,
"emne": {
"kode": "1BA-111",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Bevegelseslære bokmål"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 2,
"emne": {
"kode": "1BA-111",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Bevegelseslære bokmål"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-113",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Treningslære"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-121",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Idrett og samfunn"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-135",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Ballspill"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
}
]
}
}
}

Hent emner med eksamen

Dette endepunktet henter emner som har vurderingsenheter (eksamener eller andre vurderinger) i en gitt termin. For å hente samme data via FS GraphQL API kan du bruke spørringen vurderingsenheter filtrert på termin. Du må først hente termin-ID via terminerGittTerminkoder (se "Hent aktive emner" over for eksempel).

Hent vurderingsenheter for terminen

query HentEmnerMedEksamen {
vurderingsenheter(
filter: {
eierOrganisasjonskode: "1234"
terminer: ["MTE2OjEyMzQsMjAyNCxWw4VS"]
}
) {
nodes {
emne {
kode
versjonskode
navnAlleSprak {
nb
}
studieansvarligOrganisasjonsenhet {
navnAlleSprak {
nb
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"vurderingsenheter": {
"nodes": [
{
"emne": {
"kode": "SEAN1",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean1"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "SEAN2",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean2"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "SEAN2",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean2"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "VK9C",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Vk9c"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "FS9"
}
}
}
}
]
}
}
}

Du kan også filtrere på andre kriterier ved å bruke emner, vurderingsoppbygningsdeler, vurderingsperioder eller reelleVurderingsperioder i filteret.

Hent eksamener for en student

REST-endepunktet studrapp/eksamen henter eksamensinformasjon (datoer, frister, varighet, rom etc.) for en student i en gitt termin. FS GraphQL API tilbyr to tilnærminger for å hente tilsvarende data. Velg den som passer best for ditt behov.

Viktige forskjeller fra studrapp

Datastruktur — flat liste vs. hierarki

REST-endepunktet returnerer data i et hierarki: emne → ordninger → eksamensdeler → deldager. I GraphQL returneres en flat liste. Feltet vurderingsdeltypevurderingsenhet klassifiserer hvert element:

vurderingsdeltypeBeskrivelseTilsvarer i studrapp
HELHETVurderingsordning (helhet)ordninger[].navn
DELDel av en vurderingsordningordninger[].eksamensdeler[].navn
DELDAGDagsdel av en eksamenordninger[].eksamensdeler[].deldager[].navn

Konsumenter som trenger emne-gruppering (slik det gamle endepunktet returnerte) grupperer på emne.kode og vurderingsperiode på klientsiden.

Feltmapping: studrapp → GraphQL

Eksamensinformasjon som lå direkte på eksamensdel-objektet i studrapp finnes nå under vurderingsenhet:

studrapp (eksamensdel)GraphQL (vurderingsenhet)
dato-eksamenvurderingsvarighet.eksamensdatoer.startDato
tid-eksamenvurderingsvarighet.startklokkeslett
varighet-timervurderingsvarighet.beregnetSluttTidspunkt - beregnetStartTidspunkt
dato-innleveringvurderingsvarighet.innleveringsfrist.dato
tid-innleveringvurderingsvarighet.innleveringsfrist.klokkeslett
dato-uttak / tid-uttakvurderingsvarighet.uttakstidspunkt.dato / .klokkeslett
dato-frist-oppgavetittelfristOppgavetittel
kommentar-studentwebmerknadForStudent.nb (flerspråklig)
trekkfristtrekkfrist
frist-sensursensurinformasjon.sensurfrist
dato-klagesensurinformasjon.klagefrist

GraphQL tilbyr også beregnetStartTidspunkt og beregnetSluttTidspunkt som ferdigberegnede tidspunkter med tidssone.

Semesterfilter — finne termin-ID

REST-endepunktet tar år og semester som path-parameter. I GraphQL brukes termin-IDer for filtrering. For å finne termin-ID gitt årstall og terminkode, bruk terminerGittTerminkoder:

query HentTerminId {
terminerGittTerminkoder(
eierOrganisasjonskode: "1234"
terminkoder: [{
arstall: 2023
betegnelse: "HØST"
}]
) {
id
}
}

Eksempel på svar:

{
"data": {
"terminerGittTerminkoder": [
{
"id": "MTE2OjEyMzQsMjAyMyxIw5hTVA"
}
]
}
}

Bruk den returnerte ID-en som verdi i terminer-filteret i eksemplene under. Filteret er valgfritt, men anbefales sterkt for ytelse da det filtrerer på SQL-nivå.

Tilnærming A: vurderingsdata

Feltet vurderingsdataStudentVedLarested gir mest detaljert eksamensinformasjon, inkludert eksamensrom, alle frister og varighet. Dataene er basert på en dedikert view som kobler student, vurderingsordning og vurderingsenhet.

Når passer denne tilnærmingen?

  • Du trenger detaljert eksamensinformasjon: rom, frister, varighet, uttakstidspunkt
  • Du vil ha all informasjon samlet per vurderingskombinasjon
query HentEksamenerForStudent {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["11616090366@spusers.feide.no"]
) {
vurderingsdata(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
edges {
node {
vurderingsdeltype

emne {
kode
navnAlleSprak { nb }
}

vurderingsperiode {
arstall
navnAlleSprak { nb }
}

vurderingsenhet {
trekkfrist
fristOppgavetittel
vurderingsvarighet {
eksamensdatoer {
startDato
sluttDato
}
startklokkeslett
innleveringsfrist {
dato
klokkeslett
}
uttakstidspunkt {
dato
klokkeslett
}
beregnetStartTidspunkt
beregnetSluttTidspunkt
}
merknadForStudent { nb }
sensurinformasjon {
sensurfrist
klagefrist
}
}

eksamensavvikling {
rom {
kode
bygning {
kode
}
}
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"studenterGittFeideBrukere": [
{
"vurderingsdata": {
"edges": [
{
"node": {
"vurderingsdeltype": "HELHET",
"emne": {
"kode": "KRH101",
"navnAlleSprak": {
"nb": "Hagearbeidets klassikere og det florale samfunn"
}
},
"vurderingsperiode": {
"arstall": 2023,
"navnAlleSprak": {
"nb": "2023 HØST"
}
},
"vurderingsenhet": {
"trekkfrist": "2023-09-01T00:00:00.000+02:00",
"fristOppgavetittel": null,
"vurderingsvarighet": {
"eksamensdatoer": {
"startDato": "2023-10-01",
"sluttDato": "2023-10-01"
},
"startklokkeslett": null,
"innleveringsfrist": null,
"uttakstidspunkt": null,
"beregnetStartTidspunkt": "2023-10-01T00:00:00.000+02:00",
"beregnetSluttTidspunkt": null
},
"merknadForStudent": null,
"sensurinformasjon": {
"sensurfrist": null,
"klagefrist": null
}
},
"eksamensavvikling": null
}
}
]
}
}
]
}
}

Tilnærming B: resultater og vurderingsmeldingerV2

Feltene resultater og vurderingsmeldingerV2StudentVedLarested gir resultater og meldinger separat. Begge er connections med termin-filtrering, og begge har tilgang til eksamensinformasjon via vurderingsenhet.

Når passer denne tilnærmingen?

  • Du ønsker resultater og vurderingsmeldinger separat
  • Du vil bruke stabile felt som allerede er i beta
query HentResultaterOgMeldingerForStudent {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["11616090366@spusers.feide.no"]
) {
resultater(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
nodes {
emne {
kode
navnAlleSprak { nb }
}
vurderingsenhet {
vurderingsdeltype
vurderingsperiode {
gjelderTermin {
betegnelse { kode }
arstall
}
}
}
karakter { bokstavEllerUgradert }
erOppnadd
erGyldig
}
}
vurderingsmeldingerV2(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
nodes {
emne {
kode
navnAlleSprak { nb }
}
vurderingsenhet {
vurderingsdeltype
trekkfrist
vurderingsperiode {
gjelderTermin {
betegnelse { kode }
arstall
}
}
vurderingsvarighet {
eksamensdatoer { startDato }
startklokkeslett
}
sensurinformasjon { sensurfrist }
}
}
}
}
}

Eksempel på svar:

{
"data": {
"studenterGittFeideBrukere": [
{
"resultater": {
"nodes": []
},
"vurderingsmeldingerV2": {
"nodes": [
{
"emne": {
"kode": "KRH101",
"navnAlleSprak": {
"nb": "Hagearbeidets klassikere og det florale samfunn"
}
},
"vurderingsenhet": {
"vurderingsdeltype": "HELHET",
"trekkfrist": "2023-09-01T00:00:00.000+02:00",
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2023
}
},
"vurderingsvarighet": {
"eksamensdatoer": {
"startDato": "2023-10-01"
},
"startklokkeslett": null
},
"sensurinformasjon": {
"sensurfrist": null
}
}
}
]
}
}
]
}
}

resultater returnerer protokollførte vurderingsresultater med karakter og bestått-status. vurderingsmeldingerV2 returnerer studentens vurderingsmeldinger med tilgang til eksamensinformasjon via vurderingsenhet.

Begge feltene er connections (med nodes-paginering) som returnerer flate lister. Konsumenter som trenger emne-gruppering grupperer på emne.kode og vurderingsperiode på klientsiden.

Hent studenter med endringer siden angitt tid

I REST-APIet returnerte dette endepunktet brukernavn for studenter med endringer siden et angitt tidspunkt. I GraphQL-APIet brukes studenthendelser for å hente hendelser relatert til studenter. Tidsfiltrering er ikke tilgjengelig, men du kan være mer spesifikk på hvilke typer hendelser du er interessert i ved å filtrere på eierOrganisasjonskode, hendelsestype og studieniva.

For å følge med på nye hendelser anbefales det å bruke paginering med edges og cursor, og lagre endCursor-verdien for å hente nye hendelser siden sist. Les mer om hendelser og paginering i dokumentasjonen for hendelser.

query HentStudentHendelser {
studenthendelser(
filter: {
eierOrganisasjonskode: "1234"
hendelsestype: [
SEMESTERREGISTRERING_STATUS_BET_OK
STUDENTKORT_UTGATT
ENDRET_NAVN
]
}
) {
pageInfo {
hasNextPage
endCursor
}
edges {
cursor
node {
hendelsestype
student {
personProfil {
feideBruker
}
}
}
}
}
}

Merk: Det finnes mange andre hendelsestyper tilgjengelig. Du kan filtrere på så mange hendelsestyper du er interessert i.

Eksempel på svar:

{
"data": {
"studenthendelser": {
"pageInfo": {
"hasNextPage": false,
"endCursor": "WzEyMzQsMTEyXQ"
},
"edges": [
{
"cursor": "WzEyMzQsMTNd",
"node": {
"hendelsestype": "SEMESTERREGISTRERING_STATUS_BET_OK",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMjFd",
"node": {
"hendelsestype": "SEMESTERREGISTRERING_STATUS_BET_OK",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsNDFd",
"node": {
"hendelsestype": "SEMESTERREGISTRERING_STATUS_BET_OK",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMTExXQ",
"node": {
"hendelsestype": "SEMESTERREGISTRERING_STATUS_BET_OK",
"student": {
"personProfil": {
"feideBruker": "14578990047@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMTEyXQ",
"node": {
"hendelsestype": "SEMESTERREGISTRERING_STATUS_BET_OK",
"student": {
"personProfil": {
"feideBruker": "04577690095@spusers.feide.no"
}
}
}
}
]
}
}
}

Hent studieprogram

Dette endepunktet henter aktive studieretter for en gitt student idetifisert med brukernavn. For å hente samme data via FS GraphQL API kan du bruke spørringen studenterGittFeideBrukere. Du kan hente studentens aktive studieretter via feltet programStudieretter. Eksempel:

query HentStudieprogram {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["yngve@spusers.feide.no"]
) {
programStudieretter {
edges {
node {
studieprogram {
kode
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"studenterGittFeideBrukere": [
{
"programStudieretter": {
"edges": [
{
"node": {
"studieprogram": {
"kode": "MEDISIN"
}
}
}
]
}
}
]
}
}

Hent undervisning for en student

Dette endepunktet henter undervisningsaktiviteter for en student basert på år og termin. For å hente samme data via FS GraphQL API trenger du student-ID og termin-ID (se "Hent data for en student" og "Hent aktive emner" for hvordan du henter disse).

Du kan deretter hente studentens emnestudieretter med undervisningsaktiviteter som nøstet data:

query HentUndervisningForStudent {
emneStudieretter(
filter: {
eierOrganisasjonskode: "1234"
studenter: ["OTk6MTIzNCwyMzY0MQ"]
terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"]
}
) {
nodes {
emne {
kode
versjonskode
}
terminnummer
fellesundervisning {
nodes {
kode
undervisningsform {
kode
}
}
}
undervisningspartiPlasseringer {
undervisningsaktivitet {
kode
undervisningsform {
kode
}
partinummer
}
}
}
}
}

Eksempel på svar:

{
"data": {
"emneStudieretter": {
"nodes": [
{
"emne": {
"kode": "PRA1001",
"versjonskode": "1"
},
"terminnummer": 1,
"fellesundervisning": {
"nodes": [
{
"kode": "1",
"undervisningsform": {
"kode": "FOR"
}
}
]
},
"undervisningspartiPlasseringer": [
{
"undervisningsaktivitet": {
"kode": "0-P-5",
"undervisningsform": {
"kode": "ALP-PRAKS"
},
"partinummer": "5"
}
}
]
},
{
"emne": {
"kode": "HEIS100",
"versjonskode": "1"
},
"terminnummer": 1,
"fellesundervisning": {
"nodes": [
{
"kode": "4",
"undervisningsform": {
"kode": "FOR"
}
},
{
"kode": "5",
"undervisningsform": {
"kode": "FOR"
}
}
]
},
"undervisningspartiPlasseringer": [
{
"undervisningsaktivitet": {
"kode": "1-1",
"undervisningsform": {
"kode": "LAB"
},
"partinummer": "1"
}
}
]
}
]
}
}
}

Feltet fellesundervisning returnerer undervisningsaktiviteter som er felles for alle studenter (tilsvarer "fellesundervisning" i det gamle APIet). Feltet undervisningspartiPlasseringer returnerer aktiviteter der studenten er plassert i et parti (tilsvarer "partiundervisning" i det gamle APIet).

Hent undervisningsaktiviteter for et emne

Dette endepunktet henter undervisningsaktiviteter for et gitt emne i et gitt semester. For å hente samme data via FS GraphQL API kan du bruke spørringen undervisningsaktiviteter filtrert på emne og termin. Du må først hente emne-ID og termin-ID (se "Hent aktive emner" for hvordan du henter termin-ID).

Steg 1: Hent emne-ID

query HentEmneId {
emnerGittEmnekoder(
eierInstitusjonsnummer: "1234"
emnekoder: {
emnekode: "ECON1230"
versjonskode: "1"
}
) {
id
}
}

Eksempel på svar:

{
"data": {
"emnerGittEmnekoder": [
{
"id": "MjA6MTIzNCwxODUsRUNPTjEyMzAsMQ"
}
]
}
}

Steg 2: Hent undervisningsaktiviteter

query HentUndervisningsaktiviteter {
undervisningsaktiviteter(
filter: {
eierOrganisasjonskode: "1234"
emner: ["MjA6MTIzNCwxODUsRUNPTjEyMzAsMQ"]
terminer: ["MTE2OjEyMzQsMjAwNCxIw5hTVA"]
}
first: 5
) {
nodes {
id
kode
navnAlleSprak {
nb
}
timerPerUke
timeplan {
nodes {
ukedag {
ukedagnummer
}
bygning {
kode
}
rom {
kode
kapasitet {
undervisning
eksamen
}
}
klokkeslett {
fra
til
}
undervisningsuker {
ukenummer
harUndervisning
arstall
}
}
}
}
}
}

Eksempel på svar:

{
"data": {
"undervisningsaktiviteter": {
"nodes": [
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDA",
"kode": "0",
"navnAlleSprak": {
"nb": "Undervisning"
},
"timerPerUke": null,
"timeplan": {
"nodes": [
{
"ukedag": null,
"bygning": null,
"rom": null,
"klokkeslett": null,
"undervisningsuker": []
},
{
"ukedag": null,
"bygning": null,
"rom": null,
"klokkeslett": null,
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDE",
"kode": "1",
"navnAlleSprak": {
"nb": "Forelesninger"
},
"timerPerUke": null,
"timeplan": {
"nodes": []
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode": "1-1",
"navnAlleSprak": {
"nb": "Rettferdighet"
},
"timerPerUke": 2,
"timeplan": {
"nodes": [
{
"ukedag": {
"ukedagnummer": 1
},
"bygning": {
"kode": "AB"
},
"rom": {
"kode": "300",
"kapasitet": {
"undervisning": 30,
"eksamen": 10
}
},
"klokkeslett": {
"fra": "00:00:00+18:00",
"til": "00:00:00+18:00"
},
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMg",
"kode": "1-2",
"navnAlleSprak": {
"nb": "Fordeling"
},
"timerPerUke": 4,
"timeplan": {
"nodes": [
{
"ukedag": {
"ukedagnummer": 2
},
"bygning": {
"kode": "ABU"
},
"rom": null,
"klokkeslett": {
"fra": "00:00:00+18:00",
"til": "00:00:00+18:00"
},
"undervisningsuker": []
},
{
"ukedag": {
"ukedagnummer": 4
},
"bygning": {
"kode": "AUDMAX"
},
"rom": {
"kode": "AUDMAX",
"kapasitet": {
"undervisning": 500,
"eksamen": 300
}
},
"klokkeslett": {
"fra": "00:00:00+18:00",
"til": "00:00:00+18:00"
},
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDI",
"kode": "2",
"navnAlleSprak": {
"nb": "Gruppeundervisning"
},
"timerPerUke": null,
"timeplan": {
"nodes": []
}
}
]
}
}
}

Rapportering av godkjent utenlandsopphold til Lånekassen

Dette endepunktet brukes kun av Lånekassen. Migrering til GraphQL vil skje i samarbeid med dem.

Synkronisering av data mellom FS og timeplanleggingssystemet TP

Disse endepunktene brukes av timeplanleggingssystemet TP (ved UiO) for å synkronisere timeplandata tilbake til FS. Det finnes to varianter:

POST oppdater_undakt

Tar inn institusjonsnr og json (som form-parameter). JSON-objektet inneholder en undervisningsaktivitet identifisert enten med TP-id eller med parametrene årstall+termin+emnekode+versjonskode+terminnr+aktivitetkode, samt en liste med timeplanoppføringer som skal oppdateres i FS.

For hver timeplanoppføring oppdaterer endepunktet:

  • Timeplan: ukedag, klokkeslett, start-/sluttdato, undervisningsuker, obligatorisk oppmøte, timeplanaktivitetsnavn
  • Rom: bygningskode og romkode
  • Roller: personroller knyttet til timeplanoppføringen

POST oppdater_undervisningsaktiviteter

Tar inn arstall, terminkode og emnekode som form-parametre. Endepunktet henter alle undervisningsaktiviteter for emnet fra FS, slår opp tilhørende timeplandata fra TP sitt API, og oppdaterer FS med dataene fra TP.

Migrering til FS GraphQL API

Funksjonaliteten i disse endepunktene kan erstattes med en rekke GraphQL-mutasjoner.

Slå opp IDer

Mutasjonene nedenfor krever base64-enkodede IDer som input. Her vises hvordan du finner de ulike IDene du trenger.

Undervisningsenhet og undervisningsaktivitet — se "Hent undervisningsaktiviteter for et emne" lenger opp for hvordan du finner disse.

Rom — slå opp rom filtrert på organisasjon:

query HentRom {
rom(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
bygning {
id
kode
}
kapasitet {
undervisning
eksamen
}
}
}
}

Eksempel på svar:

{
"data" : {
"rom" : {
"nodes" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A",
"bygning" : {
"id" : "NjoxMjM0LFNZREg",
"kode" : "SYDH"
},
"kapasitet" : {
"undervisning" : null,
"eksamen" : 5
}
} ]
}
}
}

Fag — slå opp fag:

query HentFag {
fag(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
navnAlleSprak {
nb
}
}
}
}

Eksempel på svar:

{
"data" : {
"fag" : {
"nodes" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR",
"navnAlleSprak" : {
"nb" : "Akvakultur"
}
} ]
}
}
}

Roller — slå opp roller som gjelder undervisning:

query HentRoller {
fsRoller(
filter: {
eierOrganisasjonskode: "1234"
gjelderUndervisning: true
}
first: 10
) {
nodes {
id
kode
}
}
}

Eksempel på svar:

{
"data" : {
"fsRoller" : {
"nodes" : [ {
"id" : "OTE6MTIzNCxBU1NJU1RFTlQ",
"kode" : "ASSISTENT"
}, {
"id" : "OTE6MTIzNCxGQUdBTlNW",
"kode" : "FAGANSV"
}, {
"id" : "OTE6MTIzNCxGT1JMRVM",
"kode" : "FORLES"
}, {
"id" : "OTE6MTIzNCxHUlVMRUQ",
"kode" : "GRULED"
} ]
}
}
}

Personprofil (for roller) — slå opp fagperson med personløpenummer:

query HentFagperson {
fagpersonerGittPersonlopenumre(
eierOrganisasjonskode: "1234"
personlopenumre: ["883"]
) {
id
personProfil {
id
navn {
fornavn
etternavn
}
}
}
}

Eksempel på svar:

{
"data" : {
"fagpersonerGittPersonlopenumre" : [ {
"id" : "MzE6MTIzNCw4ODM",
"personProfil" : {
"id" : "NzY6MTIzNCw4ODM",
"navn" : {
"fornavn" : "Njål",
"etternavn" : "Øye"
}
}
} ]
}
}

Det er personProfil.id som brukes som personProfilId i rolle-mutasjonene.

Undervisningsform og undervisningsdisiplin:

query HentUndervisningsformerOgDisipliner {
undervisningsformer(
filter: { eierOrganisasjonskode: "1234" }
first: 5
) {
nodes {
id
kode
}
}
undervisningsdisipliner(
filter: { eierOrganisasjonskode: "1234" }
first: 5
) {
nodes {
id
kode
}
}
}

Eksempel på svar:

{
"data" : {
"undervisningsformer" : {
"nodes" : [ {
"id" : "Mjk2OjEyMzQsQURPUFI",
"kode" : "ADOPR"
}, {
"id" : "Mjk2OjEyMzQsQUxQLVBSQUtT",
"kode" : "ALP-PRAKS"
} ]
},
"undervisningsdisipliner" : {
"nodes" : [ {
"id" : "Mjk3OjEyMzQsQUxQLVBSQUtT",
"kode" : "ALP-PRAKS"
}, {
"id" : "Mjk3OjEyMzQsQkFSTkVWRVJO",
"kode" : "BARNEVERN"
} ]
}
}
}

Opprette undervisningsaktivitet

mutation OpprettUndervisningsaktiviteter {
opprettUndervisningsaktiviteter(
input: {
undervisningsenhetId: "MTIxOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwx"
aktivitetskode: "X-3"
navnNb: "Forelesning"
navnNn: "Førelesning"
navnEn: "Lecture"
antallPlasser: 100
parentId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDA"
rekkefolgenummer: 10
kanPubliseres: true
underliggendeAktiviteterErEkvivalente: false
kanAvlysesVedForFaaSokere: false
tilbysSomFjernundervisning: false
skalEksporteresTilLms: true
skalEksporteresTilTimeplansystem: true
undervisningsformId: "Mjk2OjEyMzQsQURPUFI"
undervisningsdisiplinId: "Mjk3OjEyMzQsQkFSTkVWRVJO"
undervisningsparti: {
partinummer: "1"
studentKanMeldeSegPaAktivitet: true
}
}
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPlasser
erLukket
kanPubliseres
skalEksporteresTilTimeplansystem
skalEksporteresTilLms
timerPerUke
undervisningsform {
id
kode
}
disiplin {
id
kode
}
}
errors {
__typename
... on Error {
message
}
}
}
}

Eksempel på svar:

{
"data" : {
"opprettUndervisningsaktiviteter" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLFgtMw",
"kode" : "X-3",
"navnAlleSprak" : {
"nb" : "Forelesning",
"nn" : "Førelesning",
"en" : "Lecture"
},
"antallPlasser" : 100,
"erLukket" : false,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true,
"skalEksporteresTilLms" : true,
"timerPerUke" : null,
"undervisningsform" : {
"id" : "Mjk2OjEyMzQsQURPUFI",
"kode" : "ADOPR"
},
"disiplin" : {
"id" : "Mjk3OjEyMzQsQkFSTkVWRVJO",
"kode" : "BARNEVERN"
}
} ],
"errors" : null
}
}
}

Oppdatere undervisningsaktivitet

Oppdaterer flere egenskaper på en undervisningsaktivitet i én operasjon. Merk: Bruker navnAlleSprak (med nb, nn, en) i stedet for separate navnNb/navnNn/navnEn-felt.

mutation OppdaterUndervisningsaktiviteter {
oppdaterUndervisningsaktiviteter(
input: {
id: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
navnAlleSprak: {
nb: "Rettferdighet"
nn: "Rettferd"
en: "Justice"
}
antallPlasser: 50
kanPubliseres: true
}
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPlasser
erLukket
kanPubliseres
skalEksporteresTilTimeplansystem
skalEksporteresTilLms
timerPerUke
undervisningsform {
id
kode
}
disiplin {
id
kode
}
}
errors {
__typename
... on Error {
message
}
}
}
}

Eksempel på svar:

{
"data" : {
"oppdaterUndervisningsaktiviteter" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1",
"navnAlleSprak" : {
"nb" : "Rettferdighet",
"nn" : "Rettferd",
"en" : "Justice"
},
"antallPlasser" : 50,
"erLukket" : false,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true,
"skalEksporteresTilLms" : false,
"timerPerUke" : 2,
"undervisningsform" : {
"id" : "Mjk2OjEyMzQsRk9S",
"kode" : "FOR"
},
"disiplin" : {
"id" : "Mjk3OjEyMzQsRkVMTEVT",
"kode" : "FELLES"
}
} ],
"errors" : null
}
}
}

Andre mutasjoner for undervisningsaktiviteter

Enkeltegenskaper kan også oppdateres med mer spesialiserte mutasjoner:

MutasjonBeskrivelse
endreUndervisningsaktivitetNavnEndre navn (nb/nn/en)
endreUndervisningsaktivitetHierarkiEndre parentId og ekvivalens
endreOpptakskonfigurasjonForUndervisningsaktiviteterEndre antallPlasser, erLukket, kanAvlysesVedForFaaSokere
endreUndervisningskonfigurasjonForUndervisningsaktiviteterEndre undervisningsform, disiplin, timerPerUke m.m.
angiLmsKonfigurasjonForUndervisningsaktiviteterEndre LMS-eksport og rommal
endreRekkefolgenummerForUndervisningsaktivitetEndre rekkefølgenummer
godkjennUndervisningsaktivitetForPublisering / fjernGodkjenningAvUndervisningsaktivitetForPubliseringStyre publisering
godkjennEksportAvUndervisningsaktiviteterTilTimeplansystem / fjernGodkjenningForEksportAvUndervisningsaktiviteterTilTimeplansystemStyre eksport til TP
slettUndervisningsaktiviteterSlette undervisningsaktiviteter

Eksempel — endre navn:

mutation EndreNavn {
endreUndervisningsaktivitetNavn(
input: [
{
id: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
navnAlleSprak: {
nb: "Rettferdighet"
nn: "Rettferd"
en: "Justice"
}
}
]
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPlasser
kanPubliseres
skalEksporteresTilTimeplansystem
}
errors {
__typename
... on TerminErSperretForEndringAvUndervisningsaktiviteter {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"endreUndervisningsaktivitetNavn" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1",
"navnAlleSprak" : {
"nb" : "Rettferdighet",
"nn" : "Rettferd",
"en" : "Justice"
},
"antallPlasser" : 50,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true
} ],
"errors" : null
}
}
}

Opprette timeplan

Merk: Klokkeslett må angis i RFC3339-format (f.eks. 10:00:00+01:00).

mutation OpprettTimeplaner {
opprettTimeplaner(
input: {
undervisningsaktivitetsId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDE"
timeplannummer: 1
ukedag: MANDAG
antallPlasser: 30
klokkeslettFra: "10:00:00+01:00"
klokkeslettTil: "12:00:00+01:00"
harObligatoriskOppmote: true
rom: ["OTI6MTIzNCxBLFNZREg"]
fag: ["MzA6MTIzNCxBS1ZBS1VMVFVS"]
navnAlleSprak: { und: "Forelesning i auditorium" }
}
) {
timeplaner {
id
timeplannummer
ukedag {
ukedagnummer
}
klokkeslett {
fra
til
}
harObligatoriskOppmote
navnAlleSprak {
und
}
rom {
id
kode
}
fag {
id
kode
}
undervisningsaktivitet {
id
kode
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"opprettTimeplaner" : {
"timeplaner" : [ {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1,
"ukedag" : null,
"klokkeslett" : {
"fra" : "10:00:00+01:00",
"til" : "12:00:00+01:00"
},
"harObligatoriskOppmote" : true,
"navnAlleSprak" : {
"und" : "Forelesning i auditorium"
},
"rom" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A"
} ],
"fag" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR"
} ],
"undervisningsaktivitet" : null
} ],
"errors" : null
}
}
}

Endre timeplan

mutation EndreTimeplan {
endreTimeplan(
input: [
{
id: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMSwx"
ukedag: MANDAG
klokkeslettFra: "08:15:00+01:00"
klokkeslettTil: "10:00:00+01:00"
oppmoteErObligatorisk: false
timeplanaktivitetsnavn: "Forelesning"
}
]
) {
undervisningstimeplaner {
id
timeplannummer
ukedag {
ukedagnummer
}
klokkeslett {
fra
til
}
harObligatoriskOppmote
navnAlleSprak {
und
}
rom {
kode
bygning {
kode
}
}
undervisningsaktivitet {
id
kode
}
undervisningsform {
id
kode
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"endreTimeplan" : {
"undervisningstimeplaner" : [ {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMSwx",
"timeplannummer" : 1,
"ukedag" : {
"ukedagnummer" : 1
},
"klokkeslett" : {
"fra" : "08:15:00+01:00",
"til" : "10:00:00+01:00"
},
"harObligatoriskOppmote" : false,
"navnAlleSprak" : {
"und" : "Forelesning"
},
"rom" : [ ],
"undervisningsaktivitet" : {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1"
},
"undervisningsform" : null
} ],
"errors" : null
}
}
}

Slette timeplan

mutation SlettTimeplan {
slettTimeplan(
input: { id: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ" }
) {
ids
errors {
__typename
... on Error {
message
}
}
}
}

Eksempel på svar:

{
"data" : {
"slettTimeplan" : {
"ids" : [ "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ" ],
"errors" : null
}
}
}

Legge til / fjerne rom på timeplan

mutation LeggTilRom {
leggTilRomPaTimeplaner(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
romIder: ["OTI6MTIzNCxBLFNZREg"]
}
) {
results {
timeplan {
id
timeplannummer
}
rom {
id
kode
bygning {
kode
}
kapasitet {
undervisning
eksamen
}
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"leggTilRomPaTimeplaner" : {
"results" : [ {
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
},
"rom" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A",
"bygning" : null,
"kapasitet" : {
"undervisning" : null,
"eksamen" : 5
}
} ]
} ],
"errors" : null
}
}
}

For å fjerne rom brukes slettRomFraTimeplaner med samme input-struktur (timeplanId + romIder).

Legge til / fjerne fag på timeplan

mutation LeggTilFag {
leggTilFagPaTimeplaner(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
fagIder: ["MzA6MTIzNCxBS1ZBS1VMVFVS"]
}
) {
results {
timeplan {
id
timeplannummer
}
fag {
id
kode
navnAlleSprak {
nb
}
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"leggTilFagPaTimeplaner" : {
"results" : [ {
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
},
"fag" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR",
"navnAlleSprak" : {
"nb" : "Akvakultur"
}
} ]
} ],
"errors" : null
}
}
}

For å fjerne fag brukes slettFagFraTimeplaner med samme input-struktur (timeplanId + fagIder).

Opprette / slette roller på timeplan

mutation OpprettTimeplanroller {
opprettTimeplanroller(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
personProfilId: "NzY6MTIzNCw4ODM"
rolleId: "OTE6MTIzNCxGT1JMRVM"
fraDato: "2026-01-01"
tilDato: "2026-06-30"
}
) {
timeplanroller {
id
fsRolle {
kode
}
fagperson {
id
}
erAktiv
aktivStatus
gyldighetsperiode {
fraDato
tilDato
}
timeplan {
id
timeplannummer
}
}
errors {
__typename
... on RolleIkkeUnikIPerioden {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"opprettTimeplanroller" : {
"timeplanroller" : [ {
"id" : "Mjc2OjEyMzQsODgzLDEx",
"fsRolle" : {
"kode" : "FORLES"
},
"fagperson" : {
"id" : "MzE6MTIzNCw4ODM"
},
"erAktiv" : true,
"aktivStatus" : "AKTIV",
"gyldighetsperiode" : {
"fraDato" : "2026-01-01",
"tilDato" : "2026-06-30"
},
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
}
} ],
"errors" : null
}
}
}

For å fjerne roller brukes slettTimeplanroller. For å endre gyldighetsperiode brukes endreGyldighetsperiodeForTimeplanroller.

Opprette / slette roller på undervisningsaktivitet

mutation OpprettUndervisningsaktivitetsroller {
opprettUndervisningsaktivitetsroller(
input: {
undervisningsaktivitetId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
personProfilId: "NzY6MTIzNCw4ODM"
rolleId: "OTE6MTIzNCxGT1JMRVM"
fraDato: "2026-01-01"
tilDato: "2026-06-30"
}
) {
undervisningsaktivitetsroller {
id
fsRolle {
kode
}
fagperson {
id
}
erAktiv
aktivStatus
gyldighetsperiode {
fraDato
tilDato
}
undervisningsaktivitet {
id
kode
}
}
errors {
__typename
... on RolleIkkeUnikIPerioden {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}

Eksempel på svar:

{
"data" : {
"opprettUndervisningsaktivitetsroller" : {
"undervisningsaktivitetsroller" : [ {
"id" : "Mjc3OjEyMzQsODgzLDEy",
"fsRolle" : {
"kode" : "FAGANSV"
},
"fagperson" : {
"id" : "MzE6MTIzNCw4ODM"
},
"erAktiv" : true,
"aktivStatus" : "AKTIV",
"gyldighetsperiode" : {
"fraDato" : "2026-01-01",
"tilDato" : "2026-06-30"
},
"undervisningsaktivitet" : {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1"
}
} ],
"errors" : null
}
}
}

For å fjerne roller brukes slettUndervisningsaktivitetsroller.

Viktige forskjeller fra studrapp

  • Studrapp-endepunktene gjør alt i én operasjon (timeplan + rom + roller). I GraphQL gjøres dette med separate mutasjoner, men opprettTimeplaner kan opprette en timeplan med rom og fag i én operasjon.
  • Studrapp bruker sammensatte nøkler (institusjonsnr, årstall, terminkode, emnekode, versjonskode, terminnr, aktivitetkode, undplanløpenr). GraphQL bruker base64-enkodede IDer — se "Slå opp IDer" ovenfor.
  • oppdater_undervisningsaktiviteter henter data direkte fra TP sitt API. I en GraphQL-basert løsning kaller TP GraphQL-mutasjonene direkte.
  • GraphQL-mutasjonene dekker også oppretting og sletting av undervisningsaktiviteter og timeplaner, noe studrapp-endepunktene ikke støtter — de kun oppdaterer eksisterende data.
  • For undervisningsaktiviteter kan du velge mellom oppdaterUndervisningsaktiviteter (oppdaterer mange felt i én operasjon) og de mer spesialiserte mutasjonene (oppdaterer enkeltaspekter).