Skip to content

Commit fc4cb12

Browse files
Fix export CSV to retrieve all assessement entries (#3076)
* Connect to backend endpoint * Apply suggestions from code review --------- Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com>
1 parent 9805da3 commit fc4cb12

File tree

2 files changed

+70
-42
lines changed

2 files changed

+70
-42
lines changed

src/commons/sagas/RequestsSaga.ts

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -640,47 +640,22 @@ export const getGradingOverviews = async (
640640
}
641641
const gradingOverviews = await resp.json();
642642

643-
return {
644-
count: gradingOverviews.count,
645-
data: gradingOverviews.data.map((overview: any) => {
646-
const gradingOverview: GradingOverview = {
647-
assessmentId: overview.assessment.id,
648-
assessmentNumber: overview.assessment.assessmentNumber,
649-
assessmentName: overview.assessment.title,
650-
assessmentType: overview.assessment.type,
651-
studentId: overview.student ? overview.student.id : -1,
652-
studentName: overview.student ? overview.student.name : undefined,
653-
studentNames: overview.team
654-
? overview.team.team_members.map((member: { name: any }) => member.name)
655-
: undefined,
656-
studentUsername: overview.student ? overview.student.username : undefined,
657-
studentUsernames: overview.team
658-
? overview.team.team_members.map((member: { username: any }) => member.username)
659-
: undefined,
660-
submissionId: overview.id,
661-
submissionStatus: overview.status,
662-
groupName: overview.student ? overview.student.groupName : '-',
663-
groupLeaderId: overview.student ? overview.student.groupLeaderId : undefined,
664-
isGradingPublished: overview.isGradingPublished,
665-
progress: backendParamsToProgressStatus(
666-
overview.assessment.isManuallyGraded,
667-
overview.isGradingPublished,
668-
overview.status,
669-
overview.gradedCount,
670-
overview.assessment.questionCount
671-
),
672-
questionCount: overview.assessment.questionCount,
673-
gradedCount: overview.gradedCount,
674-
// XP
675-
initialXp: overview.xp,
676-
xpAdjustment: overview.xpAdjustment,
677-
currentXp: overview.xp + overview.xpAdjustment,
678-
maxXp: overview.assessment.maxXp,
679-
xpBonus: overview.xpBonus
680-
};
681-
return gradingOverview;
682-
})
683-
};
643+
return respToGradingOverviews(gradingOverviews);
644+
};
645+
646+
/*
647+
* GET /courses/{courseId}/admin/grading/all_submissions
648+
*/
649+
export const getAllGradingOverviews = async (tokens: Tokens): Promise<GradingOverviews | null> => {
650+
const resp = await request(`${courseId()}/admin/grading/all_submissions`, 'GET', {
651+
...tokens
652+
});
653+
if (!resp) {
654+
return null; // invalid accessToken _and_ refreshToken
655+
}
656+
const gradingOverviews = await resp.json();
657+
658+
return respToGradingOverviews(gradingOverviews);
684659
};
685660

686661
/*
@@ -1556,6 +1531,50 @@ export function* handleResponseError(resp: Response | null): any {
15561531
yield call(showWarningMessage, respText);
15571532
}
15581533

1534+
const respToGradingOverviews = (gradingOverviews: any): GradingOverviews => {
1535+
return {
1536+
count: gradingOverviews.count,
1537+
data: gradingOverviews.data.map((overview: any) => {
1538+
const gradingOverview: GradingOverview = {
1539+
assessmentId: overview.assessment.id,
1540+
assessmentNumber: overview.assessment.assessmentNumber,
1541+
assessmentName: overview.assessment.title,
1542+
assessmentType: overview.assessment.type,
1543+
studentId: overview.student ? overview.student.id : -1,
1544+
studentName: overview.student ? overview.student.name : undefined,
1545+
studentNames: overview.team
1546+
? overview.team.team_members.map((member: { name: any }) => member.name)
1547+
: undefined,
1548+
studentUsername: overview.student ? overview.student.username : undefined,
1549+
studentUsernames: overview.team
1550+
? overview.team.team_members.map((member: { username: any }) => member.username)
1551+
: undefined,
1552+
submissionId: overview.id,
1553+
submissionStatus: overview.status,
1554+
groupName: overview.student ? overview.student.groupName : '-',
1555+
groupLeaderId: overview.student ? overview.student.groupLeaderId : undefined,
1556+
isGradingPublished: overview.isGradingPublished,
1557+
progress: backendParamsToProgressStatus(
1558+
overview.assessment.isManuallyGraded,
1559+
overview.isGradingPublished,
1560+
overview.status,
1561+
overview.gradedCount,
1562+
overview.assessment.questionCount
1563+
),
1564+
questionCount: overview.assessment.questionCount,
1565+
gradedCount: overview.gradedCount,
1566+
// XP
1567+
initialXp: overview.xp,
1568+
xpAdjustment: overview.xpAdjustment,
1569+
currentXp: overview.xp + overview.xpAdjustment,
1570+
maxXp: overview.assessment.maxXp,
1571+
xpBonus: overview.xpBonus
1572+
};
1573+
return gradingOverview;
1574+
})
1575+
};
1576+
};
1577+
15591578
const courseId: () => string = () => {
15601579
const id = store.getState().session.courseId;
15611580
if (id) {

src/pages/academy/grading/Grading.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import SessionActions from 'src/commons/application/actions/SessionActions';
77
import { Role } from 'src/commons/application/ApplicationTypes';
88
import GradingFlex from 'src/commons/grading/GradingFlex';
99
import GradingText from 'src/commons/grading/GradingText';
10+
import { getAllGradingOverviews } from 'src/commons/sagas/RequestsSaga';
1011
import SimpleDropdown from 'src/commons/SimpleDropdown';
1112
import { useSession, useTypedSelector } from 'src/commons/utils/Hooks';
1213
import WorkspaceActions from 'src/commons/workspace/WorkspaceActions';
@@ -58,6 +59,8 @@ const Grading: React.FC = () => {
5859
const allColsSortStates = useTypedSelector(state => state.workspaces.grading.allColsSortStates);
5960
const hasLoadedBefore = useTypedSelector(state => state.workspaces.grading.hasLoadedBefore);
6061
const requestCounter = useTypedSelector(state => state.workspaces.grading.requestCounter);
62+
const accessToken = useTypedSelector(state => state.session.accessToken);
63+
const refreshToken = useTypedSelector(state => state.session.refreshToken);
6164

6265
const isLoading = useMemo(() => requestCounter > 0, [requestCounter]);
6366

@@ -165,7 +168,13 @@ const Grading: React.FC = () => {
165168
<Button
166169
minimal
167170
icon={IconNames.EXPORT}
168-
onClick={() => exportGradingCSV(gradingOverviews.data)}
171+
onClick={() => {
172+
const tokens = {
173+
accessToken: accessToken!,
174+
refreshToken: refreshToken!
175+
};
176+
getAllGradingOverviews(tokens).then(resp => exportGradingCSV(resp?.data));
177+
}}
169178
className="export-csv-btn"
170179
>
171180
Export to CSV

0 commit comments

Comments
 (0)