Skip to content

Commit bbab79f

Browse files
committed
FIX: both refresh and course switching is working now.
FIX: both refresh and course switching is working now.
1 parent b863935 commit bbab79f

File tree

14 files changed

+123
-112
lines changed

14 files changed

+123
-112
lines changed

conf/permissions.dist.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ db_permissions:
4848
getGlobalUsers:
4949
admin_required: true
5050
getGlobalUser:
51-
admin_required: true
51+
allow_self_access: true
5252
checkGlobalUser:
5353
allowed_roles: ['course_admin', 'instructor']
5454
updateGlobalUser:
@@ -78,6 +78,7 @@ db_permissions:
7878
getGlobalCourseUsers:
7979
allowed_roles: ['course_admin', 'instructor']
8080
getCourseUser:
81+
allow_self_access: true
8182
allowed_roles: ['course_admin', 'instructor']
8283
addCourseUser:
8384
allowed_roles: ['course_admin', 'instructor']
@@ -99,6 +100,7 @@ db_permissions:
99100
getAllUserSets:
100101
allowed_roles: ['course_admin', 'instructor']
101102
getUserSets:
103+
allow_self_access: true
102104
allowed_roles: ['course_admin', 'instructor']
103105
addUserSet:
104106
allowed_roles: ['course_admin', 'instructor']

