from django.contrib.auth import get_user_model from django.db import models from django_extensions.db.models import TitleSlugDescriptionModel from core.mixins import GraphqlNodeMixin from users.models import User class Project(TitleSlugDescriptionModel, GraphqlNodeMixin): objectives = models.TextField(blank=True) appearance = models.CharField(blank=True, null=False, max_length=255) student = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='projects') final = models.BooleanField(default=False) school_class = models.ForeignKey('users.SchoolClass', null=True, default=None, on_delete=models.SET_NULL) def __str__(self): return self.title 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): activity = models.TextField(blank=True) reflection = models.TextField(blank=True) next_steps = models.TextField(blank=True) document_url = models.TextField(blank=True) description = models.TextField(blank=True) created = models.DateTimeField(auto_now_add=True) project = models.ForeignKey(Project, related_name='entries', on_delete=models.CASCADE) def __str__(self): return self.description