1
0
mirror of https://github.com/matt-fidd/stratos.git synced 2026-01-01 16:19:26 +00:00

Add report generation

This commit is contained in:
2022-04-22 02:42:43 +00:00
parent 64c0da6716
commit d5cdf70705

View File

@@ -2,7 +2,11 @@
const express = require('express');
const router = express.Router();
const { stringify } = require('csv-stringify');
const Class = require('../lib/Class');
const Student = require('../lib/Student');
const Test = require('../lib/Test');
const User = require('../lib/User');
const validator = require('../lib/validator');
@@ -96,9 +100,94 @@ router.post('/report/generate', async (req, res) => {
return res.status(400).json({ status: 'Invalid' });
}
fields.get('type');
let data;
let filename;
return res.redirect('/admin/reports');
switch (fields.get('type')) {
case 'student': {
const s = await new Student(
req.db,
fields.get('target'));
const trs = await s.getTestResults();
data = trs.map(tr =>
({
'Test Name': tr.test.template.name,
'Class': tr.test.class.name,
'Test Date': tr.test
.getDateString(false),
'Max Mark': tr.test.template.maxMark,
'Mark': tr.mark,
'Percentage': `${tr.percentage}%`,
'Grade': tr.grade
})
);
filename = s.shortName;
break;
}
case 'class': {
const c = await new Class(req.db, fields.get('target'));
const ts = await c.getTests({ range: 'before' });
data = await Promise.all(ts.map(async t => {
const [
trs,
avgPer,
avgScore
] = await Promise.all([
t.getTestResults(),
t.getAveragePercentage(),
t.getAverageScore()
]);
return {
'Test Name': t.template.name,
'Test Date': t.getDateString(false),
'Max Mark': t.template.maxMark,
'Results Submitted': `${trs.length}/` +
t.class.studentIds.length +
'\t',
'Average score': avgScore,
'Average percentage': `${avgPer}%`
};
}));
filename = c.name;
break;
}
case 'test': {
const t = await new Test(req.db, fields.get('target'));
const trs = await t.getTestResults();
data = trs.map(tr =>
({
'Student': tr.student.fullName,
'Test Date': tr.test
.getDateString(false),
'Max Mark': tr.test.template.maxMark,
'Mark': tr.mark,
'Percentage': `${tr.percentage}%`,
'Grade': tr.grade
})
);
filename = `${t.class.name}-${t.template.name}`;
break;
}
}
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition',
`attachment; filename="stratos-report-${filename}.csv"`);
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Pragma', 'no-cache');
stringify(data, { header: true })
.pipe(res);
});
module.exports = {