diff options
Diffstat (limited to 'snakeplan/projects/models.py')
-rw-r--r--[-rwxr-xr-x] | snakeplan/projects/models.py | 70 |
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 | ||
26 | STATUSES = ( | 26 | STATUSES = ( |
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 | ||
31 | DISPOSITIONS = ( | 36 | DISPOSITIONS = ( |
@@ -47,10 +52,9 @@ TASK_TYPES = ( | |||
47 | class Project(Model): | 52 | class 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 | ||
59 | class Iteration(Model): | 63 | class 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. | ||
79 | class 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 | |||
73 | class Story(Model): | 86 | class 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 | ||
93 | class Task(Model): | 107 | class 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 | ||
107 | class LoggedTime(Model): | 123 | class 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 |