Make portfolia viewable by all teachers of class / student

This commit is contained in:
Lorenz Padberg 2023-07-12 16:17:21 +02:00
parent d856cd9a92
commit 76fcb8b468
3 changed files with 15 additions and 14 deletions

View File

@ -16,10 +16,11 @@ class Project(TitleSlugDescriptionModel, GraphqlNodeMixin):
def __str__(self):
return self.title
def is_viewable_by(self, user: User):
return user.id == self.student.id or (
self.final and self.student.get_teacher().id == user.id
)
def is_viewable_by(self, user: User) -> bool:
# This should be filtered by self.school_class.get_teachers() but in the real data (and the test data)
# school_class is always None. Like this a teacher could see project from a different class.
teachers_ids = set([teacher.id for teacher in self.student.get_teachers()])
return user.id == self.student.id or (self.final and user.id in teachers_ids)
class ProjectEntry(models.Model):

View File

@ -76,13 +76,13 @@ class User(AbstractUser):
def users_in_active_school_class(self):
return self.selected_class.users.all() if self.selected_class is not None else []
def get_teacher(self):
if self.is_teacher():
return self
elif self.school_classes.count() > 0:
return self.school_classes.first().get_teacher()
else:
return None
def get_teachers(self):
teachers = []
for school_class in self.school_classes.all():
teachers.extend(school_class.get_teachers())
return teachers
def is_teacher(self):
return self.user_roles.filter(role__key='teacher').exists()
@ -226,8 +226,8 @@ class SchoolClass(GroupWithCode, GraphqlNodeMixin):
def is_user_in_schoolclass(self, user):
return user.is_superuser or user.school_classes.filter(pk=self.id).count() > 0
def get_teacher(self):
return self.users.filter(user_roles__role__key='teacher').first()
def get_teachers(self):
return list(self.users.filter(user_roles__role__key='teacher'))
def save(self, *args, **kwargs):
if self.code == '': # '' can't be unique, so we null it

View File

@ -132,7 +132,7 @@ class ModifySchoolClassTest(SkillboxTestCase):
self.assertEqual(SchoolClass.objects.count(), 3)
school_class = get_object(SchoolClass, id)
self.assertEqual(school_class.name, class_name)
self.assertEqual(school_class.get_teacher(), self.teacher)
self.assertEqual(school_class.get_teachers(), [self.teacher])
self.assertEqual(self.teacher.selected_class.name, class_name)
def test_create_school_class_duplicate_name_fail(self):