summaryrefslogtreecommitdiff
path: root/todolists/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'todolists/models.py')
-rw-r--r--todolists/models.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/todolists/models.py b/todolists/models.py
new file mode 100644
index 00000000..3ea80f37
--- /dev/null
+++ b/todolists/models.py
@@ -0,0 +1,94 @@
+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
+
+ 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').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: