dbosk / automation

Presentation material on automation in (Swedish) HE
1 stars 0 forks source link

Översikt över hur man automatiserar rapportering till Ladok #1

Open dbosk opened 1 year ago

dbosk commented 1 year ago

Automatisk rapportering av resultat från Canvas till Ladok

På KTH har IT-avdelningen implementerat sin egen Canvas-till-Ladok-resultatrapportering. Senast jag tittade på den lämnade den dock en del att önska. Andra lärosäten verkar ha liknande situation, men förhoppningsvis migrerar fler till SUNET:s version så att alla slipper uppfinna hjulet.

Men som alltid när man tvingar dataloger att göra något för hand, så har de inom kort skrivit ett program som gör det åt dem. Jag och några andra lärare som är intresserad av automation har skrivit ihop några egna verktyg. Dessa kan vara användbara för andra lärosäten också, så jag tänkte dela dem här. Eventuellt har de några funktioner som SUNET:s resultatrapportering inte heller har. Exempelvis ställde någon en fråga i maj om hur man kan rapportera resultaten för enskilda seminariegrupper från Canvas till Ladok, med dessa verktyg kan man det. För att åstadkomma det gör man följande:

canvaslms results -c kurs -A uppgiftsgrupp-för-Ladokmodul -G studentgrupp-i-canvas | {gör om canvaskursnamn till bara kurskod} | ladok report -fv

I slutet av texten ska det där förhoppningsvis vara fullt förståeligt.

Läsa ut resultat ur Canvas

Det första verktyget är canvaslms. Det kan användas för att interagera med Canvas. (Det använder sig av Canvas API.) Det är utvecklat för att köras i terminalen, skrivet i Python så det ska fungera på de flesta system.

Installera och konfigurera canvaslms

Vi kan installera det genom att köra

python3 -m pip install -U canvaslms keyrings.alt

Man behöver keyrings.alt för att köra på WSL/Windows.

Första gången man kör det behöver man fixa en logintoken från Canvas. Det räcker med att köra

canvaslms login

och följa instruktionerna som ges. Notera att det där är något som behöver göras en gång och aldrig mer (förrän man byter dator eller liknande).

Använda canvaslms för att exportera resultat

Låt oss titta på den första delen av koden i inledningen.

canvaslms results -c kurs -A uppgiftsgrupp-för-Ladokmodul -G studentgrupp-i-canvas

Denna specificerar vilken kurs vi vill exportera resultat ifrån, -c kurs. Identifieraren “kurs” kan ersättas med vilken del som helst av kursnamnet i Canvas, både det långa och det korta, och det behöver inte matcha hela. I mitt fall kan jag rapportera för alla omgångar av kursen med kurskod DD1310 genom att bara skriva -c DD1310, men om jag bara vill ha årets skriver jag -c “DD1310 HT22” (det är så IT döper våra kurser i Canvas på KTH). (För den tekniske läsaren: -c tar ett reguljärt uttryck som argument.)

I Canvas har jag examinationsuppgifterna grupperade i uppgiftsgrupper, en uppgiftsgrupp per modul i Ladok. Exempelvis LAB1 innehåller en serie med labbar som alla måste vara godkända för att få godkänt betyg rapporterat i Ladok. -A ovan specificerar vilken uppgiftsgrupp som ska rapporteras. Om vi vill rapportera LAB1 så skriver vi -A LAB1. (För den tekniske: Även -A tar ett reguljärt uttryck. När jag vill raportera samtliga labbserier i DD1310, som har ladokmomenten LAB1, LAB2 och LAB3, då skriver jag -A LAB[123]; dessa slås inte ihop, utan det blir ett resultat för LAB1, ett för LAB2 och ett för LAB3.)

Till sist, problemet i någons fråga: Om man inte vill rapportera alla resultat i kursen (samtliga studenter), utan bara för några (exempelvis vid delrapportering). Då kan man använda -G “grupp 1” för att exportera resultaten för studentgruppen som heter “grupp 1” bland grupperna i Canvas. Detta är vanliga grupper i Canvas, inte sektioner, så läraren kan skapa dem utan särskild behörighet.

Kör vi den här raden

canvaslms results -c "DD1310 HT22" -A LAB1 -G "grupp 1"

får vi en CSV-fil (tabbseparerad) som innehåller kolumnerna: kursnamn (DD1310 HT22 i exemplet ovan), ladokmoment (LAB1), studentidentifierare, betyg, inlämnings- eller rättningsdatum, rättande lärare 1, …, rättande lärare N. Studentidentifieraren är vad Canvas kallar “integration ID”, vilket i KTH:s fall är samma som det unika ID varje student har i Ladok. (Därav behöver jag aldrig personnumret för studenten.) Datumet är inlämningsdatum om det finns, annars rättningsdatum om studenten inte har lämnat in något (exempelvis vid muntlig examination). Sist är en lista med alla lärare/assistenter som rättat någon version av inlämningsuppgiften.

Rapportera resultat till Ladok

För att kunna rapportera resultaten vi precis har exporterat från Canvas ovan, behöver vi verktyget ladok.

Installera och ställa in ladok

Detta kan vi göra på följande sätt:

python3 -m pip install -U ladok3

Notera att paketet heter “ladok3” medan kommandot heter “ladok”.

Även här behöver vi logga in. Detta görs en gång för alla, eller tills att man måste byta lösenord.

ladok login

Rapportera resultat

För att rapportera resultat med ladok kan vi köra

... | ladok report -fv

Då kommer ladok att förvänta sig CSV-data som har samma kolumner som de som exporterades av canvaslms ovan. Det man behöver tänka på här är den där delen från ovan {gör om canvaskursnamn till bara kurskod}. canvaslms exporterar namnet på canvasrummet, medan ladok bara bryr sig om kurskoden. Så vi måste göra om rumsnamnet till kurskoden. I exemplet ovan behöver vi köra om “DD1310 HT22” till “DD1310”. En enkel lösning i terminalen är att köra sed “s/ HT22//”, som tar bort “ HT22” och kvar blir då bara kurskoden. Allt som allt blir det då

canvaslms results -c "DD1310 HT22" -A LAB1 -G "grupp 1" | sed “s/ HT22// | ladok report -fv

Vad betyder då -fv? -f betyder att vi vill klarmarkera resultaten. -v betyder att vi vill skriva ut vad som rapporteras, annars skrivs något ut bara om ett fel inträffar. Ett fel som kan inträffa är att studenten redan har ett resultat (plussning är tillåtet på KTH) eller att studenten registrerat avbrott på utbildningen innan resultaten hann rapporteras.

Slutsats

Det vi åstadkommer är att vi kan rapportera resultat från Canvas till Ladok. Då vi kan göra det med ett kommandoradsgränssnitt betyder det att vi kan automatisera det så att det kör i bakgrunden. Jag kör det i bakgrunden några dagar i veckan och får ett mail när det finns något nytt att attestera.

Fördelarna är att studenterna får rätt datum i Ladok, dvs inlämningsdatum om det finns. Vi registrerar även samtliga som deltagit i rättningen. Studenterna får dessutom resultaten med minimalt dröjsmål.

För de tekniskt intresserade

Verktygen finns tillgängliga på GitHub:

En detaljerad översikt av implementationen ges i den dokumenterade källkoden för respektive paket:

dbosk commented 1 year ago

Postad på SUNET:s forum för Canvas & Ladok.

dbosk commented 1 year ago

TL;DR: Vi rapporterar resultat automatiskt, med korrekt datum (inlämningsdatum, individuellt för varje student) korrekt rättande lärare (individuellt för varje student), utan dröjsmål och utan att lyfta ett finger.