rapodiff for bsc

This commit is contained in:
Matti Luukkainen
2022-03-22 17:36:07 +02:00
parent 7966d2b7ee
commit 4570d7537d
+117 -25
View File
@@ -1,12 +1,21 @@
/* eslint no-console: 0 */
// depends on nodeproxy running in importer.cs.helsinki.fi, and env RAPO_NODEPROXY (see importer for a proper value)
/*
depends on nodeproxy running in importer.cs.helsinki.fi, and env RAPO_NODEPROXY (see importer for a proper value)
needs also acces to importer db api, uses env IMPORTER_API
known differences in APIs
- rapo does not show students that have graduated
- rapo does not handle the starting year of transfers properly (shows in old staring population)
- rapo show some students incorrectly passive, see https://github.com/UniversityOfHelsinkiCS/oodikone/issues/3521
*/
const axios = require('axios').default
const _ = require('lodash')
const { optimizedStatisticsOf } = require('./services/populations')
const { Student, Transfer } = require('./models')
const token = process.env.RAPO_NODEPROXY
@@ -55,7 +64,31 @@ const getFromOodikone = async (programme, year) => {
.map(s => s.studentNumber)
}
const programme_diff = async (programme, facultyCode, year) => {
const isAcuallyActive = async student => {
const currentSemester = 144
const tokenImporterApi = process.env.IMPORTER_API
const url = `https://importer.cs.helsinki.fi/api/importer/students/${student}/rapo_semester_enrollments?token=${tokenImporterApi}`
const { data } = await axios.get(url)
const terms = data.reduce((all, s) => all.concat(s.terms), []).filter(t => t.semester_code === currentSemester)
const active = terms.filter(t => t.type !== 'NEGLECTED')
return active.length > 0
}
const hasTransferred = async (student, programme) => {
const data = await Student.findByPk(student, {
include: [
{
model: Transfer,
},
],
})
const transferTo = data.transfers.find(t => t.targetcode === programme)
return transferTo !== undefined
}
const programme_diff_year = async (programme, facultyCode, year, brief = false) => {
const oodikoneStudents = await getFromOodikone(programme, year)
const studyrightStartDate = `${year}-08-01`
@@ -82,34 +115,93 @@ const programme_diff = async (programme, facultyCode, year) => {
const onlyInOodikone = _.difference(oodikoneStudents, rapoStudents)
const onlyInRapo = _.difference(rapoStudents, oodikoneStudents)
const wrongInRapo = []
for (let student of onlyInOodikone) {
const status = await isAcuallyActive(student)
if (status) {
wrongInRapo.push(student)
}
}
const transferred = []
for (let student of onlyInRapo) {
const status = await hasTransferred(student, programme)
if (status) {
transferred.push(student)
}
}
const checkOodikoneOnly = _.difference(onlyInOodikone, wrongInRapo)
const checkRapoOnly = _.difference(onlyInOodikone, wrongInRapo)
console.log('vuosi', year)
console.log('')
console.log('oodikone', oodikoneStudents.length)
console.log('rapo', rapoStudents.length)
console.log('only oodikone', onlyInOodikone.length)
console.log('only rapo', onlyInRapo.length)
console.log('')
/*
console.log('Only in Oodikone:')
console.log(onlyInOodikone.join('\n'))
console.log('Only in Rapo:')
console.log(onlyInRapo.join('\n'))
console.log('')
*/
if (!brief) {
console.log('')
console.log('oodikone', oodikoneStudents.length, ' transferred', transferred.length)
console.log('rapo', rapoStudents.length, ' activeness wrong rapo', wrongInRapo.length)
console.log('only rapo', checkRapoOnly.length)
console.log('only oodikone', checkOodikoneOnly.length)
console.log('')
if (checkRapoOnly.length > 0) {
console.log('Only in Rapo:')
console.log(checkRapoOnly.join('\n'))
}
if (checkOodikoneOnly.length > 0) {
console.log('Only in Oodikone:')
console.log(checkOodikoneOnly.join('\n'))
}
}
if (checkRapoOnly.length + checkOodikoneOnly.length) {
console.log('******************************************************')
}
if (!brief) {
console.log('')
}
}
const programme_diff = async (programme, faculty, brief) => {
console.log('\n', programme)
console.log('--------', '\n')
await programme_diff_year(programme, faculty, 2017, brief)
await programme_diff_year(programme, faculty, 2018, brief)
await programme_diff_year(programme, faculty, 2019, brief)
await programme_diff_year(programme, faculty, 2020, brief)
await programme_diff_year(programme, faculty, 2021, brief)
}
const faculty_diff = async (faculty, programmes, brief) => {
console.log('\n', faculty)
console.log('==')
for (let programme of programmes) {
await programme_diff(programme, faculty, brief)
}
}
const priogrammes_of_faculties = {
H10: ['KH10_001'],
H20: ['KH20_001'],
H30: ['KH30_001', 'KH30_002'],
H40: ['KH40_001', 'KH40_002', 'KH40_003', 'KH40_004', 'KH40_005', 'KH40_006'],
H50: ['KH50_001', 'KH50_002', 'KH50_003', 'KH50_004', 'KH50_005', 'KH50_006', 'KH50_007', 'KH50_008'],
H55: ['KH55_001'],
H60: ['KH60_001'],
H70: ['KH70_001', 'KH70_002', 'KH70_003', 'KH70_004'],
H74: ['KH74_001'],
H80: ['KH80_001', 'KH80_002', 'KH80_003', 'KH80_004'],
H90: ['KH90_001'],
}
const main = async () => {
await programme_diff('KH50_005', 'H50', 2017)
console.log(' ')
await programme_diff('KH50_005', 'H50', 2018)
console.log(' ')
await programme_diff('KH50_005', 'H50', 2019)
console.log(' ')
await programme_diff('KH50_005', 'H50', 2020)
console.log(' ')
await programme_diff('KH50_005', 'H50', 2021)
console.log(' ')
for (let faculty of Object.keys(priogrammes_of_faculties)) {
await faculty_diff(faculty, priogrammes_of_faculties[faculty], true)
}
}
main().then(() => process.exit(0))