from django.db import models from django.contrib.auth.models import User from django.template.defaultfilters import slugify from saudade.todo import util from saudade.common.help import markdown STATUS_CHOICES = ( ('C', 'Complete'), ('A', 'Abandoned'), ('O', 'Open'), ) PRIORITY_CHOICES = ( ('1VH', 'Very High'), ('2H', 'High'), ('3N', 'Normal'), ('4L', 'Low'), ('5VL', 'Very Low'), ) class Group(models.Model, util.superModel): name = models.CharField(max_length=100) desc = models.TextField(help_text=markdown, blank=True) title = models.CharField(max_length=100, help_text="title text for group link") slug = models.SlugField(prepopulate_from=('name',), help_text='prepopulated from name') class Admin: list_display = ('name', 'title') search_fields = ('name', 'title', 'desc') list_filter = ('name',) def __repr__(self): return self.name def __str__(self): return self.__repr__() # return a list of task ojects for this group def get_tasks(self): return Task.objects.all().filter(group=self).filter(status='O').order_by('priority') def get_absolute_url(self): return "/todo/groups/%s" % (self.slug) def get_link(self): return '%s' % (self.get_absolute_url(), self.name) def _filter_value(key, value): if key.lower() == 'desc': if value == None: value = '' return value def _create_post(request, group=None): post = Group._merge_post(request, group) post['slug'] = slugify(post['name']) return post def ajaxEdit(request, id): group = Group.objects.get(id=id) return Group._create_post(request, group=group) def ajaxAdd(request): return Group._create_post(request) _filter_value = staticmethod(_filter_value) _create_post = staticmethod(_create_post) ajaxEdit = staticmethod(ajaxEdit) ajaxAdd = staticmethod(ajaxAdd) class Task(models.Model, util.superModel): user = models.ForeignKey(User) name = models.CharField(max_length=100) slug = models.SlugField(prepopulate_from=('name',), help_text='prepopulated from name') desc = models.TextField(help_text=markdown, blank=True) notes = models.TextField(help_text=markdown, blank=True) status = models.CharField(max_length=50, choices=STATUS_CHOICES, default='O') created_date = models.DateTimeField(auto_now_add=True) completed_date = models.DateTimeField('Completion Date', blank=True, null=True) priority = models.CharField(max_length=50, choices=PRIORITY_CHOICES, default='3N') depends = models.ForeignKey('Task', blank=True, null=True) group = models.ForeignKey(Group, default='1') class Admin: list_display = ('name', 'status', 'priority', 'created_date') search_fields = ('name', 'desc', 'notes') list_filter = ('priority', 'status') fields = ( ('Task Data', {'fields' : ('user', 'name', 'slug', 'desc', 'notes')}), ('Task Metas', {'fields': ('group', 'priority', 'status', 'depends', 'completed_date')}), ) def get_absolute_url(self): return "/todo/tasks/%s" % (self.slug) def get_admin_url(self): return "/admin/todo/task/%d" % (self.id) def __str__(self): return self.name def _filter_value(key, value): """called by _merge_post, re-implementing here to actually filter things""" if key.lower() == 'group': try: value = int(value) except: try: value = Group.objects.get(name=value).id except: return False elif key.lower() == 'priority': for s,l in PRIORITY_CHOICES: if value.lower() == l.lower() or value.lower() == s.lower(): return s elif key.lower() == 'desc': if value == None: value = '' return value def _create_post(request, task=None): post = Task._merge_post(request, task) post['user'] = request.user.id post['slug'] = slugify(post['name']) return post def ajaxEdit(request, id): task = Task.objects.get(id=id) return Task._create_post(request, task=task) def ajaxAdd(request): return Task._create_post(request) _create_post = staticmethod(_create_post) _filter_value = staticmethod(_filter_value) ajaxAdd = staticmethod(ajaxAdd) ajaxEdit = staticmethod(ajaxEdit)