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
.pnp.cjs
.pnp.loader.mjs
.git/
......@@ -12,6 +12,11 @@ export default {
required: false,
default: false,
},
prependIcon: {
type: String,
default: null,
required: false,
},
appendIcon: {
type: String,
default: null,
......@@ -28,6 +33,7 @@ export default {
:color="subject.colourBg"
:text-color="subject.colourFg"
>
<v-icon left v-if="prependIcon">{{ prependIcon }}</v-icon>
{{ shortName ? subject.shortName : subject.name }}
<v-icon right v-if="appendIcon">{{ appendIcon }}</v-icon>
</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 {
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 & (
)
add_perm("cursus.view_subjects_rule", view_subjects_predicate)
view_subject_predicate = has_person & (
has_global_perm("cursus.view_subject") | has_object_perm("cursus.view_subject")
)
view_subject_predicate = has_person
add_perm("cursus.view_subject_rule", view_subject_predicate)
create_subject_predicate = has_person & has_global_perm("cursus.add_subject")
......@@ -38,12 +36,15 @@ view_courses_predicate = has_person & (
)
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
| has_global_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")
add_perm("cursus.create_course_rule", create_course_predicate)
......
......@@ -56,7 +56,9 @@ class SubjectType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@classmethod
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
def resolve_courses(root, info, **kwargs):
......@@ -127,6 +129,8 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@staticmethod
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())
# 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):
@staticmethod
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(
info.context.user, "core.view_group", root.groups.all()
)
......@@ -151,12 +157,25 @@ class CourseType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@classmethod
def get_queryset(cls, queryset, info):
# FIXME: Permissions... this is just a workaround,
# because cursus.view_course would have to be assigned manually
if not has_person(info.context.user):
if not info.context.user.has_perm("cursus.view_course_rule"):
raise PermissionDenied()
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):
......@@ -215,7 +234,7 @@ class Query(graphene.ObjectType):
school_grades = FilterOrderList(GraphQLGroupType)
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())
courses_of_teacher = FilterOrderList(CourseType, teacher=graphene.ID())
......