from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.db import models from django.db.models import Q from django.db.models.signals import pre_save from main.models import Arch, Repo, Package from main.utils import set_created_field class TodolistManager(models.Manager): def incomplete(self): not_done = ((Q(todolistpackage__status=TodolistPackage.INCOMPLETE) | Q(todolistpackage__status=TodolistPackage.IN_PROGRESS)) & Q(todolistpackage__removed__isnull=True)) return self.order_by().filter(not_done).distinct() class Todolist(models.Model): slug = models.SlugField(max_length=255, unique=True) old_id = models.IntegerField(null=True, unique=True) name = models.CharField(max_length=255) description = models.TextField() creator = models.ForeignKey(User, on_delete=models.PROTECT, related_name="created_todolists") created = models.DateTimeField(db_index=True) last_modified = models.DateTimeField(editable=False) raw = models.TextField(blank=True) objects = TodolistManager() class Meta: get_latest_by = 'created' def __unicode__(self): return self.name @property def stripped_description(self): return self.description.strip() def get_absolute_url(self): return '/todo/%s/' % self.slug def get_full_url(self, proto='https'): '''get a URL suitable for things like email including the domain''' domain = Site.objects.get_current().domain return '%s://%s%s' % (proto, domain, self.get_absolute_url()) def packages(self): if not hasattr(self, '_packages'): self._packages = self.todolistpackage_set.filter( removed__isnull=True).select_related( 'pkg', 'repo', 'arch', 'user__username').order_by( 'pkgname', 'arch') return self._packages class TodolistPackage(models.Model): INCOMPLETE = 0 COMPLETE = 1 IN_PROGRESS = 2 STATUS_CHOICES = ( (INCOMPLETE, 'Incomplete'), (COMPLETE, 'Complete'), (IN_PROGRESS, 'In-progress'), ) todolist = models.ForeignKey(Todolist) pkg = models.ForeignKey(Package, null=True, on_delete=models.SET_NULL) pkgname = models.CharField(max_length=255) pkgbase = models.CharField(max_length=255) arch = models.ForeignKey(Arch) repo = models.ForeignKey(Repo) created = models.DateTimeField(editable=False) last_modified = models.DateTimeField(editable=False) removed = models.DateTimeField(null=True, blank=True) status = models.SmallIntegerField(default=INCOMPLETE, choices=STATUS_CHOICES) user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL) comments = models.TextField(null=True, blank=True) class Meta: unique_together = (('todolist', 'pkgname', 'arch'),) get_latest_by = 'created' def __unicode__(self): return self.pkgname def status_css_class(self): return self.get_status_display().lower().replace('-', '') pre_save.connect(set_created_field, sender=Todolist, dispatch_uid="todolists.models") pre_save.connect(set_created_field, sender=TodolistPackage, dispatch_uid="todolists.models") # vim: set ts=4 sw=4 et: