Skip to content

Commit 24f966f

Browse files
axelbjoKarl Andin
andauthored
feat(KOPPS-1239): Updated/created import script for handling prerequisites (#268)
* Updated/created script for handling prerequisites * Updated courseSchema and script * removed csv-parser * Updated README and config * Updated README and script * Updated test --------- Co-authored-by: Karl Andin <[email protected]>
1 parent 711db8d commit 24f966f

File tree

6 files changed

+157
-3
lines changed

6 files changed

+157
-3
lines changed

scripts/importData/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,33 @@ IMPORTANT: Call it from the project root!
103103
```sh
104104
./scripts/importSupplementaryInfo.sh ./data/2024-03-07-test.csv
105105
```
106+
107+
## Script to import recommendedPrerequisites directly into MongoB
108+
109+
This script can be used to import a CSV containing recommendedPrerequisites. It does clean `NULL` values.
110+
111+
### Data
112+
113+
The script expects a CSV file
114+
115+
- with a comma `,` as separator.
116+
- without headers
117+
- with the columns specified in the function [readCSV](./index3.js)
118+
119+
```js
120+
headers: [
121+
'courseCode',
122+
'recommendedPrerequisites_sv',
123+
'recommendedPrerequisites_en',
124+
],
125+
```
126+
127+
### Usage
128+
129+
Call `importRecommendedPrerequisites.sh` and pass the path to the file you want to import.
130+
131+
IMPORTANT: Call it from the project root!
132+
133+
```sh
134+
./scripts/importRecommendedPrerequisites.sh ./data/2024-03-07-test.csv
135+
```

scripts/importData/filterEmptyCourseInfos.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const log = require('@kth/log')
2+
13
const filterEmptyCourseInfos = courseInfos => {
24
return courseInfos.filter(
35
({ courseCode, supplementaryInfo_sv, supplementaryInfo_en, courseDisposition_sv, courseDisposition_en }) => {
@@ -11,6 +13,19 @@ const filterEmptyCourseInfos = courseInfos => {
1113
}
1214
)
1315
}
16+
const filterEmptyPrerequisites = courseInfos => {
17+
const EMPTY_VALUES = ['', 'NULL']
18+
19+
return courseInfos.filter(({ courseCode, recommendedPrerequisites_sv, recommendedPrerequisites_en }) => {
20+
if (!courseCode) {
21+
return false
22+
}
23+
if (EMPTY_VALUES.includes(recommendedPrerequisites_sv) && EMPTY_VALUES.includes(recommendedPrerequisites_en)) {
24+
return false
25+
}
26+
return true
27+
})
28+
}
1429

1530
const filterEmptySupplementaryInfos = courseInfos => {
1631
const EMPTY_VALUES = ['', 'NULL']
@@ -29,4 +44,5 @@ const filterEmptySupplementaryInfos = courseInfos => {
2944
module.exports = {
3045
filterEmptyCourseInfos,
3146
filterEmptySupplementaryInfos,
47+
filterEmptyPrerequisites,
3248
}

scripts/importData/index3.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const log = require('@kth/log')
2+
const { filterEmptyPrerequisites } = require('./filterEmptyCourseInfos')
3+
const { handleArrayOfCourseInfos } = require('./handleArrayOfCourseInfos')
4+
const { readCSV, setupLogging, setupDatabase, tryToGetPathToFileFromParams } = require('./utils')
5+
6+
const csvConfig = {
7+
separator: ',',
8+
headers: ['courseCode', 'recommendedPrerequisites_sv', 'recommendedPrerequisites_en'],
9+
}
10+
11+
const handleCSV = async file => {
12+
const rawCSV = await readCSV(file, csvConfig)
13+
14+
log.info(`Extracted ${rawCSV.length} courses over all`)
15+
16+
const filteredList = filterEmptyPrerequisites(rawCSV)
17+
18+
log.info(`Extracted ${filteredList.length} courses with non-empty texts`)
19+
20+
const result = await handleArrayOfCourseInfos(filteredList)
21+
22+
const successful = result.filter(({ success }) => success)
23+
const failed = result.filter(({ success }) => !success)
24+
25+
log.info('-------')
26+
log.info(`Extracted ${rawCSV.length} courses over all`)
27+
log.info(`Extracted ${filteredList.length} courses with non-empty texts`)
28+
log.info(`Handled ${result.length} courseInfos`)
29+
log.info(`${successful.length} successful`)
30+
log.info(`${failed.length} failed`)
31+
log.info('-------')
32+
33+
if (failed.length) {
34+
log.info('Failed attempts:')
35+
log.info(failed)
36+
}
37+
}
38+
39+
const run = () => {
40+
setupLogging()
41+
42+
const pathToFile = tryToGetPathToFileFromParams()
43+
44+
setupDatabase()
45+
46+
handleCSV(pathToFile)
47+
}
48+
49+
run()
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
node --env-file=./scripts/importData/.env ./scripts/importData/index3.js $1

scripts/test/filterEmptyCourseInfos.test.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
const { filterEmptyCourseInfos, filterEmptySupplementaryInfos } = require('../importData/filterEmptyCourseInfos')
1+
const { recommendedPrerequisites_sv } = require('../../server/models/courseSchema')
2+
const {
3+
filterEmptyCourseInfos,
4+
filterEmptySupplementaryInfos,
5+
filterEmptyPrerequisites,
6+
} = require('../importData/filterEmptyCourseInfos')
27

38
const filteredCourseInfos = [
49
{
@@ -61,6 +66,23 @@ const filteredSupplementaryInfos = [
6166
courseDisposition_en: '',
6267
},
6368
]
69+
const filteredPrerequisites = [
70+
{
71+
courseCode: 'chem6002',
72+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_2',
73+
recommendedPrerequisites_en: 'recommendedPrerequisites_en_2',
74+
},
75+
{
76+
courseCode: 'chem6003',
77+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_3',
78+
recommendedPrerequisites_en: 'recommendedPrerequisites_en_3',
79+
},
80+
{
81+
courseCode: 'chem6004',
82+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_4',
83+
recommendedPrerequisites_en: 'NULL',
84+
},
85+
]
6486

6587
const unfilteredCourseInfos = [
6688
...filteredCourseInfos,
@@ -104,6 +126,33 @@ const unfilteredSupplementaryInfos = [
104126
courseDisposition_en: '',
105127
},
106128
]
129+
const unfilteredPrerequisites = [
130+
{
131+
courseCode: 'chem6001',
132+
recommendedPrerequisites_sv: 'NULL',
133+
recommendedPrerequisites_en: '',
134+
},
135+
{
136+
courseCode: 'chem6002',
137+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_2',
138+
recommendedPrerequisites_en: 'recommendedPrerequisites_en_2',
139+
},
140+
{
141+
courseCode: 'chem6003',
142+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_3',
143+
recommendedPrerequisites_en: 'recommendedPrerequisites_en_3',
144+
},
145+
{
146+
courseCode: 'chem6004',
147+
recommendedPrerequisites_sv: 'recommendedPrerequisites_sv_4',
148+
recommendedPrerequisites_en: 'NULL',
149+
},
150+
{
151+
courseCode: 'chem6004',
152+
recommendedPrerequisites_sv: '',
153+
recommendedPrerequisites_en: '',
154+
},
155+
]
107156

108157
describe('filterEmptyCourseInfos', () => {
109158
test('filters courseInfos', () => {
@@ -120,3 +169,10 @@ describe('filterEmptySupplementaryInfos', () => {
120169
expect(result).toEqual(filteredSupplementaryInfos)
121170
})
122171
})
172+
describe('filterEmptyPrerequisites', () => {
173+
test('filters recommendedPrerequisites', () => {
174+
const result = filterEmptyPrerequisites(unfilteredPrerequisites)
175+
176+
expect(result).toEqual(filteredPrerequisites)
177+
})
178+
})

server/models/courseSchema.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,12 @@ module.exports.pre('save', next => {
121121
}
122122
if (this.recommendedPrerequisites_sv) {
123123
if (safeGet(() => this.recommendedPrerequisites_sv)) {
124-
this.supplementaryInfo_sv = sanitize(this.recommendedPrerequisites_sv)
124+
this.recommendedPrerequisites_sv = sanitize(this.recommendedPrerequisites_sv)
125125
}
126126
}
127127
if (this.recommendedPrerequisites_en) {
128128
if (safeGet(() => this.recommendedPrerequisites_en)) {
129-
this.supplementaryInfo_en = sanitize(this.recommendedPrerequisites_en)
129+
this.recommendedPrerequisites_en = sanitize(this.recommendedPrerequisites_en)
130130
}
131131
}
132132
if (this.supplementaryInfo_sv) {

0 commit comments

Comments
 (0)