@@ -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