Refactor blank, null and verbose names, review related fields
parent
93daf68420
commit
30ec03b196
|
@ -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'
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue