MOBILE-3787 assign: Fix submission and grading status on groups
parent
59e1a4fcf5
commit
03ccd02636
|
@ -157,7 +157,7 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch submissions and grades.
|
// Fetch submissions and grades.
|
||||||
const submissions =
|
let submissions =
|
||||||
await AddonModAssignHelper.getSubmissionsUserData(
|
await AddonModAssignHelper.getSubmissionsUserData(
|
||||||
assign,
|
assign,
|
||||||
this.submissionsData.submissions,
|
this.submissionsData.submissions,
|
||||||
|
@ -172,67 +172,61 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
|
||||||
const getNeedGrading = this.SELECTED_STATUS == AddonModAssignProvider.NEED_GRADING;
|
const getNeedGrading = this.SELECTED_STATUS == AddonModAssignProvider.NEED_GRADING;
|
||||||
const searchStatus = getNeedGrading ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED : this.SELECTED_STATUS;
|
const searchStatus = getNeedGrading ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED : this.SELECTED_STATUS;
|
||||||
|
|
||||||
const promises: Promise<void>[] = [];
|
|
||||||
const showSubmissions: AddonModAssignSubmissionForList[] = [];
|
const showSubmissions: AddonModAssignSubmissionForList[] = [];
|
||||||
|
|
||||||
submissions.forEach((submission: AddonModAssignSubmissionForList) => {
|
if (searchStatus) {
|
||||||
if (!searchStatus || searchStatus == submission.status) {
|
submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => searchStatus == submission.status);
|
||||||
promises.push(
|
}
|
||||||
CoreUtils.ignoreErrors(
|
|
||||||
AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid),
|
|
||||||
).then(async (data) => {
|
|
||||||
if (getNeedGrading) {
|
|
||||||
// Only show the submissions that need to be graded.
|
|
||||||
const add = await AddonModAssign.needsSubmissionToBeGraded(submission, assign.id);
|
|
||||||
|
|
||||||
if (!add) {
|
const promises: Promise<void>[] = submissions.map(async (submission: AddonModAssignSubmissionForList) => {
|
||||||
return;
|
const gradeData = await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
|
||||||
}
|
if (getNeedGrading) {
|
||||||
}
|
// Only show the submissions that need to be graded.
|
||||||
|
const add = await AddonModAssign.needsSubmissionToBeGraded(submission, assign.id);
|
||||||
|
|
||||||
// Load offline grades.
|
if (!add) {
|
||||||
const notSynced = !!data && submission.timemodified < data.timemodified;
|
return;
|
||||||
|
}
|
||||||
if (submission.gradingstatus == 'graded' && !assign.markingworkflow) {
|
|
||||||
// Get the last grade of the submission.
|
|
||||||
const grade = grades
|
|
||||||
.filter((grade) => grade.userid == submission.userid)
|
|
||||||
.reduce(
|
|
||||||
(a, b) => (a && a.timemodified > b.timemodified ? a : b),
|
|
||||||
<AddonModAssignGrade | undefined> undefined,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (grade && grade.timemodified < submission.timemodified) {
|
|
||||||
submission.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status);
|
|
||||||
submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(
|
|
||||||
submission.gradingstatus,
|
|
||||||
);
|
|
||||||
|
|
||||||
submission.statusTranslated = Translate.instant(
|
|
||||||
'addon.mod_assign.submissionstatus_' + submission.status,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (notSynced) {
|
|
||||||
submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced';
|
|
||||||
submission.gradingColor = '';
|
|
||||||
} else if (submission.statusColor != 'danger' || submission.gradingColor != 'danger') {
|
|
||||||
// Show grading status if one of the statuses is not done.
|
|
||||||
submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(
|
|
||||||
submission.gradingstatus,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
submission.gradingStatusTranslationId = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
showSubmissions.push(submission);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load offline grades.
|
||||||
|
const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified;
|
||||||
|
|
||||||
|
if (submission.gradingstatus == 'graded' && !assign.markingworkflow) {
|
||||||
|
// Get the last grade of the submission.
|
||||||
|
const grade = grades
|
||||||
|
.filter((grade) => grade.userid == submission.userid)
|
||||||
|
.reduce(
|
||||||
|
(a, b) => (a && a.timemodified > b.timemodified ? a : b),
|
||||||
|
<AddonModAssignGrade | undefined> undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (grade && grade.timemodified < submission.timemodified) {
|
||||||
|
submission.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status);
|
||||||
|
submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(
|
||||||
|
submission.gradingstatus,
|
||||||
|
);
|
||||||
|
|
||||||
|
submission.statusTranslated = Translate.instant(
|
||||||
|
'addon.mod_assign.submissionstatus_' + submission.status,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (notSynced) {
|
||||||
|
submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced';
|
||||||
|
submission.gradingColor = '';
|
||||||
|
} else if (submission.statusColor != 'danger' || submission.gradingColor != 'danger') {
|
||||||
|
// Show grading status if one of the statuses is not done.
|
||||||
|
submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(
|
||||||
|
submission.gradingstatus,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
submission.gradingStatusTranslationId = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
showSubmissions.push(submission);
|
||||||
});
|
});
|
||||||
|
|
||||||
await Promise.all(promises);
|
await Promise.all(promises);
|
||||||
|
|
|
@ -398,48 +398,34 @@ export class AddonModAssignHelperProvider {
|
||||||
groupId?: number,
|
groupId?: number,
|
||||||
options: CoreSitesCommonWSOptions = {},
|
options: CoreSitesCommonWSOptions = {},
|
||||||
): Promise<AddonModAssignSubmissionFormatted[]> {
|
): Promise<AddonModAssignSubmissionFormatted[]> {
|
||||||
const parts = await this.getParticipants(assign, groupId, options);
|
const participants = await this.getParticipants(assign, groupId, options);
|
||||||
|
|
||||||
const blind = assign.blindmarking && !assign.revealidentities;
|
const blind = !!assign.blindmarking && !assign.revealidentities;
|
||||||
const result: AddonModAssignSubmissionFormatted[] = [];
|
const teamsubmission = !!assign.teamsubmission;
|
||||||
const participants: {[id: number]: AddonModAssignParticipant} = CoreUtils.arrayToObject(parts, 'id');
|
|
||||||
|
|
||||||
submissions.forEach((submission) => {
|
return participants.map((participant) => {
|
||||||
submission.submitid = submission.userid && submission.userid > 0 ? submission.userid : submission.blindid;
|
const groupId = participant.groupid ??
|
||||||
if (submission.submitid === undefined || submission.submitid <= 0) {
|
(participant.groups && participant.groups[0] ? participant.groups[0].id : 0);
|
||||||
return;
|
|
||||||
|
const foundSubmission = submissions.find((submission) => {
|
||||||
|
if (teamsubmission) {
|
||||||
|
return submission.userid == 0 && submission.groupid == groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
const submitId = submission.userid && submission.userid > 0 ? submission.userid : submission.blindid;
|
||||||
|
|
||||||
|
return participant.id == submitId;
|
||||||
|
});
|
||||||
|
|
||||||
|
let submission: AddonModAssignSubmissionFormatted | undefined;
|
||||||
|
if (!foundSubmission) {
|
||||||
|
// Create submission if none.
|
||||||
|
submission = this.createEmptySubmission();
|
||||||
|
submission.groupid = groupId;
|
||||||
|
} else {
|
||||||
|
submission = Object.assign({}, foundSubmission);
|
||||||
}
|
}
|
||||||
|
|
||||||
const participant = participants[submission.submitid];
|
|
||||||
if (!participant) {
|
|
||||||
// Avoid permission denied error. Participant not found on list.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete participants[submission.submitid];
|
|
||||||
|
|
||||||
if (!blind) {
|
|
||||||
submission.userfullname = participant.fullname;
|
|
||||||
submission.userprofileimageurl = participant.profileimageurl;
|
|
||||||
}
|
|
||||||
|
|
||||||
submission.manyGroups = !!participant.groups && participant.groups.length > 1;
|
|
||||||
submission.noGroups = !!participant.groups && participant.groups.length == 0;
|
|
||||||
if (participant.groupname) {
|
|
||||||
submission.groupid = participant.groupid!;
|
|
||||||
submission.groupname = participant.groupname;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add to the list.
|
|
||||||
if (submission.userfullname || submission.blindid) {
|
|
||||||
result.push(submission);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create a submission for each participant left in the list (the participants already treated were removed).
|
|
||||||
CoreUtils.objectToArray(participants).forEach((participant: AddonModAssignParticipant) => {
|
|
||||||
const submission = this.createEmptySubmission();
|
|
||||||
|
|
||||||
submission.submitid = participant.id;
|
submission.submitid = participant.id;
|
||||||
|
|
||||||
if (!blind) {
|
if (!blind) {
|
||||||
|
@ -453,16 +439,16 @@ export class AddonModAssignHelperProvider {
|
||||||
submission.manyGroups = !!participant.groups && participant.groups.length > 1;
|
submission.manyGroups = !!participant.groups && participant.groups.length > 1;
|
||||||
submission.noGroups = !!participant.groups && participant.groups.length == 0;
|
submission.noGroups = !!participant.groups && participant.groups.length == 0;
|
||||||
if (participant.groupname) {
|
if (participant.groupname) {
|
||||||
submission.groupid = participant.groupid!;
|
submission.groupid = participant.groupid;
|
||||||
submission.groupname = participant.groupname;
|
submission.groupname = participant.groupname;
|
||||||
}
|
}
|
||||||
submission.status = participant.submitted ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED :
|
|
||||||
AddonModAssignProvider.SUBMISSION_STATUS_NEW;
|
|
||||||
|
|
||||||
result.push(submission);
|
submission.status = submission.status ?? (participant.submitted ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED :
|
||||||
|
AddonModAssignProvider.SUBMISSION_STATUS_NEW);
|
||||||
|
|
||||||
|
return submission;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -714,8 +700,9 @@ export const AddonModAssignHelper = makeSingleton(AddonModAssignHelperProvider);
|
||||||
* Assign submission with some calculated data.
|
* Assign submission with some calculated data.
|
||||||
*/
|
*/
|
||||||
export type AddonModAssignSubmissionFormatted =
|
export type AddonModAssignSubmissionFormatted =
|
||||||
Omit<AddonModAssignSubmission, 'userid'> & {
|
Omit<AddonModAssignSubmission, 'userid'|'groupid'> & {
|
||||||
userid?: number; // Student id.
|
userid?: number; // Student id.
|
||||||
|
groupid?: number; // Group id.
|
||||||
blindid?: number; // Calculated in the app. Blindid of the user that did the submission.
|
blindid?: number; // Calculated in the app. Blindid of the user that did the submission.
|
||||||
submitid?: number; // Calculated in the app. Userid or blindid of the user that did the submission.
|
submitid?: number; // Calculated in the app. Userid or blindid of the user that did the submission.
|
||||||
userfullname?: string; // Calculated in the app. Full name of the user that did the submission.
|
userfullname?: string; // Calculated in the app. Full name of the user that did the submission.
|
||||||
|
|
Loading…
Reference in New Issue