From 95e9d9c3f0b20186fb737376c9330eb80a7ca8de Mon Sep 17 00:00:00 2001 From: Ron Lucke <lucke@elan-ev.de> Date: Wed, 21 Sep 2022 10:53:25 +0000 Subject: [PATCH] Biest #994 Closes #994 and #1551 Merge request studip/studip!999 --- resources/vue/courseware-dashboard-app.js | 5 +-- resources/vue/courseware-index-app.js | 5 +-- resources/vue/courseware-manager-app.js | 4 ++- .../vue/store/courseware/courseware.module.js | 31 +++++++++++++++---- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/resources/vue/courseware-dashboard-app.js b/resources/vue/courseware-dashboard-app.js index 608341b8897..5ddaf344ff1 100644 --- a/resources/vue/courseware-dashboard-app.js +++ b/resources/vue/courseware-dashboard-app.js @@ -5,7 +5,7 @@ import CoursewareModule from './store/courseware/courseware.module'; import CoursewareStructureModule from './store/courseware/structure.module'; import axios from 'axios'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -42,6 +42,7 @@ const mountApp = (STUDIP, createApp, element) => { 'folders', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -68,7 +69,7 @@ const mountApp = (STUDIP, createApp, element) => { } store.dispatch('setUserId', STUDIP.USER_ID); - store.dispatch('users/loadById', { id: STUDIP.USER_ID }); + await store.dispatch('users/loadById', { id: STUDIP.USER_ID }); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { id: entry_id, diff --git a/resources/vue/courseware-index-app.js b/resources/vue/courseware-index-app.js index 3d95d7dcd81..e39d053b966 100644 --- a/resources/vue/courseware-index-app.js +++ b/resources/vue/courseware-index-app.js @@ -9,7 +9,7 @@ import Vuex from 'vuex'; import axios from 'axios'; import { mapResourceModules } from '@elan-ev/reststate-vuex'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -105,6 +105,7 @@ const mountApp = (STUDIP, createApp, element) => { 'status-groups', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -117,7 +118,7 @@ const mountApp = (STUDIP, createApp, element) => { store.dispatch('setUrlHelper', STUDIP.URLHelper); store.dispatch('setUserId', STUDIP.USER_ID); - store.dispatch('users/loadById', {id: STUDIP.USER_ID}); + await store.dispatch('users/loadById', {id: STUDIP.USER_ID}); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { diff --git a/resources/vue/courseware-manager-app.js b/resources/vue/courseware-manager-app.js index fccea2beb5e..8d6454a3a37 100644 --- a/resources/vue/courseware-manager-app.js +++ b/resources/vue/courseware-manager-app.js @@ -6,7 +6,7 @@ import axios from 'axios'; import { mapResourceModules } from '@elan-ev/reststate-vuex'; -const mountApp = (STUDIP, createApp, element) => { +const mountApp = async (STUDIP, createApp, element) => { const getHttpClient = () => axios.create({ baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true), @@ -41,6 +41,7 @@ const mountApp = (STUDIP, createApp, element) => { 'status-groups', 'users', 'institutes', + 'institute-memberships', 'semesters', 'sem-classes', 'sem-types', @@ -69,6 +70,7 @@ const mountApp = (STUDIP, createApp, element) => { store.dispatch('setUrlHelper', STUDIP.URLHelper); store.dispatch('setUserId', STUDIP.USER_ID); + await store.dispatch('users/loadById', {id: STUDIP.USER_ID}); store.dispatch('setHttpClient', httpClient); store.dispatch('coursewareContext', { id: entry_id, diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js index a211103ffcf..f8387604d60 100644 --- a/resources/vue/store/courseware/courseware.module.js +++ b/resources/vue/store/courseware/courseware.module.js @@ -1075,20 +1075,39 @@ export const actions = { }, async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, userId) { - let user = rootGetters['users/byId']({ id: userId }); - if (!user) { - await dispatch('users/loadById', { id: userId }); - user = rootGetters['users/byId']({ id: userId }); - } + const user = rootGetters['users/byId']({ id: userId }); if (user.attributes.permission === 'root') { commit('setUserIsTeacher', true); return; } + if (user.attributes.permission === 'admin') { + await dispatch('courses/loadById', { id: state.context.id }); + const course = rootGetters['courses/byId']({id: state.context.id }); + const instituteId = course.relationships.institute.data.id; + + const parent = { type: 'users', id: `${userId}` }; + const relationship = 'institute-memberships'; + const options = {}; + await dispatch('institute-memberships/loadRelated', { parent, relationship, options }, { root: true }); + const instituteMemberships = rootGetters['institute-memberships/all']; + const instituteMembership = instituteMemberships.filter(membership => membership.relationships.institute.data.id === instituteId); + + if (instituteMembership.length > 0 && instituteMembership[0].attributes.permission === 'admin') { + commit('setUserIsTeacher', true); + return; + } + } const membershipId = `${state.context.id}_${userId}`; + try { + await dispatch('course-memberships/loadById', { id: membershipId }); + } catch (error) { + console.error(`Could not find course membership for ${membershipId}.`); + commit('setUserIsTeacher', false); - await dispatch('course-memberships/loadById', { id: membershipId }); + return false; + } const membership = rootGetters['course-memberships/byId']({ id: membershipId }); if (membership) { let editingLevel = 'tutor'; -- GitLab