Refactor blank, null and verbose names, review related fields

remotes/origin/enhancement/email-actions
Andrés Moya 2013-04-16 18:31:34 +02:00
parent 93daf68420
commit 30ec03b196
5 changed files with 400 additions and 249 deletions

View File

@ -21,11 +21,11 @@ def attach_uuid(sender, instance, **kwargs):
fields = sender._meta.init_name_map() fields = sender._meta.init_name_map()
#fields = sender._meta.get_all_field_names() #fields = sender._meta.get_all_field_names()
if "modified_date" in fields: if 'modified_date' in fields:
instance.modified_date = now() instance.modified_date = now()
# if sender class does not have uuid field. # if sender class does not have uuid field.
if "uuid" in fields: if 'uuid' in fields:
if not instance.uuid: if not instance.uuid:
instance.uuid = unicode(uuid.uuid1()) instance.uuid = unicode(uuid.uuid1())
@ -46,21 +46,31 @@ def attach_unique_reference(sender, instance, **kwargs):
class User(AbstractUser): class User(AbstractUser):
color = models.CharField(max_length=9) color = models.CharField(max_length=9, null=False, blank=False,
description = models.TextField(blank=True) verbose_name=_('color'))
photo = models.FileField(upload_to="files/msg", max_length=500, null=True, blank=True) description = models.TextField(null=False, blank=True,
default_language = models.CharField(max_length=20, null=True, blank=True, default=None) verbose_name=_('description'))
default_timezone = models.CharField(max_length=20, null=True, blank=True, default=None) photo = models.FileField(upload_to='files/msg', max_length=500, null=True, blank=True,
token = models.CharField(max_length=200, unique=True, null=True, blank=True, default=None) verbose_name=_('photo'))
colorize_tags = models.BooleanField(default=False) default_language = models.CharField(max_length=20, null=False, blank=True, default='',
verbose_name=_('default language'))
default_timezone = models.CharField(max_length=20, null=False, blank=True, default='',
verbose_name=_('default timezone'))
token = models.CharField(max_length=200, unique=True, null=False, blank=True, default='',
verbose_name=_('token'))
colorize_tags = models.BooleanField(null=False, blank=True, default=False,
verbose_name=_('colorize tags'))
objects = UserManager() objects = UserManager()
class Role(models.Model): class Role(models.Model):
name = models.CharField(max_length=200) name = models.CharField(max_length=200, null=False, blank=False,
slug = models.SlugField(max_length=250, unique=True, blank=True) verbose_name=_('name'))
slug = models.SlugField(max_length=250, unique=True, null=False, blank=True,
verbose_name=_('slug'))
permissions = models.ManyToManyField('auth.Permission', permissions = models.ManyToManyField('auth.Permission',
verbose_name=_('permissions'), blank=True) related_name='roles')
verbose_name=_('permissions'))
class Meta: class Meta:
verbose_name = u'role' verbose_name = u'role'

View File

