from django.conf import settings from django.db import models from django.db.models import Q from django.utils import timezone class TaskQuerySet(models.QuerySet): def get_ordered(self): return self.order_by('task_list') class TaskManager(models.Manager): def get_tasks(self, user, completed): if completed: return self.get_queryset().get_ordered().filter(Q(assigned_to=user)) else: return self.get_queryset().get_ordered().filter( Q(assigned_to=user) & Q(completed=completed) ) 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) objects = models.Manager() def __str__(self): return self.name class Task(models.Model): title = models.CharField(max_length=140) task_list = models.ForeignKey(TaskList, on_delete=models.CASCADE, null=True) created_date = models.DateTimeField(auto_now_add=True) due_date = models.DateField(blank=True, null=True) completed = models.BooleanField(default=False) completed_date = models.DateField(blank=True, null=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, related_name="todo_created_by", on_delete=models.CASCADE, ) assigned_to = models.ForeignKey( settings.AUTH_USER_MODEL, blank=True, null=True, related_name="todo_assigned_to", on_delete=models.CASCADE, ) note = models.TextField(blank=True, null=True) priority = models.PositiveIntegerField(blank=True, null=True) objects = models.Manager() taskmanager = TaskManager() 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)