Files
fet2020/fet2020/tasks/models.py

146 lines
4.2 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.contrib.auth.models import User
from django.core.validators import ValidationError
from django.db import models
from django.db.models import F
from django.db.models.constraints import UniqueConstraint
from django.urls import reverse
from django.utils import timezone
from django.utils.text import slugify
from documents import create_pad
from documents.api import get_pad_link
from fet2020.utils import create_random_id
from .managers import TaskManager
class TaskList(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128, unique=True, blank=True)
slug = models.SlugField(unique=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
def get_absolute_url(self):
return reverse("tasks:index")
def clean(self):
if not self.shortterm:
self.shortterm = slugify(self.name)
self.slug = slugify(self.shortterm)
class Task(models.Model):
title = models.CharField(verbose_name="Titel", max_length=128)
slug_id = models.CharField(
default=create_random_id, max_length=8, unique=True, editable=False
)
slug = models.SlugField(unique=True, blank=True)
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:
ordering = ("task_list", F("due_date").desc(nulls_first=True))
verbose_name = "Aufgabe"
verbose_name_plural = "Aufgaben"
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("tasks:task", kwargs={"slug": self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.slug_id + "-" + slugify(self.title)
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)
slug_id = models.CharField(
default=create_random_id, max_length=8, unique=True, editable=False
)
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"
def __str__(self):
return self.title
def get_absolute_url(self):
return get_pad_link(self.etherpad_key)
def clean(self):
pad_name = slugify(str(self.slug_id) + "-" + self.title[:40])
if len(pad_name) > 50:
raise ValidationError(
f"Name zum Erstellen des Etherpads ist zu lange - max. 50 Zeichen. (Länge: {len(pad_name)}, Name: {pad_name})"
)
self.etherpad_key = create_pad(pad_name)
if not self.etherpad_key:
raise ValidationError(
f"Etherpad '{pad_name}' konnte nicht erstellt werden."
)