@ -6,19 +6,27 @@ from greenmine.base.fields import DictField
class Document(models.Model): class Document(models.Model):
slug = models.SlugField(unique=True, max_length=200, blank=True) slug = models.SlugField(unique=True, max_length=200, null=False, blank=True,
verbose_name=_('slug'))
title = models.CharField(max_length=150) title = models.CharField(max_length=150, null=False, blank=False,
description = models.TextField(blank=True) verbose_name=_('title'))
description = models.TextField(null=False, blank=True,
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('description'))
modified_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
project = models.ForeignKey('scrum.Project', related_name='documents') modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
owner = models.ForeignKey('base.User', related_name='documents') verbose_name=_('modified date'))
attached_file = models.FileField(upload_to="documents", max_length=1000, project = models.ForeignKey('scrum.Project', null=False, blank=False,
null=True, blank=True) related_name='documents',
tags = DictField() verbose_name=_('project'))
owner = models.ForeignKey('base.User', null=False, blank=False,
related_name='owned_documents',
verbose_name=_('owner'))
attached_file = models.FileField(max_length=1000, null=True, blank=True,
upload_to='documents',
verbose_name=_('attached_file'))
tags = DictField(null=False, blank=True,
verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'document' verbose_name = u'document'

View File

@ -5,26 +5,36 @@ from greenmine.base.fields import DictField
class Question(models.Model): class Question(models.Model):
subject = models.CharField(max_length=150) subject = models.CharField(max_length=150, null=False, blank=False,
slug = models.SlugField(unique=True, max_length=250, blank=True) verbose_name=_('subject'))
content = models.TextField(blank=True) slug = models.SlugField(unique=True, max_length=250, null=False, blank=True,
closed = models.BooleanField(default=False) verbose_name=_('slug'))
attached_file = models.FileField(upload_to="messages", max_length=500, content = models.TextField(null=False, blank=True,
null=True, blank=True) verbose_name=_('content'))
closed = models.BooleanField(default=False, null=False, blank=True,
project = models.ForeignKey('scrum.Project', related_name='questions') verbose_name=_('closed'))
milestone = models.ForeignKey('scrum.Milestone', related_name='questions', attached_file = models.FileField(max_length=500, null=True, blank=True,
null=True, default=None, blank=True) upload_to='messages',
verbose_name=_('attached_file'))
assigned_to = models.ForeignKey("base.User") project = models.ForeignKey('scrum.Project', null=False, blank=False,
created_date = models.DateTimeField(auto_now_add=True) related_name='questions')
modified_date = models.DateTimeField(auto_now_add=True) milestone = models.ForeignKey('scrum.Milestone', null=True, blank=True, default=None,
owner = models.ForeignKey('base.User', related_name='questions') related_name='questions',
verbose_name=_('milestone'))
watchers = models.ManyToManyField('base.User', assigned_to = models.ForeignKey('base.User', null=False, blank=False,
related_name='question_watch', null=True, related_name='questions_assigned_to_me',
blank=True) verbose_name=_('assigned_to'))
tags = DictField() created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('modified date'))
owner = models.ForeignKey('base.User', null=False, blank=False,
related_name='owned_questions')
watchers = models.ManyToManyField('base.User', null=True, blank=True,
related_name='watched_questions',
verbose_name=_('watchers'))
tags = DictField(null=False, blank=True,
verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'question' verbose_name = u'question'
@ -45,15 +55,22 @@ class Question(models.Model):
class QuestionResponse(models.Model): class QuestionResponse(models.Model):
content = models.TextField() content = models.TextField(null=False, blank=False,
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('content'))
modified_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
attached_file = models.FileField(upload_to="messages", max_length=500, verbose_name=_('created date'))
null=True, blank=True) modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date'))
question = models.ForeignKey('Question', related_name='responses') attached_file = models.FileField(max_length=500, null=True, blank=True,
owner = models.ForeignKey('base.User', related_name='questions_responses') upload_to='messages',
tags = DictField() verbose_name=_('attached file'))
question = models.ForeignKey('Question', null=False, blank=False,
related_name='responses',
verbose_name=_('question'))
owner = models.ForeignKey('base.User', null=False, blank=False,
related_name='question_responses')
tags = DictField(null=False, blank=True,
verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'question response' verbose_name = u'question response'

View File

@ -17,9 +17,13 @@ from greenmine.scrum.choices import (ISSUESTATUSES, TASKSTATUSES, USSTATUSES,
class Severity(models.Model): class Severity(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
project = models.ForeignKey("Project", related_name="severities") order = models.IntegerField(default=10, null=False, blank=False,
verbose_name=_('order'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='severities',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'severity' verbose_name = u'severity'
@ -28,14 +32,19 @@ class Severity(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class IssueStatus(models.Model): class IssueStatus(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
is_closed = models.BooleanField(default=False) order = models.IntegerField(default=10, null=False, blank=False,
project = models.ForeignKey("Project", related_name="issuestatuses") verbose_name=_('order'))
is_closed = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is closed'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='issue_statuses',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'issue status' verbose_name = u'issue status'
@ -44,15 +53,21 @@ class IssueStatus(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class TaskStatus(models.Model): class TaskStatus(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
is_closed = models.BooleanField(default=False) order = models.IntegerField(default=10, null=False, blank=False,
color = models.CharField(max_length=20, default="#999999") verbose_name=_('order'))
project = models.ForeignKey("Project", related_name="taskstatuses") is_closed = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is closed'))
color = models.CharField(max_length=20, null=False, blank=False, default='#999999',
verbose_name=_('color'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='task_statuses',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'task status' verbose_name = u'task status'
@ -61,14 +76,19 @@ class TaskStatus(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class UserStoryStatus(models.Model): class UserStoryStatus(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
is_closed = models.BooleanField(default=False) order = models.IntegerField(default=10, null=False, blank=False,
project = models.ForeignKey("Project", related_name="usstatuses") verbose_name=_('order'))
is_closed = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is closed'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='us_statuses',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'user story status' verbose_name = u'user story status'
@ -77,13 +97,17 @@ class UserStoryStatus(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class Priority(models.Model): class Priority(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
project = models.ForeignKey("Project", related_name="priorities") order = models.IntegerField(default=10, null=False, blank=False,
verbose_name=_('order'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='priorities',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'priority' verbose_name = u'priority'
@ -92,14 +116,17 @@ class Priority(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class IssueType(models.Model): class IssueType(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
order = models.IntegerField(default=10, null=False, blank=False,
project = models.ForeignKey("Project", related_name="issuetypes") verbose_name=_('order'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='issue_types',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'issue type' verbose_name = u'issue type'
@ -108,14 +135,17 @@ class IssueType(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class Points(models.Model): class Points(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, null=False, blank=False,
order = models.IntegerField(default=10) verbose_name=_('name'))
order = models.IntegerField(default=10, null=False, blank=False,
project = models.ForeignKey("Project", related_name="points") verbose_name=_('order'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='points',
verbose_name=_('project'))
class Meta: class Meta:
verbose_name = u'point' verbose_name = u'point'
@ -124,38 +154,50 @@ class Points(models.Model):
unique_together = ('project', 'name') unique_together = ('project', 'name')
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.name) return u'project {0} - {1}'.format(self.project_id, self.name)
class Membership(models.Model): class Membership(models.Model):
user = models.ForeignKey("base.User") user = models.ForeignKey('base.User', null=False, blank=False)
project = models.ForeignKey("Project") project = models.ForeignKey('Project', null=False, blank=False)
role = models.ForeignKey("base.Role") role = models.ForeignKey('base.Role', null=False, blank=False)
class Meta: class Meta:
unique_together = ('user', 'project') unique_together = ('user', 'project')
class Project(models.Model): class Project(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
name = models.CharField(max_length=250, unique=True) verbose_name=_('uuid'))
slug = models.SlugField(max_length=250, unique=True, blank=True) name = models.CharField(max_length=250, unique=True, null=False, blank=False,
description = models.TextField(blank=False) verbose_name=_('name'))
slug = models.SlugField(max_length=250, unique=True, null=False, blank=True,
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('slug'))
modified_date = models.DateTimeField(auto_now_add=True, auto_now=True) description = models.TextField(null=False, blank=False,
verbose_name=_('description'))
owner = models.ForeignKey("base.User", related_name="owned_projects", blank=True) created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
members = models.ManyToManyField("base.User", related_name="projects", through='Membership') verbose_name=_('created date'))
public = models.BooleanField(default=True) modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date'))
last_us_ref = models.BigIntegerField(null=True, default=1) owner = models.ForeignKey('base.User', null=False, blank=True,
last_task_ref = models.BigIntegerField(null=True, default=1) related_name='owned_projects',
last_issue_ref = models.BigIntegerField(null=True, default=1) verbose_name=_('owner'))
members = models.ManyToManyField('base.User', related_name='projects', through='Membership',
sprints = models.IntegerField(default=1, blank=True, null=True) verbose_name=_('members'))
total_story_points = models.FloatField(default=None, null=True) public = models.BooleanField(default=True, null=False, blank=True,
tags = PickledObjectField() verbose_name=_('public'))
last_us_ref = models.BigIntegerField(null=True, blank=False, default=1,
verbose_name=_('last us ref'))
last_task_ref = models.BigIntegerField(null=True, blank=False, default=1,
verbose_name=_('last task ref'))
last_issue_ref = models.BigIntegerField(null=True, blank=False, default=1,
verbose_name=_('last issue ref'))
sprints = models.IntegerField(default=1, null=True, blank=True,
verbose_name=_('number of sprints'))
total_story_points = models.FloatField(default=None, null=True, blank=False,
verbose_name=_('total story points'))
tags = PickledObjectField(null=False, blank=True,
verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'project' verbose_name = u'project'
@ -171,7 +213,7 @@ class Project(models.Model):
return self.name return self.name
def __repr__(self): def __repr__(self):
return u"<Project {0}>".format(self.id) return u'<Project {0}>'.format(self.id)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:
@ -181,22 +223,32 @@ class Project(models.Model):
class Milestone(models.Model): class Milestone(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
name = models.CharField(max_length=200, db_index=True) verbose_name=_('uuid'))
slug = models.SlugField(max_length=250, unique=True, blank=True) name = models.CharField(max_length=200, db_index=True, null=False, blank=False,
owner = models.ForeignKey('base.User', related_name="milestones", verbose_name=_('name'))
null=True, blank=True) slug = models.SlugField(max_length=250, unique=True, null=False, blank=True,
project = models.ForeignKey('Project', related_name="milestones") verbose_name=_('slug'))
owner = models.ForeignKey('base.User', null=True, blank=False,
estimated_start = models.DateField(null=True, default=None) related_name='owned_milestones',
estimated_finish = models.DateField(null=True, default=None) verbose_name=_('owner'))
project = models.ForeignKey('Project', null=False, blank=False,
created_date = models.DateTimeField(auto_now_add=True) related_name='milestones',
modified_date = models.DateTimeField(auto_now_add=True, auto_now=True) verbose_name=_('project'))
closed = models.BooleanField(default=False) estimated_start = models.DateField(null=True, blank=True, default=None,
verbose_name=_('estimated start'))
disponibility = models.FloatField(null=True, default=0.0) estimated_finish = models.DateField(null=True, blank=True, default=None,
order = models.PositiveSmallIntegerField("Order", default=1) verbose_name=_('estimated finish'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date'))
closed = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is closed'))
disponibility = models.FloatField(default=0.0, null=True, blank=True,
verbose_name=_('disponibility'))
order = models.PositiveSmallIntegerField('Order', default=1, null=False, blank=False,
verbose_name=_('order'))
class Meta: class Meta:
verbose_name = u'milestone' verbose_name = u'milestone'
@ -211,7 +263,7 @@ class Milestone(models.Model):
return self.name return self.name
def __repr__(self): def __repr__(self):
return u"<Milestone {0}>".format(self.id) return u'<Milestone {0}>'.format(self.id)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:
@ -221,31 +273,46 @@ class Milestone(models.Model):
class UserStory(models.Model): class UserStory(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
ref = models.BigIntegerField(db_index=True, null=True, default=None, blank=True) verbose_name=_('uuid'))
milestone = models.ForeignKey("Milestone", blank=True, ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
related_name="user_stories", null=True, verbose_name=_('ref'))
default=None) milestone = models.ForeignKey('Milestone', null=True, blank=True, default=None,
project = models.ForeignKey("Project", related_name="user_stories") related_name='user_stories',
owner = models.ForeignKey("base.User", blank=True, null=True, verbose_name=_('milestone'))
related_name="user_stories") project = models.ForeignKey('Project', null=False, blank=False,
related_name='user_stories',
status = models.ForeignKey("UserStoryStatus", related_name="userstories") verbose_name=_('project'))
points = models.ForeignKey("Points", related_name="userstories") owner = models.ForeignKey('base.User', null=True, blank=True,
order = models.PositiveSmallIntegerField(default=100) related_name='owned_user_stories',
verbose_name=_('owner'))
created_date = models.DateTimeField(auto_now_add=True) status = models.ForeignKey('UserStoryStatus', null=False, blank=False,
modified_date = models.DateTimeField(auto_now_add=True, auto_now=True) related_name='user_stories',
finish_date = models.DateTimeField(null=True, blank=True) verbose_name=_('status'))
points = models.ForeignKey('Points', null=False, blank=False,
subject = models.CharField(max_length=500) related_name='userstories',
description = models.TextField() verbose_name=_('points'))
order = models.PositiveSmallIntegerField(null=False, blank=False, default=100,
watchers = models.ManyToManyField('base.User', related_name='us_watch', null=True) verbose_name=_('order'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
client_requirement = models.BooleanField(default=False) verbose_name=_('created date'))
team_requirement = models.BooleanField(default=False) modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
tags = PickledObjectField() verbose_name=_('modified date'))
finish_date = models.DateTimeField(null=True, blank=True,
verbose_name=_('finish date'))
subject = models.CharField(max_length=500, null=False, blank=False,
verbose_name=_('subject'))
description = models.TextField(null=False, blank=True,
verbose_name=_('description'))
watchers = models.ManyToManyField('base.User', null=True, blank=True,
related_name='watched_us',
verbose_name=_('watchers'))
client_requirement = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is client requirement'))
team_requirement = models.BooleanField(default=False, null=False, blank=True,
verbose_name=_('is team requirement'))
tags = PickledObjectField(null=False, blank=True,
verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'user story' verbose_name = u'user story'
@ -261,10 +328,10 @@ class UserStory(models.Model):
) )
def __unicode__(self): def __unicode__(self):
return u"({1}) {0}".format(self.ref, self.subject) return u'({1}) {0}'.format(self.ref, self.subject)
def __repr__(self): def __repr__(self):
return u"<UserStory %s>" % (self.id) return u'<UserStory %s>' % (self.id)
@property @property
def is_closed(self): def is_closed(self):
@ -272,16 +339,24 @@ class UserStory(models.Model):
class Attachment(models.Model): class Attachment(models.Model):
owner = models.ForeignKey("base.User", related_name="change_attachments") owner = models.ForeignKey('base.User', null=False, blank=False,
project = models.ForeignKey("Project", related_name="attachments") related_name='change_attachments',
verbose_name=_('owner'))
content_type = models.ForeignKey(ContentType) project = models.ForeignKey('Project', null=False, blank=False,
object_id = models.PositiveIntegerField() related_name='attachments',
verbose_name=_('project'))
content_type = models.ForeignKey(ContentType, null=False, blank=False,
verbose_name=_('content type'))
object_id = models.PositiveIntegerField(null=False, blank=False,
verbose_name=_('object id'))
content_object = generic.GenericForeignKey('content_type', 'object_id') content_object = generic.GenericForeignKey('content_type', 'object_id')
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('created date'))
attached_file = models.FileField(upload_to="files/msg", max_length=500, modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
null=True, blank=True) verbose_name=_('modified date'))
attached_file = models.FileField(max_length=500, null=True, blank=True,
upload_to='files/msg',
verbose_name=_('attached file'))
class Meta: class Meta:
verbose_name = u'attachment' verbose_name = u'attachment'
@ -293,37 +368,51 @@ class Attachment(models.Model):
self.content_type, self.object_id, self.id self.content_type, self.object_id, self.id
) )
class Task(models.Model): class Task(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
user_story = models.ForeignKey('UserStory', related_name='tasks') verbose_name=_('uuid'))
ref = models.BigIntegerField(db_index=True, null=True, default=None) user_story = models.ForeignKey('UserStory', null=False, blank=False,
owner = models.ForeignKey("base.User", null=True, default=None, related_name='tasks',
related_name="tasks") verbose_name=_('user story'))
ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
status = models.ForeignKey("TaskStatus", related_name="tasks") verbose_name=_('ref'))
severity = models.ForeignKey("Severity", related_name="tasks") owner = models.ForeignKey('base.User', null=True, blank=True, default=None,
priority = models.ForeignKey("Priority", related_name="tasks") related_name='owned_tasks',
status = models.ForeignKey("TaskStatus", related_name="tasks") verbose_name=_('owner'))
severity = models.ForeignKey('Severity', null=False, blank=False,
milestone = models.ForeignKey('Milestone', related_name='tasks', null=True, related_name='tasks',
default=None, blank=True) verbose_name=_('severity'))
priority = models.ForeignKey('Priority', null=False, blank=False,
project = models.ForeignKey('Project', related_name='tasks') related_name='tasks',
verbose_name=_('priority'))
created_date = models.DateTimeField(auto_now_add=True) status = models.ForeignKey('TaskStatus', null=False, blank=False,
modified_date = models.DateTimeField(auto_now_add=True) related_name='tasks',
finished_date = models.DateTimeField(null=True, blank=True) verbose_name=_('status'))
milestone = models.ForeignKey('Milestone', null=True, blank=True, default=None,
subject = models.CharField(max_length=500) related_name='tasks',
description = models.TextField(blank=True) verbose_name=_('milestone'))
assigned_to = models.ForeignKey('base.User', project = models.ForeignKey('Project', null=False, blank=False,
related_name='tasks',
verbose_name=_('project'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('modified date'))
finished_date = models.DateTimeField(null=True, blank=True,
verbose_name=_('finished date'))
subject = models.CharField(max_length=500, null=False, blank=False,
verbose_name=_('subject'))
description = models.TextField(null=False, blank=True,
verbose_name=_('description'))
assigned_to = models.ForeignKey('base.User', blank=True, null=True, default=None,
related_name='user_storys_assigned_to_me', related_name='user_storys_assigned_to_me',
blank=True, null=True, default=None) verbose_name=_('assigned to'))
watchers = models.ManyToManyField('base.User', null=True, blank=True,
watchers = models.ManyToManyField('base.User', related_name='task_watch', related_name='watched_tasks',
null=True) verbose_name=_('watchers'))
tags = PickledObjectField(null=False, blank=True,
tags = PickledObjectField() verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'task' verbose_name = u'task'
@ -342,48 +431,62 @@ class Task(models.Model):
) )
def __unicode__(self): def __unicode__(self):
return u"({1}) {0}".format(self.ref, self.subject) return u'({1}) {0}'.format(self.ref, self.subject)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if self.id: if self.id:
self.modified_date = timezone.now() self.modified_date = timezone.now()
if not self.ref: if not self.ref:
self.ref = ref_uniquely(self.project, "last_task_ref", self.__class__) self.ref = ref_uniquely(self.project, 'last_task_ref', self.__class__)
super(Task, self).save(*args, **kwargs) super(Task, self).save(*args, **kwargs)
class Issue(models.Model): class Issue(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
ref = models.BigIntegerField(db_index=True, null=True, default=None) verbose_name=_('uuid'))
owner = models.ForeignKey("base.User", null=True, default=None, ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
related_name="issues") verbose_name=_('ref'))
owner = models.ForeignKey('base.User', null=True, blank=True, default=None,
status = models.ForeignKey("IssueStatus", related_name="issues") related_name='owned_issues',
severity = models.ForeignKey("Severity", related_name="issues") verbose_name=_('owner'))
priority = models.ForeignKey("Priority", related_name="issues") status = models.ForeignKey('IssueStatus', null=False, blank=False,
type = models.ForeignKey("IssueType", related_name="issues") related_name='issues',
verbose_name=_('status'))
milestone = models.ForeignKey('Milestone', related_name='issues', null=True, severity = models.ForeignKey('Severity', null=False, blank=False,
default=None, blank=True) related_name='issues',
verbose_name=_('severity'))
project = models.ForeignKey('Project', related_name='issues') priority = models.ForeignKey('Priority', null=False, blank=False,
related_name='issues',
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('priority'))
modified_date = models.DateTimeField(auto_now_add=True) type = models.ForeignKey('IssueType', null=False, blank=False,
finished_date = models.DateTimeField(null=True, blank=True) related_name='issues',
verbose_name=_('type'))
subject = models.CharField(max_length=500) milestone = models.ForeignKey('Milestone', null=True, blank=True, default=None,
description = models.TextField(blank=True) related_name='issues',
assigned_to = models.ForeignKey('base.User', verbose_name=_('milestone'))
project = models.ForeignKey('Project', null=False, blank=False,
related_name='issues',
verbose_name=_('project'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('modified date'))
finished_date = models.DateTimeField(null=True, blank=True,
verbose_name=_('finished date'))
subject = models.CharField(max_length=500, null=False, blank=False,
verbose_name=_('subject'))
description = models.TextField(null=False, blank=True,
verbose_name=_('description'))
assigned_to = models.ForeignKey('base.User', blank=True, null=True, default=None,
related_name='issues_assigned_to_me', related_name='issues_assigned_to_me',
blank=True, null=True, default=None) verbose_name=_('assigned to'))
watchers = models.ManyToManyField('base.User', null=True, blank=True,
watchers = models.ManyToManyField('base.User', related_name='issue_watch', related_name='watched_issues',
null=True) verbose_name=_('watchers'))
tags = PickledObjectField(null=False, blank=True,
tags = PickledObjectField() verbose_name=_('tags'))
class Meta: class Meta:
verbose_name = u'issue' verbose_name = u'issue'
@ -401,21 +504,21 @@ class Issue(models.Model):
) )
def __unicode__(self): def __unicode__(self):
return u"({1}) {0}".format(self.ref, self.subject) return u'({1}) {0}'.format(self.ref, self.subject)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if self.id: if self.id:
self.modified_date = timezone.now() self.modified_date = timezone.now()
if not self.ref: if not self.ref:
self.ref = ref_uniquely(self.project, "last_issue_ref", self.__class__) self.ref = ref_uniquely(self.project, 'last_issue_ref', self.__class__)
super(Issue, self).save(*args, **kwargs) super(Issue, self).save(*args, **kwargs)
# Model related signals handlers # Model related signals handlers
@receiver(models.signals.post_save, sender=Project, dispatch_uid="project_post_save") @receiver(models.signals.post_save, sender=Project, dispatch_uid='project_post_save')
def project_post_save(sender, instance, created, **kwargs): def project_post_save(sender, instance, created, **kwargs):
""" """
Create all project model depences on project is Create all project model depences on project is
@ -451,7 +554,7 @@ def project_post_save(sender, instance, created, **kwargs):
IssueType.objects.create(project=instance, name=name, order=order) IssueType.objects.create(project=instance, name=name, order=order)
@receiver(models.signals.pre_save, sender=UserStory, dispatch_uid="user_story_ref_handler") @receiver(models.signals.pre_save, sender=UserStory, dispatch_uid='user_story_ref_handler')
def user_story_ref_handler(sender, instance, **kwargs): def user_story_ref_handler(sender, instance, **kwargs):
""" """
Automatically assignes a seguent reference code to a Automatically assignes a seguent reference code to a
@ -459,7 +562,7 @@ def user_story_ref_handler(sender, instance, **kwargs):
""" """
if not instance.id and instance.project: if not instance.id and instance.project:
instance.ref = ref_uniquely(instance.project, "last_us_ref", instance.__class__) instance.ref = ref_uniquely(instance.project, 'last_us_ref', instance.__class__)
# Email alerts signals handlers # Email alerts signals handlers

View File

@ -4,16 +4,23 @@ from greenmine.base.fields import DictField
class WikiPage(models.Model): class WikiPage(models.Model):
project = models.ForeignKey('scrum.Project', related_name='wiki_pages') project = models.ForeignKey('scrum.Project', null=False, blank=False,
slug = models.SlugField(max_length=500, db_index=True) related_name='wiki_pages',
content = models.TextField(blank=False, null=True) verbose_name=_('project'))
owner = models.ForeignKey("base.User", related_name="wiki_pages", null=True, blank=True) slug = models.SlugField(max_length=500, db_index=True, null=False, blank=False,
verbose_name=_('slug'))
watchers = models.ManyToManyField('base.User', content = models.TextField(null=False, blank=True,
related_name='wikipage_watchers', verbose_name=_('content'))
null=True, blank=True) owner = models.ForeignKey('base.User', null=True, blank=True,
related_name='owned_wiki_pages',
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('owner'))
watchers = models.ManyToManyField('base.User', null=True, blank=True,
related_name='watched_wiki_pages',
verbose_name=_('watchers'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date'))
class Meta: class Meta:
verbose_name = u'wiki page' verbose_name = u'wiki page'
@ -25,17 +32,23 @@ class WikiPage(models.Model):
) )
def __unicode__(self): def __unicode__(self):
return u"project {0} - {1}".format(self.project_id, self.subject) return u'project {0} - {1}'.format(self.project_id, self.subject)
# TODO: why don't use scrum.Attachment?
class WikiPageAttachment(models.Model): class WikiPageAttachment(models.Model):
wikipage = models.ForeignKey('WikiPage', related_name='attachments') wikipage = models.ForeignKey('WikiPage', null=False, blank=False,
owner = models.ForeignKey("base.User", related_name="wikifiles") related_name='attachments',
created_date = models.DateTimeField(auto_now_add=True) verbose_name=_('wiki page'))
modified_date = models.DateTimeField(auto_now_add=True) owner = models.ForeignKey('base.User', null=False, blank=False,
attached_file = models.FileField(upload_to="files/wiki", max_length=500, related_name='owned_wiki_attachments',
null=True, blank=True) verbose_name=_('owner'))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
verbose_name=_('created date'))
modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date'))
attached_file = models.FileField(max_length=500, null=True, blank=True,
upload_to='files/wiki',
verbose_name=_('attached file'))
class Meta: class Meta:
verbose_name = u'wiki page attachment' verbose_name = u'wiki page attachment'
@ -43,5 +56,5 @@ class WikiPageAttachment(models.Model):
ordering = ['wikipage', 'created_date'] ordering = ['wikipage', 'created_date']
def __unicode__(self): def __unicode__(self):
return u"project {0} - page {1} - attachment {2}".format(self.wikipage.project_id, self.wikipage.subject, self.id) return u'project {0} - page {1} - attachment {2}'.format(self.wikipage.project_id, self.wikipage.subject, self.id)