lib/WeBWorK3/Controller/Permission.pm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ sub checkPermission ($c) {
6262
} elsif ($perm_db->admin_required && !$user->{is_admin}) {
6363
$permitted = undef;
6464
$msg = 'This route requires admin privileges.';
65-
} elsif (!$course_id && $perm_db->allow_self_access && defined($c->param('user_id'))) {
65+
} elsif (!$course_id && $perm_db->allow_self_access && defined($user_id)) {
6666
# Some routes allow self access, but the course_id is not defined.
67-
$permitted = $user->{user_id} == $c->param('user_id');
67+
$permitted = $user->{user_id} == $user_id;
6868
} elsif ($course_id) {
6969
my $course_user = $c->schema->resultset('User')->getCourseUser(
7070
info => {

src/common/models/session.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import type { User } from 'src/common/models/users';
1+
import type { ParseableUser, User } from 'src/common/models/users';
22
import { parseBoolean } from './parsers';
33

44
export interface SessionInfo {
5-
user: User;
5+
user: ParseableUser;
66
logged_in: boolean;
77
message: string;
88
}

src/common/views.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const student_views: Array<ViewInfo> = [
5151
export const instructor_views: Array<ViewInfo> = [
5252
{
5353
name: 'Dashboard',
54-
component_name: 'Dashboard',
54+
component_name: 'InstructorDashboard',
5555
icon: 'speed',
5656
route: 'dashboard',
5757
sidebars: []

src/components/common/Login.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ const login = async () => {
6767
await permission_store.fetchRoles();
6868
await permission_store.fetchRoutePermissions();
6969
70+
if (session.user.user_id == undefined || session.user.user_id == 0) return;
71+
7072
let forward = localStorage.getItem('afterLogin');
7173
forward ||= (session_info.user.is_admin) ?
7274
'/admin' :

src/components/common/UserCourses.vue

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,47 +36,45 @@ import { computed } from 'vue';
3636
import { useRouter } from 'vue-router';
3737
3838
import { useSessionStore } from 'src/stores/session';
39+
import { logger } from 'src/boot/logger';
3940
40-
const session = useSessionStore();
41+
const session_store = useSessionStore();
4142
const router = useRouter();
4243
44+
const user_courses = computed(() => session_store.user_courses);
45+
46+
const user = computed(() => session_store.user);
47+
4348
// This is used to simplify the UI.
4449
const course_types = computed(() => [
45-
{ name: 'Student', courses: student_courses.value },
46-
{ name: 'Instrutor', courses: instructor_courses.value }
50+
{ name: 'Student', courses: user_courses.value.filter(c => c.role == 'student') },
51+
{ name: 'Instructor', courses: session_store.instructor_user_courses }
4752
]);
4853
49-
const student_courses = computed(() =>
50-
// for some reason on load the user_course.role is undefined.
51-
session.user_courses.filter(user_course => user_course.role === 'student'));
52-
53-
const instructor_courses = computed(() =>
54-
// For some reason on load the user_course.role is undefined.
55-
session.user_courses.filter(user_course => user_course.role === 'instructor')
56-
);
57-
const user = computed(() => session.user);
58-
59-
const switchCourse = async (course_id: number) => {
60-
const student_course = student_courses.value.find(c => c.course_id === course_id);
61-
const instructor_course = instructor_courses.value.find(c => c.course_id === course_id);
54+
const switchCourse = async (course_id?: number) => {
55+
if (course_id == undefined || course_id === 0) {
56+
logger.error('[UserCourses/switchCourse]: the course_id is 0 or undefined.');
57+
}
58+
const student_course = session_store.student_user_courses.find(c => c.course_id === course_id);
59+
const instructor_course = session_store.instructor_user_courses.find(c => c.course_id === course_id);
6260
if (student_course) {
63-
session.setCourse({
64-
course_name: student_course.course_name,
65-
course_id: student_course.course_id,
61+
session_store.setCourse({
62+
course_name: student_course.course_name ?? 'unknown',
63+
course_id: student_course.course_id ?? 0,
6664
role: 'student'
6765
});
6866
await router.push({
6967
name: 'StudentDashboard',
7068
params: { course_id: student_course.course_id }
7169
});
7270
} else if (instructor_course) {
73-
session.setCourse({
74-
course_name: instructor_course.course_name,
75-
course_id: instructor_course.course_id,
71+
session_store.setCourse({
72+
course_name: instructor_course.course_name ?? 'unknown',
73+
course_id: instructor_course.course_id ?? 0,
7674
role: 'instructor'
7775
});
7876
await router.push({
79-
name: 'instructor',
77+
name: 'InstructorDashboard',
8078
params: { course_id: instructor_course.course_id }
8179
});
8280
}

src/components/student/Student.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ const loadStudentSets = async () => {
2121
// Fetch only the current user info.
2222
await user_store.setSessionUser();
2323
24-
logger.debug(`[Student/loadStudenSet]: loading data for course ${session_store.course.course_id}`);
24+
logger.debug(`[Student/loadStudentSets]: loading data for course ${session_store.course.course_id}`);
2525
2626
if (session_store.course.course_id > 0) {
2727
// Fetch all problem sets and user sets
2828
await problem_set_store.fetchProblemSets(session_store.course.course_id);
29-
await problem_set_store.fetchUserSetsForUser({ user_id: session_store.user.user_id });
30-
29+
if (session_store.user.user_id) {
30+
await problem_set_store.fetchUserSetsForUser({ user_id: session_store.user.user_id });
31+
}
3132
}
3233
};
3334
@@ -36,7 +37,7 @@ const course = session_store.user_courses.find(c => c.course_id === course_id);
3637
if (course) {
3738
session_store.setCourse({
3839
course_id: course_id,
39-
course_name: course.course_name
40+
course_name: course.course_name ?? 'unknown'
4041
});
4142
} else {
4243
logger.warn(`Can't find ${course_id} in ${session_store.user_courses
@@ -45,7 +46,6 @@ if (course) {
4546
await loadStudentSets();
4647
4748
watch(() => session_store.course.course_id, async () => {
48-
4949
await loadStudentSets();
5050
});
5151
</script>

src/layouts/MainLayout.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
</q-drawer>
1111

1212
<q-page-container>
13-
<Suspense>
13+
<suspense>
1414
<router-view />
15-
</Suspense>
15+
</suspense>
1616
</q-page-container>
1717

1818
<!-- this only opens the first sidebar in the list

src/layouts/MenuBar.vue

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ import { useSessionStore } from 'src/stores/session';
7474
import { useSettingsStore } from 'src/stores/settings';
7575
7676
import type { CourseSettingInfo } from 'src/common/models/settings';
77-
import { UserRole } from 'src/common/models/parsers';
7877
7978
defineEmits(['toggle-menu', 'toggle-sidebar']);
8079
const session = useSessionStore();
@@ -88,18 +87,26 @@ const full_name = computed(() => session.full_name);
8887
const user_courses = computed(() =>
8988
session.user_courses.filter(course => course.course_name !== current_course_name.value));
9089
91-
const changeCourse = (course_id: number, course_name: string) => {
90+
const changeCourse = (course_id?: number, course_name?: string) => {
91+
logger.debug(`[MenuBar/changeCourse]: changing the course to ${course_name ?? 'unknown'}`);
9292
const new_course = session.user_courses.find(course => course.course_name === course_name);
93+
const new_course_id = new_course?.course_id ?? 0;
94+
if (!new_course || new_course_id == 0) return;
95+
const role = new_course?.role ?? 'unknown';
96+
97+
if (role == 'unknown') {
98+
logger.error(['MenuBar/changeCourse: the role is not defined']);
99+
}
93100
94101
// This sets the path to the instructor or student dashboard.
95-
const role = new_course?.role === UserRole.instructor ?
96-
'instructor' : new_course?.role === UserRole.student ? 'student' : 'UNKNOWN';
102+
// This only works currently for roles of student/instructor. We'll need to think about
103+
// the UI for other roles.
97104
98105
if (new_course != undefined) {
99-
router.push(`/courses/${new_course.course_id}/${role}`).then(() => {
106+
router.push(`/courses/${new_course_id}/${role}`).then(() => {
100107
session.setCourse({
101-
course_name: new_course.course_name,
102-
course_id: new_course.course_id
108+
course_name: new_course.course_name ?? 'unknown',
109+
course_id: new_course_id
103110
});
104111
}).catch(() => {
105112
logger.error('[MenuBar/changeCourse]: Error occurred.');
Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
<template>
2-
<router-view />
2+
<suspense>
3+
<router-view />
4+
</suspense>
35
</template>
46

5-
<script lang="ts">
6-
import { defineComponent } from 'vue';
7+
<!-- Switched to a script setup block, which was needed to fix a number of errors.
8+
To use async within script setup, the router-view needs to be wrapped in a
9+
suspense tag.
10+
11+
Note as of aug-2022, this is still
12+
experimental/beta https://vuejs.org/api/sfc-script-setup.html#top-level-await
13+
-->
14+
15+
<script setup lang="ts">
716
import { useRoute } from 'vue-router';
817
import { setI18nLanguage } from 'boot/i18n';
918
import { logger } from 'boot/logger';
@@ -14,41 +23,30 @@ import { useProblemSetStore } from 'src/stores/problem_sets';
1423
import { useSessionStore } from 'src/stores/session';
1524
import { parseRouteCourseID } from 'src/router/utils';
1625
17-
// Eventually we'll switch to a script set-up block, but seems to be still
18-
// experimental/beta https://vuejs.org/api/sfc-script-setup.html#top-level-await
19-
20-
export default defineComponent({
21-
name: 'Instructor',
22-
props: {
23-
course_name: String,
24-
course_id: String
25-
},
26-
async setup() {
27-
const session = useSessionStore();
28-
const users = useUserStore();
29-
const settings = useSettingsStore();
30-
const problem_sets = useProblemSetStore();
31-
const route = useRoute();
32-
33-
const course_id = parseRouteCourseID(route);
34-
const course = session.user_courses.find(c => c.course_id === course_id);
35-
if (course) {
36-
session.setCourse({
37-
course_id,
38-
course_name: course.course_name
39-
});
40-
} else {
41-
logger.warn(`Can't find ${course_id} in ${session.user_courses
42-
.map((c) => c.course_id).join(', ')}`);
43-
}
44-
await users.fetchGlobalCourseUsers(course_id);
45-
await users.fetchCourseUsers(course_id);
46-
await problem_sets.fetchProblemSets(course_id);
47-
await settings.fetchDefaultSettings(course_id)
48-
.then(() => settings.fetchCourseSettings(course_id))
49-
.then(() => void setI18nLanguage(settings.getCourseSetting('language').value as string))
50-
.catch((err) => logger.error(`${JSON.stringify(err)}`));
51-
52-
},
53-
});
26+
const session = useSessionStore();
27+
const users = useUserStore();
28+
const settings = useSettingsStore();
29+
const problem_sets = useProblemSetStore();
30+
const route = useRoute();
31+
32+
const course_id = parseRouteCourseID(route);
33+
const course = session.user_courses.find(c => c.course_id === course_id);
34+
35+
if (course) {
36+
session.setCourse({
37+
course_id,
38+
course_name: course.course_name ?? 'unknown'
39+
});
40+
} else {
41+
logger.warn(`Can't find ${course_id} in ${session.user_courses
42+
.map((c) => c.course_id).join(', ')}`);
43+
}
44+
await users.fetchGlobalCourseUsers(course_id);
45+
await users.fetchCourseUsers(course_id);
46+
await problem_sets.fetchProblemSets(course_id);
47+
await settings.fetchDefaultSettings(course_id)
48+
.then(() => settings.fetchCourseSettings(course_id))
49+
.then(() => void setI18nLanguage(settings.getCourseSetting('language').value as string))
50+
.catch((err) => logger.error(`${JSON.stringify(err)}`));
51+
5452
</script>

0 commit comments

Comments
 (0)