37 lines
1.6 KiB
Python
37 lines
1.6 KiB
Python
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
|