Skip to content

Commit 6377904

Browse files
committed
MOBILE-1701 assign: Refactor and fix assign prefetch
1 parent f324f1d commit 6377904

File tree

4 files changed

+141
-98
lines changed

4 files changed

+141
-98
lines changed

www/addons/mod/assign/controllers/edit.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ angular.module('mm.addons.mod_assign')
5151
return $q.reject($translate.instant('mm.core.nopermissions', {$a: editStr}));
5252
}
5353

54-
$scope.userSubmission = assign.teamsubmission ?
55-
response.lastattempt.teamsubmission : response.lastattempt.submission;
54+
$scope.userSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(assign, response.lastattempt);
5655

5756
// Only show submission statement if we are editing our own submission.
5857
if (assign.requiresubmissionstatement && !assign.submissiondrafts && userId == $mmSite.getUserId()) {

www/addons/mod/assign/directives/submission.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ angular.module('mm.addons.mod_assign')
8383
submitId == $mmSite.getUserId();
8484
scope.showErrorStatementSubmit = submissionStatementMissing && assign.submissiondrafts;
8585

86-
scope.userSubmission = assign.teamsubmission ?
87-
response.lastattempt.teamsubmission : response.lastattempt.submission;
86+
scope.userSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(assign, response.lastattempt);
8887

8988
if (assign.attemptreopenmethod != mmaModAssignAttemptReopenMethodNone) {
9089
if (scope.userSubmission) {
@@ -355,8 +354,7 @@ angular.module('mm.addons.mod_assign')
355354

356355
var modal = $mmUtil.showModalLoading(),
357356
previousAttempt = scope.previousAttempts[scope.previousAttempts.length - 1],
358-
previousSubmission = scope.assign.teamsubmission ?
359-
previousAttempt.teamsubmission : previousAttempt.submission;
357+
previousSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(scope.assign, previousAttempt);
360358

361359
$mmaModAssignHelper.getSubmissionSizeForCopy(scope.assign, previousSubmission).catch(function() {
362360
// Error calculating size, return -1.

www/addons/mod/assign/services/assign.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,20 @@ angular.module('mm.addons.mod_assign')
168168
});
169169
};
170170

171+
/**
172+
* Get the submission object from an attempt.
173+
*
174+
* @module mm.addons.mod_assign
175+
* @ngdoc method
176+
* @name $mmaModAssign#getSubmissionObjectFromAttempt
177+
* @param {Object} assign Assign.
178+
* @param {Object} attempt Attempt.
179+
* @return {Object} Submission object.
180+
*/
181+
self.getSubmissionObjectFromAttempt = function(assign, attempt) {
182+
return assign.teamsubmission ? attempt.teamsubmission : attempt.submission;
183+
};
184+
171185
/**
172186
* Get attachments of a submission Submission.
173187
*

www/addons/mod/assign/services/prefetch_handler.js

Lines changed: 124 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ angular.module('mm.addons.mod_assign')
113113
var promises = [];
114114

115115
if (response.lastattempt) {
116-
var userSubmission = assign.teamsubmission ?
117-
response.lastattempt.teamsubmission : response.lastattempt.submission;
116+
var userSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(assign, response.lastattempt);
118117
if (userSubmission) {
119118

120119
// Add User Submission files.
@@ -218,8 +217,7 @@ angular.module('mm.addons.mod_assign')
218217
var lastModified = 0;
219218

220219
if (response.lastattempt) {
221-
var userSubmission = assign.teamsubmission ?
222-
response.lastattempt.teamsubmission : response.lastattempt.submission;
220+
var userSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(assign, response.lastattempt);
223221
if (userSubmission && lastModified < userSubmission.timemodified) {
224222
lastModified = userSubmission.timemodified;
225223
}
@@ -279,120 +277,154 @@ angular.module('mm.addons.mod_assign')
279277
*/
280278
self.prefetch = function(module, courseId, single) {
281279
var siteId = $mmSite.getId(),
282-
userId = $mmSite.getUserId();
283-
284-
var promises = [];
280+
userId = $mmSite.getUserId(),
281+
promises = [];
285282

286283
promises.push($mmCourse.getModuleBasicInfo(module.id, siteId));
287284

288285
// Get Assignment to retrieve all its submissions.
289286
promises.push($mmaModAssign.getAssignment(courseId, module.id, siteId).then(function(assign) {
290-
var promises = [];
287+
var subPromises = [],
288+
blindMarking = assign.blindmarking && !assign.revealidentities;
291289

292-
var blindMarking = assign.blindmarking && !assign.revealidentities;
293290
if (blindMarking) {
294-
promises.push($mmaModAssign.getAssignmentUserMappings(assign.id, false, siteId).catch(function() {
291+
subPromises.push($mmaModAssign.getAssignmentUserMappings(assign.id, false, siteId).catch(function() {
295292
// Fail silently (Moodle < 2.6)
296293
}));
297294
}
298295

299-
promises.push($mmaModAssign.getSubmissions(assign.id, siteId).then(function(data) {
300-
var promise, altPromises = [];
301-
if (data.canviewsubmissions) {
302-
// Teacher.
303-
// Do not send participants to getSubmissionsUserData to retrieve user profiles.
304-
promise = $mmaModAssign.getSubmissionsUserData(data.submissions, courseId, assign.id, blindMarking, false,
305-
siteId).then(function(submissions) {
306-
var promises = [];
307-
angular.forEach(submissions, function(submission) {
308-
promises.push($mmaModAssign.getSubmissionStatus(
309-
assign.id, submission.submitid, !!submission.blindid, true, false, siteId));
310-
});
311-
return $q.all(promises).catch(function(error) {
312-
// Fail silently (Moodle < 3.1)
313-
});
314-
});
315-
316-
// Get list participants.
317-
altPromises.push($mmaModAssign.listParticipants(assign.id, 0, siteId).then(function (participants) {
318-
angular.forEach(participants, function(participant) {
319-
if (participant.profileimageurl) {
320-
$mmFilepool.addToQueueByUrl(siteId, participant.profileimageurl);
321-
}
322-
});
323-
}).catch(function() {
324-
// Fail silently (Moodle < 3.2)
325-
}));
326-
} else {
327-
// Student.
328-
promise = $q.all([$mmaModAssign.getSubmissionStatus(assign.id, userId, false, true, false, siteId)]);
329-
}
330-
331-
altPromises.push($mmGroups.getActivityAllowedGroups(assign.cmid, false, siteId));
332-
333-
return $q.all(altPromises).then(function() {
334-
// Fetch user and group info.
335-
return promise.then(function(submissions) {
336-
var promises = [];
337-
338-
angular.forEach(submissions, function(submission) {
339-
if (submission.lastattempt) {
340-
if (!blindMarking && submission.lastattempt.submissiongroupmemberswhoneedtosubmit) {
341-
angular.forEach(submission.lastattempt.submissiongroupmemberswhoneedtosubmit, function(member) {
342-
promises.push($mmUser.getProfile(member, courseId).then(function(profile) {
343-
if (profile.profileimageurl) {
344-
return $mmFilepool.addToQueueByUrl(siteId, profile.profileimageurl);
345-
}
346-
}));
347-
});
348-
}
349-
350-
// Probably we should move that to a prefetch handler but, not really sure about it.
351-
if (submission.lastattempt.submission.id) {
352-
angular.forEach(submission.lastattempt.submission.plugins, function(plugin) {
353-
if (plugin.type == "comments") {
354-
promises.push($mmComments.getComments('module', assign.cmid, 'assignsubmission_comments',
355-
submission.lastattempt.submission.id, 'submission_comments', 0, siteId).catch(function() {
356-
// Fail silently (Moodle < 3.1.1, 3.2)
357-
}));
358-
}
359-
});
360-
361-
}
362-
}
363-
364-
if (submission.feedback) {
365-
if (submission.feedback.grade && submission.feedback.grade.grader) {
366-
promises.push($mmUser.getProfile(submission.feedback.grade.grader, courseId)
367-
.then(function(profile) {
368-
return $mmFilepool.addToQueueByUrl(siteId, profile.profileimageurl);
369-
}));
370-
}
371-
}
372-
});
373-
374-
return $q.all(promises);
375-
});
376-
});
377-
}));
296+
subPromises.push(prefetchSubmissions(assign, courseId, siteId, userId));
378297

379-
promises.push($mmCourseHelper.getModuleCourseIdByInstance(assign.id, 'assign', siteId));
298+
subPromises.push($mmCourseHelper.getModuleCourseIdByInstance(assign.id, 'assign', siteId));
380299

381300
// Get related submissions files and fetch them.
382-
promises.push(self.getFiles(module, courseId, siteId).then(function (files) {
301+
subPromises.push(self.getFiles(module, courseId, siteId).then(function (files) {
383302
var revision = $mmFilepool.getRevisionFromFileList(files),
384303
timemodified = $mmFilepool.getTimemodifiedFromFileList(files);
385304

386305
// Download related files and update package info.
387306
return $mmFilepool.prefetchPackage(siteId, files, mmaModAssignComponent, module.id, revision, timemodified);
388307
}));
389308

390-
return $q.all(promises);
309+
return $q.all(subPromises);
391310
}));
392311

393312
return $q.all(promises);
394313
};
395314

315+
/**
316+
* Prefetch assign submissions.
317+
*
318+
* @param {Object} assign Assign.
319+
* @param {Number} courseId Course ID.
320+
* @param {String} [siteId] Site ID. If not defined, current site.
321+
* @param {Number} [userId] User ID. If not defined, current user.
322+
* @return {Promise} Promise resolved when prefetched, rejected otherwise.
323+
*/
324+
function prefetchSubmissions(assign, courseId, siteId, userId) {
325+
siteId = siteId || $mmSite.getId();
326+
userId = userId || $mmSite.getUserId();
327+
328+
// Get submissions.
329+
return $mmaModAssign.getSubmissions(assign.id, siteId).then(function(data) {
330+
var promises = [],
331+
blindMarking = assign.blindmarking && !assign.revealidentities;
332+
333+
if (data.canviewsubmissions) {
334+
// Teacher.
335+
// Do not send participants to getSubmissionsUserData to retrieve user profiles.
336+
promises.push($mmaModAssign.getSubmissionsUserData(data.submissions, courseId, assign.id, blindMarking, false, siteId)
337+
.then(function(submissions) {
338+
var subPromises = [];
339+
angular.forEach(submissions, function(submission) {
340+
subPromises.push($mmaModAssign.getSubmissionStatus(
341+
assign.id, submission.submitid, !!submission.blindid, true, false, siteId).then(function(subm) {
342+
return prefetchSubmission(assign, courseId, subm, siteId);
343+
}));
344+
});
345+
return $q.all(subPromises).catch(function() {
346+
// Fail silently (Moodle < 3.1)
347+
});
348+
}));
349+
350+
// Get list participants.
351+
promises.push($mmaModAssign.listParticipants(assign.id, 0, siteId).then(function (participants) {
352+
angular.forEach(participants, function(participant) {
353+
if (participant.profileimageurl) {
354+
$mmFilepool.addToQueueByUrl(siteId, participant.profileimageurl);
355+
}
356+
});
357+
}).catch(function() {
358+
// Fail silently (Moodle < 3.2)
359+
}));
360+
} else {
361+
// Student.
362+
promises.push($mmaModAssign.getSubmissionStatus(assign.id, userId, false, true, false, siteId).then(function(subm) {
363+
return prefetchSubmission(assign, courseId, subm, siteId);
364+
}));
365+
}
366+
367+
promises.push($mmGroups.getActivityAllowedGroups(assign.cmid, false, siteId));
368+
369+
return $q.all(promises);
370+
});
371+
}
372+
373+
/**
374+
* Prefetch a submission.
375+
*
376+
* @param {Object} assign Assign.
377+
* @param {Number} courseId Course ID.
378+
* @param {Object} submission Data returned by getSubmissionStatus.
379+
* @param {String} [siteId] Site ID. If not defined, current site.
380+
* @return {Promise} Promise resolved when prefetched, rejected otherwise.
381+
*/
382+
function prefetchSubmission(assign, courseId, submission, siteId) {
383+
siteId = siteId || $mmSite.getId();
384+
385+
var promises = [],
386+
blindMarking = assign.blindmarking && !assign.revealidentities;
387+
388+
if (submission.lastattempt) {
389+
var userSubmission = $mmaModAssign.getSubmissionObjectFromAttempt(assign, submission.lastattempt);
390+
391+
// Get profile and images of the member who need to submit.
392+
if (!blindMarking && submission.lastattempt.submissiongroupmemberswhoneedtosubmit) {
393+
angular.forEach(submission.lastattempt.submissiongroupmemberswhoneedtosubmit, function(member) {
394+
promises.push($mmUser.getProfile(member, courseId).then(function(profile) {
395+
if (profile.profileimageurl) {
396+
$mmFilepool.addToQueueByUrl(siteId, profile.profileimageurl);
397+
}
398+
}));
399+
});
400+
}
401+
402+
// Prefetch submission plugins data.
403+
if (userSubmission && userSubmission.id) {
404+
angular.forEach(userSubmission.plugins, function(plugin) {
405+
if (plugin.type == "comments") {
406+
promises.push($mmComments.getComments('module', assign.cmid, 'assignsubmission_comments',
407+
userSubmission.id, 'submission_comments', 0, siteId).catch(function() {
408+
// Fail silently (Moodle < 3.1.1, 3.2)
409+
}));
410+
}
411+
});
412+
413+
}
414+
}
415+
416+
// Get profile and image of the grader.
417+
if (submission.feedback) {
418+
if (submission.feedback.grade && submission.feedback.grade.grader) {
419+
promises.push($mmUser.getProfile(submission.feedback.grade.grader, courseId).then(function(profile) {
420+
$mmFilepool.addToQueueByUrl(siteId, profile.profileimageurl);
421+
}));
422+
}
423+
}
424+
425+
return $q.all(promises);
426+
}
427+
396428
return self;
397429
});
398430

0 commit comments

Comments
 (0)