diff --git a/scripts/langindex.json b/scripts/langindex.json index e72e9ebae..bb6996369 100644 --- a/scripts/langindex.json +++ b/scripts/langindex.json @@ -1517,6 +1517,7 @@ "core.nograde": "moodle", "core.none": "moodle", "core.nopasswordchangeforced": "local_moodlemobileapp", + "core.nopermissionerror": "local_moodlemobileapp", "core.nopermissions": "error", "core.noresults": "moodle", "core.notapplicable": "local_moodlemobileapp", diff --git a/src/addon/mod/assign/components/index/addon-mod-assign-index.html b/src/addon/mod/assign/components/index/addon-mod-assign-index.html index 957d7ff15..fd9fd8488 100644 --- a/src/addon/mod/assign/components/index/addon-mod-assign-index.html +++ b/src/addon/mod/assign/components/index/addon-mod-assign-index.html @@ -31,7 +31,7 @@ - +

{{ 'addon.mod_assign.timeremaining' | translate }}

{{ timeRemaining }}

@@ -82,6 +82,6 @@
- + diff --git a/src/addon/mod/assign/components/index/index.ts b/src/addon/mod/assign/components/index/index.ts index 7248083ca..23d2ebda0 100644 --- a/src/addon/mod/assign/components/index/index.ts +++ b/src/addon/mod/assign/components/index/index.ts @@ -37,7 +37,8 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo moduleName = 'assign'; assign: any; // The assign object. - canViewSubmissions: boolean; // Whether the user can view all submissions. + canViewAllSubmissions: boolean; // Whether the user can view all submissions. + canViewOwnSubmission: boolean; // Whether the user can view their own submission. timeRemaining: string; // Message about time remaining to submit. lateSubmissions: string; // Message about late submissions. showNumbers = true; // Whether to show number of submissions with each status. @@ -79,16 +80,16 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo // Ignore errors. }); - if (!this.canViewSubmissions) { - // User can only see his submission, log view the user submission. - this.assignProvider.logSubmissionView(this.assign.id).catch(() => { - // Ignore errors. - }); - } else { + if (this.canViewAllSubmissions) { // User can see all submissions, log grading view. this.assignProvider.logGradingView(this.assign.id).catch(() => { // Ignore errors. }); + } else if (this.canViewOwnSubmission) { + // User can only see their own submission, log view the user submission. + this.assignProvider.logSubmissionView(this.assign.id).catch(() => { + // Ignore errors. + }); } }); @@ -164,7 +165,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo return this.assignProvider.getSubmissions(this.assign.id).then((data) => { const time = this.timeUtils.timestamp(); - this.canViewSubmissions = data.canviewsubmissions; + this.canViewAllSubmissions = data.canviewsubmissions; if (data.canviewsubmissions) { @@ -203,6 +204,17 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo }); }); } + + // Check if the user can view their own submission. + return this.assignProvider.getSubmissionStatus(this.assign.id).then(() => { + this.canViewOwnSubmission = true; + }).catch((error) => { + this.canViewOwnSubmission = false; + + if (error.errorcode !== 'nopermission') { + return Promise.reject(error); + } + }); }); }).then(() => { // All data obtained, now fill the context menu. @@ -260,7 +272,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo if (this.assign) { promises.push(this.assignProvider.invalidateAllSubmissionData(this.assign.id)); - if (this.canViewSubmissions) { + if (this.canViewAllSubmissions) { promises.push(this.assignProvider.invalidateSubmissionStatusData(this.assign.id)); } } diff --git a/src/addon/mod/assign/providers/prefetch-handler.ts b/src/addon/mod/assign/providers/prefetch-handler.ts index e98bb8f9a..d7a86836a 100644 --- a/src/addon/mod/assign/providers/prefetch-handler.ts +++ b/src/addon/mod/assign/providers/prefetch-handler.ts @@ -64,9 +64,16 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan canUseCheckUpdates(module: any, courseId: number): boolean | Promise { // Teachers cannot use the WS because it doesn't check student submissions. return this.assignProvider.getAssignment(courseId, module.id).then((assign) => { - return this.assignProvider.getSubmissions(assign.id); - }).then((data) => { - return !data.canviewsubmissions; + return this.assignProvider.getSubmissions(assign.id).then((data) => { + if (data.canviewsubmissions) { + return false; + } + + // Check if the user can view their own submission. + return this.assignProvider.getSubmissionStatus(assign.id).then(() => { + return true; + }); + }); }).catch(() => { return false; }); @@ -322,10 +329,16 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan })); } else { // Student. - promises.push(this.assignProvider.getSubmissionStatus(assign.id, userId, false, true, false, siteId) - .then((subm) => { - return this.prefetchSubmission(assign, courseId, moduleId, subm, userId, siteId); - })); + promises.push( + this.assignProvider.getSubmissionStatus(assign.id, userId, false, true, false, siteId).then((subm) => { + return this.prefetchSubmission(assign, courseId, moduleId, subm, userId, siteId); + }).catch((error) => { + // Ignore if the user can't view their own submission. + if (error.errorcode != 'nopermission') { + return Promise.reject(error); + } + }) + ); } promises.push(this.groupsProvider.activityHasGroups(assign.cmid)); diff --git a/src/assets/lang/en.json b/src/assets/lang/en.json index 2b26aa66c..4794e2c92 100644 --- a/src/assets/lang/en.json +++ b/src/assets/lang/en.json @@ -1518,6 +1518,7 @@ "core.nograde": "No grade", "core.none": "None", "core.nopasswordchangeforced": "You cannot proceed without changing your password.", + "core.nopermissionerror": "Sorry, but you do not currently have permissions to do that", "core.nopermissions": "Sorry, but you do not currently have permissions to do that ({{$a}})", "core.noresults": "No results", "core.notapplicable": "n/a", diff --git a/src/classes/site.ts b/src/classes/site.ts index 1edb3f9da..18089cc1e 100644 --- a/src/classes/site.ts +++ b/src/classes/site.ts @@ -671,6 +671,16 @@ export class CoreSite { // This should not happen. error.message = this.translate.instant('core.unicodenotsupported'); + return Promise.reject(error); + } else if (error.exception === 'required_capability_exception' || error.errorcode === 'nopermission') { + if (error.message === 'error/nopermission') { + // This error message is returned by some web services but the string does not exist. + error.message = this.translate.instant('core.nopermissionerror'); + } + + // Save the error instead of deleting the cache entry so the same content is displayed in offline. + this.saveToCache(method, data, error, preSets); + return Promise.reject(error); } else if (typeof preSets.emergencyCache !== 'undefined' && !preSets.emergencyCache) { this.logger.debug(`WS call '${method}' failed. Emergency cache is forbidden, rejecting.`); @@ -695,6 +705,13 @@ export class CoreSite { return Promise.reject(error); }); }); + }).then((response) => { + // Check if the response is an error, this happens if the error was stored in the cache. + if (response && typeof response.exception !== 'undefined') { + return Promise.reject(response); + } + + return response; }); } diff --git a/src/lang/en.json b/src/lang/en.json index 844d4addb..317c08547 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -163,6 +163,7 @@ "nograde": "No grade", "none": "None", "nopasswordchangeforced": "You cannot proceed without changing your password.", + "nopermissionerror": "Sorry, but you do not currently have permissions to do that", "nopermissions": "Sorry, but you do not currently have permissions to do that ({{$a}})", "noresults": "No results", "notapplicable": "n/a",