Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/onboarding/AlekSIS-App-Cursus
  • sestioXcongwa/AlekSIS-App-Cursus
  • igigtrorta/AlekSIS-App-Cursus
3 results
Show changes
Commits on Source (13)
...@@ -92,3 +92,5 @@ aleksis/core/util/licenses.json ...@@ -92,3 +92,5 @@ aleksis/core/util/licenses.json
.pnp.cjs .pnp.cjs
.pnp.loader.mjs .pnp.loader.mjs
.git/
...@@ -12,6 +12,11 @@ export default { ...@@ -12,6 +12,11 @@ export default {
required: false, required: false,
default: false, default: false,
}, },
prependIcon: {
type: String,
default: null,
required: false,
},
appendIcon: { appendIcon: {
type: String, type: String,
default: null, default: null,
...@@ -28,6 +33,7 @@ export default { ...@@ -28,6 +33,7 @@ export default {
:color="subject.colourBg" :color="subject.colourBg"
:text-color="subject.colourFg" :text-color="subject.colourFg"
> >
<v-icon left v-if="prependIcon">{{ prependIcon }}</v-icon>
{{ shortName ? subject.shortName : subject.name }} {{ shortName ? subject.shortName : subject.name }}
<v-icon right v-if="appendIcon">{{ appendIcon }}</v-icon> <v-icon right v-if="appendIcon">{{ appendIcon }}</v-icon>
</v-chip> </v-chip>
......
<script setup>
import SubjectChip from "./SubjectChip.vue";
</script>
<template>
<v-autocomplete
v-bind="$attrs"
v-on="$listeners"
multiple
:items="teacherList"
item-text="fullName"
item-value="id"
:loading="$apollo.queries.persons.loading"
>
<template #item="data">
<v-list-item-action>
<v-checkbox v-model="data.attrs.inputValue" />
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>{{ data.item.fullName }}</v-list-item-title>
<v-list-item-subtitle v-if="data.item.shortName"
>{{ data.item.shortName }}
</v-list-item-subtitle>
<v-list-item-subtitle
v-if="showSubjects && data.item.subjectsAsTeacher.length"
>
<subject-chip
v-for="subject in data.item.subjectsAsTeacher"
:key="subject.id"
:subject="subject"
:prepend-icon="subject.id === prioritySubject.id ? '$success' : ''"
:short-name="true"
x-small
class="mr-1"
/>
</v-list-item-subtitle>
</v-list-item-content>
</template>
<template #prepend-inner>
<slot name="prepend-inner" />
</template>
<template #selection="data">
<slot name="selection" v-bind="data" />
</template>
</v-autocomplete>
</template>
<script>
import { gqlTeachers } from "./helper.graphql";
export default {
name: "TeacherField",
data() {
return {
persons: [],
};
},
props: {
showSubjects: {
type: Boolean,
required: false,
default: false,
},
prioritySubject: {
type: Object,
required: false,
default: null,
},
},
computed: {
teacherList() {
if (this.prioritySubject) {
let matching = [];
let nonMatching = [];
this.persons.forEach((p) => {
if (
p.subjectsAsTeacher.some((s) => s.id === this.prioritySubject.id)
) {
matching.push(p);
} else {
nonMatching.push(p);
}
});
return matching.concat(nonMatching);
} else {
return this.persons;
}
},
},
apollo: {
persons: {
query: gqlTeachers,
},
},
};
</script>
<style scoped></style>
...@@ -12,3 +12,18 @@ query gqlGroups { ...@@ -12,3 +12,18 @@ query gqlGroups {
name name
} }
} }
query gqlTeachers {
persons: teachers {
id
fullName
shortName
subjectsAsTeacher {
id
name
shortName
colourFg
colourBg
}
}
}
from django.apps import apps
from django.db.models import Model
from django.utils.translation import gettext as _
from .models import Course, Subject
if apps.is_installed("aleksis.apps.csv_import"):
from aleksis.apps.csv_import.field_types import ProcessFieldType
class GroupSubjectByShortNameFieldType(ProcessFieldType):
name = "group_subject_short_name"
verbose_name = _("Short name of the subject")
def process(self, instance: Model, value):
subject, __ = Subject.objects.get_or_create(short_name=value, defaults={"name": value})
instance.subject = subject
instance.save()
class SubjectByShortNameFieldType(ProcessFieldType):
name = "subject_by_short_name"
verbose_name = _("Short name of the subject")
run_before_save = True
def process(self, instance: Model, value):
subject, __ = Subject.objects.get_or_create(short_name=value, defaults={"name": value})
instance.subject = subject
class CourseByUniqueReferenceFieldType(ProcessFieldType):
name = "course_by_unique_reference"
verbose_name = _("Short name of the subject")
run_before_save = True
def process(self, instance: Model, value):
course = Course.objects.get(extended_data__import_ref_csv=value)
instance.course = course
...@@ -15,9 +15,7 @@ view_subjects_predicate = has_person & ( ...@@ -15,9 +15,7 @@ view_subjects_predicate = has_person & (
) )
add_perm("cursus.view_subjects_rule", view_subjects_predicate) add_perm("cursus.view_subjects_rule", view_subjects_predicate)
view_subject_predicate = has_person & ( view_subject_predicate = has_person
has_global_perm("cursus.view_subject") | has_object_perm("cursus.view_subject")
)
add_perm("cursus.view_subject_rule", view_subject_predicate) add_perm("cursus.view_subject_rule", view_subject_predicate)
create_subject_predicate = has_person & has_global_perm("cursus.add_subject") create_subject_predicate = has_person & has_global_perm("cursus.add_subject")
...@@ -38,12 +36,15 @@ view_courses_predicate = has_person & ( ...@@ -38,12 +36,15 @@ view_courses_predicate = has_person & (
) )
add_perm("cursus.view_courses_rule", view_courses_predicate) add_perm("cursus.view_courses_rule", view_courses_predicate)
view_course_predicate = has_person & ( view_course_predicate = has_person
add_perm("cursus.view_course_rule", view_course_predicate)
view_course_details_predicate = has_person & (
is_course_teacher is_course_teacher
| has_global_perm("cursus.view_course") | has_global_perm("cursus.view_course")
| has_object_perm("cursus.view_course") | has_object_perm("cursus.view_course")
) )
add_perm("cursus.view_course_rule", view_course_predicate) add_perm("cursus.view_course_details_rule", view_course_details_predicate)
create_course_predicate = has_person & has_global_perm("cursus.add_course") create_course_predicate = has_person & has_global_perm("cursus.add_course")
add_perm("cursus.create_course_rule", create_course_predicate) add_perm("cursus.create_course_rule", create_course_predicate)
......
...@@ -56,7 +56,9 @@ class SubjectType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType): ...@@ -56,7 +56,9 @@ class SubjectType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@classmethod @classmethod
def get_queryset(cls, queryset, info): def get_queryset(cls, queryset, info):
return get_objects_for_user(info.context.user, "cursus.view_subject", Subject) if not info.context.user.has_perm("cursus.view_subject_rule"):
raise PermissionDenied()
return queryset
@staticmethod @staticmethod
def resolve_courses(root, info, **kwargs): def resolve_courses(root, info, **kwargs):
...@@ -127,6 +129,8 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType): ...@@ -127,6 +129,8 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@staticmethod @staticmethod
def resolve_teachers(root, info, **kwargs): def resolve_teachers(root, info, **kwargs):
if not info.context.user.has_perm("cursus.view_course_details_rule", root):
raise PermissionDenied()
teachers = get_objects_for_user(info.context.user, "core.view_person", root.teachers.all()) teachers = get_objects_for_user(info.context.user, "core.view_person", root.teachers.all())
# Fixme: this following code was copied from aleksis/core/schema/group.py so it should work # Fixme: this following code was copied from aleksis/core/schema/group.py so it should work
...@@ -139,6 +143,8 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType): ...@@ -139,6 +143,8 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@staticmethod @staticmethod
def resolve_groups(root, info, **kwargs): def resolve_groups(root, info, **kwargs):
if not info.context.user.has_perm("cursus.view_course_details_rule", root):
raise PermissionDenied()
by_permission = get_objects_for_user( by_permission = get_objects_for_user(
info.context.user, "core.view_group", root.groups.all() info.context.user, "core.view_group", root.groups.all()
) )
...@@ -151,12 +157,25 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType): ...@@ -151,12 +157,25 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@classmethod @classmethod
def get_queryset(cls, queryset, info): def get_queryset(cls, queryset, info):
# FIXME: Permissions... this is just a workaround, if not info.context.user.has_perm("cursus.view_course_rule"):
# because cursus.view_course would have to be assigned manually
if not has_person(info.context.user):
raise PermissionDenied() raise PermissionDenied()
return queryset return queryset
# return get_objects_for_user(info.context.user, "cursus.view_course", Course)
class TeacherType(GraphQLPersonType):
class Meta:
model = Person
subjects_as_teacher = graphene.List(SubjectType)
courses_as_teacher = graphene.List(CourseType)
@staticmethod
def resolve_subjects_as_teacher(root, info, **kwargs):
return root.subjects_as_teacher.all()
@staticmethod
def resolve_courses_as_teacher(root, info, **kwargs):
return root.courses_as_teacher.all()
class CourseBatchCreateMutation(DjangoBatchCreateMutation): class CourseBatchCreateMutation(DjangoBatchCreateMutation):
...@@ -215,7 +234,7 @@ class Query(graphene.ObjectType): ...@@ -215,7 +234,7 @@ class Query(graphene.ObjectType):
school_grades = FilterOrderList(GraphQLGroupType) school_grades = FilterOrderList(GraphQLGroupType)
school_grades_by_term = FilterOrderList(GraphQLGroupType, school_term=graphene.ID()) school_grades_by_term = FilterOrderList(GraphQLGroupType, school_term=graphene.ID())
teachers = FilterOrderList(GraphQLPersonType) teachers = FilterOrderList(TeacherType)
course_by_id = graphene.Field(CourseType, id=graphene.ID()) course_by_id = graphene.Field(CourseType, id=graphene.ID())
courses_of_teacher = FilterOrderList(CourseType, teacher=graphene.ID()) courses_of_teacher = FilterOrderList(CourseType, teacher=graphene.ID())
......