Files
fet2020/fet2020/tasks/models.py

153 lines
4.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import date
from django.conf import settings
from django.core.validators import ValidationError
from django.contrib.auth.models import User
from django.db import models
from django.db.models import Q
from django.db.models.constraints import UniqueConstraint
from django.utils import timezone
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
from documents import createPadifNotExists
class TaskQuerySet(models.QuerySet):
def get_ordered(self):
return self.order_by("task_list")
class TaskManager(models.Manager):
def get_tasks(self, user, completed, task_list, all_tasks):
# None ... assigned to all users
qs = self.get_queryset().get_ordered().filter(assigned_to__id=user)
if all_tasks:
qs_tmp = (
self.get_queryset()
.get_ordered()
.filter(Q(assigned_to=None) & Q(task_list__users__id__exact=user))
)
qs = (qs | qs_tmp).distinct()
if not completed:
qs = qs.filter(completed=completed)
if task_list:
qs = qs.filter(task_list=task_list)
return qs
def get_queryset(self):
return TaskQuerySet(self.model, using=self._db)
class TaskList(models.Model):
name = models.CharField(max_length=60)
slug = models.SlugField(unique=True, null=True, blank=True)
users = models.ManyToManyField(User, blank=True)
objects = models.Manager()
class Meta:
verbose_name = "Auf­ga­ben­be­reich"
verbose_name_plural = "Auf­ga­ben­be­reiche"
def __str__(self):
return self.name
class Task(models.Model):
title = models.CharField(verbose_name="Titel", max_length=140)
task_list = models.ForeignKey(
TaskList, verbose_name="Aufgabenbereich", on_delete=models.CASCADE, null=True
)
created_date = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(verbose_name="Fälligkeit", blank=True, null=True)
completed = models.BooleanField(verbose_name="Abgeschlossen", default=False)
completed_date = models.DateField(blank=True, null=True)
created_by = models.ForeignKey(
User,
related_name="created_by",
on_delete=models.CASCADE,
)
assigned_to = models.ForeignKey(
User,
blank=True,
null=True,
related_name="assigned_to",
on_delete=models.CASCADE,
verbose_name="Zugewiesen an",
)
note = models.TextField(verbose_name="Notizen", blank=True, null=True)
priority = models.PositiveIntegerField(
verbose_name="Priorität", blank=True, null=True
)
objects = models.Manager()
taskmanager = TaskManager()
class Meta:
verbose_name = "Aufgabe"
verbose_name_plural = "Aufgaben"
def __str__(self):
return self.title
def save(self, *args, **kwargs):
if self.completed and not self.completed_date:
self.completed_date = timezone.now().date()
if not self.completed and self.completed_date:
self.completed_date = None
super().save(*args, **kwargs)
class Document(models.Model):
title = models.CharField(verbose_name="Titel", max_length=128)
etherpad_key = models.CharField(max_length=50, blank=True)
date = models.DateField(verbose_name="Datum", default=date.today)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
objects = models.Manager()
class Meta:
verbose_name = "Dokument"
verbose_name_plural = "Dokumente"
constraints = [
UniqueConstraint(
fields=["title", "date", "task"], name="unique_task_document"
),
]
def clean(self):
pad_name = slugify(
str(self.date) + "-" + self.task.title + "-" + slugify(self.title)
)
if len(pad_name) > 50:
raise ValidationError(
_(
"Name zum Erstellen des Etherpads ist zu lange - max. 50 Zeichen. (Länge: %(length)s, Name: %(pad_name)s)"
),
params={"length": len(pad_name), "pad_name": pad_name},
)
def save(self, *args, **kwargs):
self.etherpad_key = createPadifNotExists(
slugify(str(self.date) + "-" + self.task.title + "-" + slugify(self.title))
)
super().save(*args, **kwargs)
def __str__(self):
return self.title