summaryrefslogtreecommitdiffstats
path: root/todolists
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-12-22 02:26:35 +0100
committerDan McGee <dan@archlinux.org>2012-12-28 16:19:17 +0100
commit8be27a5cafde87c439b19f64a7c215410c88484b (patch)
treeed8f6e65870da38967663bf2d4fb9290f537dea2 /todolists
parentbf4385a26c1b6f07bf9bdcddf7160b5eb4a71d9a (diff)
downloadarchweb-8be27a5cafde87c439b19f64a7c215410c88484b.tar.gz
archweb-8be27a5cafde87c439b19f64a7c215410c88484b.tar.xz
Add new todolists and todolist package model
Move the todolist model from main to the todolists application, and make a few minor tweaks to field names along the way. Also add a 'raw' field that will hold the originally input text data from the creator or last modifier of the todolist. Add pkgname, pkgbase, arch, and repo fields to a new todolist package model, which will supplement the former foreign key to an actual package object. This will prevent todolist package objects from ever being deleted as they can be now, which is not intuitive. Also change the current boolean 'complete' flag to a 'status' enum that can hold other values. For now, we add 'In-progress' to the mix. Finally, add a 'user' field, and a 'comments' field that will be utilized later by the UI. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'todolists')
-rw-r--r--todolists/migrations/0002_add_todolist_and_todolistpackage.py151
-rw-r--r--todolists/models.py81
2 files changed, 232 insertions, 0 deletions
diff --git a/todolists/migrations/0002_add_todolist_and_todolistpackage.py b/todolists/migrations/0002_add_todolist_and_todolistpackage.py
new file mode 100644
index 0000000..8365535
--- /dev/null
+++ b/todolists/migrations/0002_add_todolist_and_todolistpackage.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ db.create_table('todolists_todolist', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('old_id', self.gf('django.db.models.fields.IntegerField')(unique=True, null=True)),
+ ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('description', self.gf('django.db.models.fields.TextField')()),
+ ('creator', self.gf('django.db.models.fields.related.ForeignKey')(related_name='created_todolists', on_delete=models.PROTECT, to=orm['auth.User'])),
+ ('created', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
+ ('last_modified', self.gf('django.db.models.fields.DateTimeField')()),
+ ('raw', self.gf('django.db.models.fields.TextField')(blank=True)),
+ ))
+ db.send_create_signal('todolists', ['Todolist'])
+
+ db.create_table('todolists_todolistpackage', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('todolist', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['todolists.Todolist'])),
+ ('pkg', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Package'], null=True, on_delete=models.SET_NULL)),
+ ('pkgname', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('pkgbase', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ('arch', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Arch'])),
+ ('repo', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Repo'])),
+ ('created', self.gf('django.db.models.fields.DateTimeField')()),
+ ('status', self.gf('django.db.models.fields.SmallIntegerField')(default=0)),
+ ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, on_delete=models.SET_NULL)),
+ ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ))
+ db.send_create_signal('todolists', ['TodolistPackage'])
+
+ db.create_unique('todolists_todolistpackage', ['todolist_id', 'pkgname', 'arch_id'])
+
+
+ def backwards(self, orm):
+ db.delete_unique('todolists_todolistpackage', ['todolist_id', 'pkgname', 'arch_id'])
+
+ db.delete_table('todolists_todolist')
+
+ db.delete_table('todolists_todolistpackage')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'main.arch': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Arch', 'db_table': "'arches'"},
+ 'agnostic': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+ },
+ 'main.package': {
+ 'Meta': {'ordering': "('pkgname',)", 'unique_together': "(('pkgname', 'repo', 'arch'),)", 'object_name': 'Package', 'db_table': "'packages'"},
+ 'arch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'packages'", 'on_delete': 'models.PROTECT', 'to': "orm['main.Arch']"}),
+ 'build_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
+ 'compressed_size': ('main.fields.PositiveBigIntegerField', [], {}),
+ 'epoch': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'files_last_update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'flag_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'installed_size': ('main.fields.PositiveBigIntegerField', [], {}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+ 'packager': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+ 'packager_str': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'pgp_signature': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'pkgbase': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'pkgdesc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ 'pkgname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'pkgrel': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'pkgver': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'repo': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'packages'", 'on_delete': 'models.PROTECT', 'to': "orm['main.Repo']"}),
+ 'url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'})
+ },
+ 'main.repo': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Repo', 'db_table': "'repos'"},
+ 'bugs_category': ('django.db.models.fields.SmallIntegerField', [], {'default': '2'}),
+ 'bugs_project': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+ 'staging': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'svn_root': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'testing': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'todolists.todolist': {
+ 'Meta': {'object_name': 'Todolist'},
+ 'created': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+ 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_todolists'", 'on_delete': 'models.PROTECT', 'to': "orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_modified': ('django.db.models.fields.DateTimeField', [], {}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'old_id': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True'}),
+ 'raw': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ 'todolists.todolistpackage': {
+ 'Meta': {'unique_together': "(('todolist', 'pkgname', 'arch'),)", 'object_name': 'TodolistPackage'},
+ 'arch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Arch']"}),
+ 'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'pkg': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Package']", 'null': 'True', 'on_delete': 'models.SET_NULL'}),
+ 'pkgbase': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'pkgname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'repo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Repo']"}),
+ 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
+ 'todolist': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['todolists.Todolist']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'})
+ }
+ }
+
+ complete_apps = ['todolists']
diff --git a/todolists/models.py b/todolists/models.py
index e69de29..7af7faf 100644
--- a/todolists/models.py
+++ b/todolists/models.py
@@ -0,0 +1,81 @@
+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))
+ return self.order_by().filter(not_done).distinct()
+
+
+class Todolist(models.Model):
+ 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/%i/' % self.id
+
+ 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())
+
+
+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()
+ status = models.SmallIntegerField(default=0, 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'),)
+
+ 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: