From 970eeafc1edd7f5889cb6584be292ae9aa07b135 Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Fri, 9 Jul 2010 22:46:01 -0400 Subject: Cleaning up models and creating custom admin settings for projects. --- snakeplan/projects/__init__.py | 0 snakeplan/projects/admin.py | 20 +++++++---- snakeplan/projects/models.py | 70 ++++++++++++++++++++++-------------- snakeplan/projects/urls.py | 14 ++++---- snakeplan/projects/views/projects.py | 2 +- 5 files changed, 66 insertions(+), 40 deletions(-) mode change 100755 => 100644 snakeplan/projects/__init__.py mode change 100755 => 100644 snakeplan/projects/models.py diff --git a/snakeplan/projects/__init__.py b/snakeplan/projects/__init__.py old mode 100755 new mode 100644 diff --git a/snakeplan/projects/admin.py b/snakeplan/projects/admin.py index 3970fb0..981e4e5 100644 --- a/snakeplan/projects/admin.py +++ b/snakeplan/projects/admin.py @@ -19,10 +19,18 @@ SnakePlan Admin Setup # limitations under the License. from snakeplan.projects import models -from django.contrib import admin +from django.contrib.admin import ModelAdmin, site -admin.site.register(models.Task) -admin.site.register(models.Story) -admin.site.register(models.Project) -admin.site.register(models.Iteration) -admin.site.register(models.LoggedTime) + +class ProjectAdmin(ModelAdmin): + + list_display = ('name', 'active') + ordering = ('name', ) + + +site.register(models.Task) +site.register(models.Story) +site.register(models.Project, ProjectAdmin) +site.register(models.Iteration) +site.register(models.DevelopmentIteration) +site.register(models.LoggedTime) diff --git a/snakeplan/projects/models.py b/snakeplan/projects/models.py old mode 100755 new mode 100644 index f6a54f1..e707bb2 --- a/snakeplan/projects/models.py +++ b/snakeplan/projects/models.py @@ -24,8 +24,13 @@ from django.contrib.auth.models import User STATUSES = ( - (0, 'Active'), - (1, 'Inactive'), + (0, 'Draft'), + (1, 'Defined'), + (2, 'Estimated'), + (3, 'Planned'), + (4, 'Implemented'), + (5, 'Verified'), + (6, 'Accepted'), ) DISPOSITIONS = ( @@ -47,10 +52,9 @@ TASK_TYPES = ( class Project(Model): name = m.CharField(max_length=200) - description = m.TextField(blank=True) + description = m.TextField(blank=True, null=True) active = m.BooleanField(default=True) - hidden = m.BooleanField(default=False) - wiki_link = m.URLField(blank=True) + wiki_link = m.URLField(blank=True, null=True) def __unicode__(self): return self.name @@ -58,33 +62,43 @@ class Project(Model): class Iteration(Model): - name = m.CharField(max_length=200) project = m.ForeignKey(Project) - status = m.IntegerField(choices=STATUSES, default=0) - start_date = m.DateField() - end_date = m.DateField() - days_worked = m.DecimalField(default=0, decimal_places=2, max_digits=5) - description = m.TextField(blank=True) + + name = m.CharField(max_length=200) + description = m.TextField(blank=True, null=True) + + # It should not be possible to delete the backlog + can_delete = m.BooleanField(default=True) def __unicode__(self): return self.name +# Not all iterations are actually open for development +# for example, the Backlog is not a development iteration. +class DevelopmentIteration(Iteration): + + active = m.BooleanField(default=True) + start_date = m.DateField(blank=True, null=True) + end_date = m.DateField(blank=True, null=True) + + class Story(Model): class Meta: verbose_name_plural = 'Stories' - name = m.CharField(max_length=200) iteration = m.ForeignKey(Iteration) - disposition = m.IntegerField(choices=DISPOSITIONS) - customer = m.ForeignKey(User, blank=True, null=True, - related_name='story_customer') tracker = m.ForeignKey(User, blank=True, null=True) + customer = m.ForeignKey(User, blank=True, null=True, + related_name='story_customer') + + name = m.CharField(max_length=200) + disposition = m.IntegerField(choices=DISPOSITIONS, default=0) status = m.IntegerField(choices=STATUSES, default=0) priority = m.IntegerField() order = m.IntegerField() - description = m.TextField(blank=True) + description = m.TextField(blank=True, null=True) def __unicode__(self): return self.name @@ -92,13 +106,15 @@ class Story(Model): class Task(Model): - name = m.CharField(max_length=200) story = m.ForeignKey(Story) - task_type = m.IntegerField(choices=TASK_TYPES) - disposition = m.IntegerField(choices=DISPOSITIONS) - acceptor = m.ForeignKey(User, blank=True) + acceptor = m.ForeignKey(User, blank=True, null=True) + + name = m.CharField(max_length=200) + completed = m.BooleanField(default=False) + task_type = m.IntegerField(choices=TASK_TYPES, default=0) + disposition = m.IntegerField(choices=DISPOSITIONS, default=0) estimated_hours = m.DecimalField(decimal_places=2, max_digits=5) - description = m.TextField(blank=True) + description = m.TextField(blank=True, null=True) def __unicode__(self): return self.name @@ -106,13 +122,15 @@ class Task(Model): class LoggedTime(Model): - start_time = m.DateTimeField(blank=True) - end_time = m.DateTimeField(blank=True) + task = m.ForeignKey(Task) + person1 = m.ForeignKey(User, blank=True, null=True, related_name="person1") + person2 = m.ForeignKey(User, blank=True, null=True, related_name="person2") + logged_date = m.DateField() + start_time = m.DateTimeField(blank=True, null=True) + end_time = m.DateTimeField(blank=True, null=True) duration = m.DecimalField(decimal_places=2, max_digits=5) - person1 = m.ForeignKey(User, blank=True, related_name="person1") - person2 = m.ForeignKey(User, blank=True, related_name="person2") - description = m.TextField(blank=True) + description = m.TextField(blank=True, null=True) def __unicode__(self): return self.description diff --git a/snakeplan/projects/urls.py b/snakeplan/projects/urls.py index cc273a2..259cbc9 100644 --- a/snakeplan/projects/urls.py +++ b/snakeplan/projects/urls.py @@ -21,11 +21,11 @@ SnakePlan Project Urls from django.conf.urls.defaults import patterns, url urlpatterns = patterns('snakeplan.projects.views', - (r'^$', 'projects.index'), - (r'^projects/$', 'projects.index'), - (r'^project/create/', 'projects.create_project'), - (r'^project/(.*)/iterations/', 'projects.project_iterations'), - (r'^iteration/(.*)/stories/', 'iterations.index'), - (r'^story/(.*)/tasks/', 'stories.index'), - (r'^task/(.*)/', 'tasks.index'), + url(r'^$', 'projects.index'), + url(r'^projects/$', 'projects.index', name='project-list'), + url(r'^project/create/', 'projects.create_project', name='create-project'), + url(r'^project/(.*)/iterations/', 'projects.project_iterations', name='project-iterations'), + url(r'^iteration/(.*)/stories/', 'iterations.index'), + url(r'^story/(.*)/tasks/', 'stories.index'), + url(r'^task/(.*)/', 'tasks.index'), ) diff --git a/snakeplan/projects/views/projects.py b/snakeplan/projects/views/projects.py index 7cc4017..8fb68c8 100644 --- a/snakeplan/projects/views/projects.py +++ b/snakeplan/projects/views/projects.py @@ -10,7 +10,7 @@ from snakeplan.projects.forms import ProjectForm def index(request): return list_detail.object_list( request=request, - queryset=Project.objects.all(), + queryset=Project.objects.order_by('-active', 'name').all(), allow_empty=True ) -- cgit v1.2.3