From 7359bd23ec232c238fc07c579776f7869dd3f00d Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Thu, 15 Jul 2010 00:02:52 -0400 Subject: Adjusting models to reflect new direction in project. --- snakeplan/projects/admin.py | 9 +-- snakeplan/projects/forms.py | 9 +++ snakeplan/projects/models.py | 107 ++++++++++++++++++------------------ snakeplan/projects/urls.py | 24 ++++---- snakeplan/projects/views/stories.py | 29 ++++++++++ 5 files changed, 109 insertions(+), 69 deletions(-) create mode 100644 snakeplan/projects/forms.py create mode 100644 snakeplan/projects/views/stories.py diff --git a/snakeplan/projects/admin.py b/snakeplan/projects/admin.py index ba56193..e31187b 100644 --- a/snakeplan/projects/admin.py +++ b/snakeplan/projects/admin.py @@ -28,9 +28,10 @@ class ProjectAdmin(ModelAdmin): 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) +site.register(models.Story) +site.register(models.Release) +site.register(models.Feature) +site.register(models.Task) +site.register(models.Comment) diff --git a/snakeplan/projects/forms.py b/snakeplan/projects/forms.py new file mode 100644 index 0000000..68fbfe9 --- /dev/null +++ b/snakeplan/projects/forms.py @@ -0,0 +1,9 @@ +import models +from django.forms import ModelForm + + +class StoryForm(ModelForm): + + class Meta: + model = models.Story + fields = ('project', 'name') diff --git a/snakeplan/projects/models.py b/snakeplan/projects/models.py index e707bb2..aca8e36 100644 --- a/snakeplan/projects/models.py +++ b/snakeplan/projects/models.py @@ -23,29 +23,23 @@ from django.db.models import Model from django.contrib.auth.models import User -STATUSES = ( - (0, 'Draft'), - (1, 'Defined'), - (2, 'Estimated'), - (3, 'Planned'), - (4, 'Implemented'), - (5, 'Verified'), - (6, 'Accepted'), - ) - -DISPOSITIONS = ( - (0, 'Planned'), - (1, 'Carried Over'), - (2, 'Added'), - (3, 'Discovered'), +DAY = ( + (0, 'Sunday'), + (1, 'Monday'), + (2, 'Tuesday'), + (3, 'Wednesday'), + (4, 'Thursday'), + (5, 'Friday'), + (6, 'Saturday'), ) -TASK_TYPES = ( - (0, 'Feature'), - (1, 'Debt'), - (2, 'Functional Test'), - (3, 'Acceptance Test'), - (4, 'Overhead'), +STATUSES = ( + (0, 'Draft'), + (1, 'Started'), + (2, 'Finished'), + (3, 'Delivered'), + (4, 'Accepted'), + (5, 'Rejected'), ) @@ -54,7 +48,14 @@ class Project(Model): name = m.CharField(max_length=200) description = m.TextField(blank=True, null=True) active = m.BooleanField(default=True) - wiki_link = m.URLField(blank=True, null=True) + start_date = m.DateField() + + iteration_starts = m.IntegerField(choices=DAY, default=0) + iteration_length = m.IntegerField(default=2) + initial_velocity = m.IntegerField(default=10) + velocity_time_period = m.IntegerField(default=3) + + current_velocity = m.IntegerField(default=10) def __unicode__(self): return self.name @@ -64,73 +65,71 @@ class Iteration(Model): project = m.ForeignKey(Project) - name = m.CharField(max_length=200) + name = m.CharField(max_length=200, blank=True, null=True) description = m.TextField(blank=True, null=True) + start_date = m.DateField(blank=True, null=True) + end_date = m.DateField(blank=True, null=True) - # It should not be possible to delete the backlog - can_delete = m.BooleanField(default=True) + team_strength = m.DecimalField(decimal_places=2, max_digits=1, default=1) 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' + verbose_name_plural = 'stories' - iteration = m.ForeignKey(Iteration) + project = m.ForeignKey(Project, related_name='stories') + iteration = m.ForeignKey(Iteration, blank=True, null=True) 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() + accept_date = m.DateField(blank=True, null=True) description = m.TextField(blank=True, null=True) + order = m.IntegerField(default=0) def __unicode__(self): return self.name +class Release(Story): + + release_date = m.DateField() + + +class Feature(Story): + + points = m.IntegerField(blank=True, null=True) + + +class Bug(Story): + pass + + class Task(Model): story = m.ForeignKey(Story) - 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, null=True) + order = m.IntegerField(default=0) def __unicode__(self): return self.name -class LoggedTime(Model): +class Comment(Model): - 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") + user = m.ForeignKey(User) + story = m.ForeignKey(Story) - 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) - description = m.TextField(blank=True, null=True) + post_date = m.DateTimeField(auto_now=True) + comment = m.TextField() def __unicode__(self): - return self.description + return self.comment diff --git a/snakeplan/projects/urls.py b/snakeplan/projects/urls.py index c59024c..3716885 100644 --- a/snakeplan/projects/urls.py +++ b/snakeplan/projects/urls.py @@ -22,16 +22,18 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('projects.views', - url(r'^$', 'project.index', name='project-list'), - - # Projects - url(r'^create/', 'project.create_project', name='create-project'), - url(r'^(\d+)/edit/', 'project.update_project', name='edit-project'), - url(r'^(\d+)/', 'project.project_iterations', name='project-iterations'), - - # Iterations - url(r'^(\d+)/iterations/(\d+)/', 'project.index'), +# url(r'^$', 'project.index', name='project-list'), +# +# # Projects +# url(r'^create/', 'project.create_project', name='create-project'), +# url(r'^(\d+)/edit/', 'project.update_project', name='edit-project'), +# url(r'^(\d+)/', 'project.project_iterations', name='project-iterations'), +# +# # Iterations +# url(r'^(\d+)/iterations/(\d+)/', 'project.index'), +# +# # Stories +# url(r'^(\d+)/stories/(\d+)/', 'project.index', name='iteration-stories'), - # Stories - url(r'^(\d+)/stories/(\d+)/', 'project.index', name='iteration-stories'), + url(r'^story/create/', 'stories.create_story', name='create-story'), ) diff --git a/snakeplan/projects/views/stories.py b/snakeplan/projects/views/stories.py new file mode 100644 index 0000000..afcb373 --- /dev/null +++ b/snakeplan/projects/views/stories.py @@ -0,0 +1,29 @@ +# vim: set filencoding=utf8 +""" +Story Views + +@author: Mike Crute (mcrute@gmail.com) +@organization: SoftGroup Interactive, Inc. +@date: July 10, 2010 +""" + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from django.views.generic import list_detail, create_update +from django.core.urlresolvers import reverse + +from projects import models, forms + +def create_story(request): + return create_update.create_object(request, form_class=forms.StoryForm, + post_save_redirect=reverse('create-story')) -- cgit v1.2.3