aboutsummaryrefslogtreecommitdiff
path: root/snakeplan/projects/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'snakeplan/projects/models.py')
-rw-r--r--[-rwxr-xr-x]snakeplan/projects/models.py70
1 files changed, 44 insertions, 26 deletions
diff --git a/snakeplan/projects/models.py b/snakeplan/projects/models.py
index f6a54f1..e707bb2 100755..100644
--- a/snakeplan/projects/models.py
+++ b/snakeplan/projects/models.py
@@ -24,8 +24,13 @@ from django.contrib.auth.models import User
24 24
25 25
26STATUSES = ( 26STATUSES = (
27 (0, 'Active'), 27 (0, 'Draft'),
28 (1, 'Inactive'), 28 (1, 'Defined'),
29 (2, 'Estimated'),
30 (3, 'Planned'),
31 (4, 'Implemented'),
32 (5, 'Verified'),
33 (6, 'Accepted'),
29 ) 34 )
30 35
31DISPOSITIONS = ( 36DISPOSITIONS = (
@@ -47,10 +52,9 @@ TASK_TYPES = (
47class Project(Model): 52class Project(Model):
48 53
49 name = m.CharField(max_length=200) 54 name = m.CharField(max_length=200)
50 description = m.TextField(blank=True) 55 description = m.TextField(blank=True, null=True)
51 active = m.BooleanField(default=True) 56 active = m.BooleanField(default=True)
52 hidden = m.BooleanField(default=False) 57 wiki_link = m.URLField(blank=True, null=True)
53 wiki_link = m.URLField(blank=True)
54 58
55 def __unicode__(self): 59 def __unicode__(self):
56 return self.name 60 return self.name
@@ -58,33 +62,43 @@ class Project(Model):
58 62
59class Iteration(Model): 63class Iteration(Model):
60 64
61 name = m.CharField(max_length=200)
62 project = m.ForeignKey(Project) 65 project = m.ForeignKey(Project)
63 status = m.IntegerField(choices=STATUSES, default=0) 66
64 start_date = m.DateField() 67 name = m.CharField(max_length=200)
65 end_date = m.DateField() 68 description = m.TextField(blank=True, null=True)
66 days_worked = m.DecimalField(default=0, decimal_places=2, max_digits=5) 69
67 description = m.TextField(blank=True) 70 # It should not be possible to delete the backlog
71 can_delete = m.BooleanField(default=True)
68 72
69 def __unicode__(self): 73 def __unicode__(self):
70 return self.name 74 return self.name
71 75
72 76
77# Not all iterations are actually open for development
78# for example, the Backlog is not a development iteration.
79class DevelopmentIteration(Iteration):
80
81 active = m.BooleanField(default=True)
82 start_date = m.DateField(blank=True, null=True)
83 end_date = m.DateField(blank=True, null=True)
84
85
73class Story(Model): 86class Story(Model):
74 87
75 class Meta: 88 class Meta:
76 verbose_name_plural = 'Stories' 89 verbose_name_plural = 'Stories'
77 90
78 name = m.CharField(max_length=200)
79 iteration = m.ForeignKey(Iteration) 91 iteration = m.ForeignKey(Iteration)
80 disposition = m.IntegerField(choices=DISPOSITIONS)
81 customer = m.ForeignKey(User, blank=True, null=True,
82 related_name='story_customer')
83 tracker = m.ForeignKey(User, blank=True, null=True) 92 tracker = m.ForeignKey(User, blank=True, null=True)
93 customer = m.ForeignKey(User, blank=True, null=True,
94 related_name='story_customer')
95
96 name = m.CharField(max_length=200)
97 disposition = m.IntegerField(choices=DISPOSITIONS, default=0)
84 status = m.IntegerField(choices=STATUSES, default=0) 98 status = m.IntegerField(choices=STATUSES, default=0)
85 priority = m.IntegerField() 99 priority = m.IntegerField()
86 order = m.IntegerField() 100 order = m.IntegerField()
87 description = m.TextField(blank=True) 101 description = m.TextField(blank=True, null=True)
88 102
89 def __unicode__(self): 103 def __unicode__(self):
90 return self.name 104 return self.name
@@ -92,13 +106,15 @@ class Story(Model):
92 106
93class Task(Model): 107class Task(Model):
94 108
95 name = m.CharField(max_length=200)
96 story = m.ForeignKey(Story) 109 story = m.ForeignKey(Story)
97 task_type = m.IntegerField(choices=TASK_TYPES) 110 acceptor = m.ForeignKey(User, blank=True, null=True)
98 disposition = m.IntegerField(choices=DISPOSITIONS) 111
99 acceptor = m.ForeignKey(User, blank=True) 112 name = m.CharField(max_length=200)
113 completed = m.BooleanField(default=False)
114 task_type = m.IntegerField(choices=TASK_TYPES, default=0)
115 disposition = m.IntegerField(choices=DISPOSITIONS, default=0)
100 estimated_hours = m.DecimalField(decimal_places=2, max_digits=5) 116 estimated_hours = m.DecimalField(decimal_places=2, max_digits=5)
101 description = m.TextField(blank=True) 117 description = m.TextField(blank=True, null=True)
102 118
103 def __unicode__(self): 119 def __unicode__(self):
104 return self.name 120 return self.name
@@ -106,13 +122,15 @@ class Task(Model):
106 122
107class LoggedTime(Model): 123class LoggedTime(Model):
108 124
109 start_time = m.DateTimeField(blank=True) 125 task = m.ForeignKey(Task)
110 end_time = m.DateTimeField(blank=True) 126 person1 = m.ForeignKey(User, blank=True, null=True, related_name="person1")
127 person2 = m.ForeignKey(User, blank=True, null=True, related_name="person2")
128
111 logged_date = m.DateField() 129 logged_date = m.DateField()
130 start_time = m.DateTimeField(blank=True, null=True)
131 end_time = m.DateTimeField(blank=True, null=True)
112 duration = m.DecimalField(decimal_places=2, max_digits=5) 132 duration = m.DecimalField(decimal_places=2, max_digits=5)
113 person1 = m.ForeignKey(User, blank=True, related_name="person1") 133 description = m.TextField(blank=True, null=True)
114 person2 = m.ForeignKey(User, blank=True, related_name="person2")
115 description = m.TextField(blank=True)
116 134
117 def __unicode__(self): 135 def __unicode__(self):
118 return self.description 136 return self.description