from django.db import models from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import Group as BuiltinGroup from .util import get_week_range import base64 class User(AbstractUser): groups = models.ManyToManyField( "auth.Group", related_name="user_groups", blank=True, ) user_permissions = models.ManyToManyField( "auth.Permission", related_name="user_permissions", blank=True, ) class Group(BuiltinGroup): class Meta: proxy = True class ReportKind(models.TextChoices): WEEKLY = "weekly" DAILY = "daily" class Berichtsheft(models.Model): id = models.AutoField(primary_key=True) user = models.TextField() kind = models.CharField( max_length=20, choices=ReportKind.choices, default=ReportKind.WEEKLY ) num = models.PositiveBigIntegerField(default=0) year = models.PositiveIntegerField() week = models.PositiveSmallIntegerField() department = models.CharField(max_length=160, default="") content = models.JSONField() needs_rewrite = models.BooleanField(default=False) created = models.DateTimeField(auto_now_add=True) image = models.BinaryField(null=True, blank=True) def __str__(self): return f"Berichtsheft: {self.user}, Year: {self.year}, Week: {self.week}" @property def is_approved(self): approvals = Approval.objects.filter(report=self.id) return len(approvals) >= 2 def vars(self): start_date, end_date = get_week_range(self.year, self.week) vars = { "user": self.user, "kind": self.kind, "num": self.num, "year": self.year, "week": self.week, "department": self.department, "start_date": start_date, "end_date": end_date, "image": base64.b64encode(self.image).decode("utf-8") if self.image is not None else None, } for key, val in self.content.items(): vars[key] = val return vars class Approval(models.Model): id = models.AutoField(primary_key=True) user = models.TextField() report = models.ForeignKey( Berichtsheft, on_delete=models.CASCADE, related_name="report" ) class BerichtsheftDraft(models.Model): user = models.TextField(primary_key=True) department = models.CharField(max_length=160, default="") content = models.JSONField()