Refactoring models

remotes/origin/enhancement/email-actions
Jesús Espino 2013-03-21 07:56:19 +01:00
parent c089db68e4
commit 5ac392231b
5 changed files with 71 additions and 421 deletions

View File

@ -2,13 +2,13 @@
from django.db.models import signals from django.db.models import signals
from django.dispatch import receiver from django.dispatch import receiver
from django.db import models
from django.utils.timezone import now from django.utils.timezone import now
from ..scrum.models import Project, UserStory, Task from greenmine.scrum.models import Project, UserStory, Task
import uuid import uuid
# Centralized uuid attachment and ref generation # Centralized uuid attachment and ref generation
@receiver(signals.pre_save) @receiver(signals.pre_save)
def attach_uuid(sender, instance, **kwargs): def attach_uuid(sender, instance, **kwargs):

View File

@ -1,16 +1,14 @@
# -* coding: utf-8 -*- # -* coding: utf-8 -*-
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from greenmine.core.utils.slug import slugify_uniquely as slugify from greenmine.core.utils.slug import slugify_uniquely as slugify
from greenmine.taggit.managers import TaggableManager from greenmine.taggit.managers import TaggableManager
class Document(models.Model): class Document(models.Model):
title = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=200, blank=True) slug = models.SlugField(unique=True, max_length=200, blank=True)
title = models.CharField(max_length=150)
description = models.TextField(blank=True) description = models.TextField(blank=True)
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
@ -18,8 +16,8 @@ class Document(models.Model):
project = models.ForeignKey('scrum.Project', related_name='documents') project = models.ForeignKey('scrum.Project', related_name='documents')
owner = models.ForeignKey('auth.User', related_name='documents') owner = models.ForeignKey('auth.User', related_name='documents')
attached_file = models.FileField(upload_to="documents", attached_file = models.FileField(upload_to="documents", max_length=1000,
max_length=1000, null=True, blank=True) null=True, blank=True)
tags = TaggableManager() tags = TaggableManager()
@ -28,11 +26,9 @@ class Document(models.Model):
self.slug = slugify(self.title, self.__class__) self.slug = slugify(self.title, self.__class__)
super(Document, self).save(*args, **kwargs) super(Document, self).save(*args, **kwargs)
@models.permalink class Meta:
def get_delete_url(self): ordering = ['title']
return ('documents-delete', (), permissions = (
{'pslug': self.project.slug, 'docid': self.pk}) ('can_download_from_my_projects', 'Can download the documents from my projects'),
('can_download_from_other_projects', 'Can download the documents from other projects'),
@models.permalink )
def get_absolute_url(self):
return self.attached_file.url

View File

@ -8,43 +8,24 @@ class Question(models.Model):
slug = models.SlugField(unique=True, max_length=250, blank=True) slug = models.SlugField(unique=True, max_length=250, blank=True)
content = models.TextField(blank=True) content = models.TextField(blank=True)
closed = models.BooleanField(default=False) closed = models.BooleanField(default=False)
attached_file = models.FileField(upload_to="messages", attached_file = models.FileField(upload_to="messages", max_length=500,
max_length=500, null=True, blank=True) null=True, blank=True)
project = models.ForeignKey('scrum.Project', related_name='questions') project = models.ForeignKey('scrum.Project', related_name='questions')
milestone = models.ForeignKey('scrum.Milestone', related_name='questions', milestone = models.ForeignKey('scrum.Milestone', related_name='questions',
null=True, default=None, blank=True) null=True, default=None, blank=True)
assigned_to = models.ForeignKey("auth.User") assigned_to = models.ForeignKey("auth.User")
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey('auth.User', related_name='questions') owner = models.ForeignKey('auth.User', related_name='questions')
watchers = models.ManyToManyField('auth.User', watchers = models.ManyToManyField('auth.User',
related_name='question_watch', null=True, blank=True) related_name='question_watch', null=True,
blank=True)
tags = TaggableManager() tags = TaggableManager()
@models.permalink
def get_absolute_url(self):
return self.get_view_url()
@models.permalink
def get_view_url(self):
return ('questions-view', (),
{'pslug': self.project.slug, 'qslug': self.slug})
@models.permalink
def get_edit_url(self):
return ('questions-edit', (),
{'pslug': self.project.slug, 'qslug': self.slug})
@models.permalink
def get_delete_url(self):
return ('questions-delete', (),
{'pslug': self.project.slug, 'qslug': self.slug})
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:
self.slug = slugify_uniquely(self.subject, self.__class__) self.slug = slugify_uniquely(self.subject, self.__class__)
@ -55,10 +36,8 @@ class QuestionResponse(models.Model):
content = models.TextField() content = models.TextField()
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now_add=True)
attached_file = models.FileField(upload_to="messages", attached_file = models.FileField(upload_to="messages", max_length=500,
max_length=500, null=True, blank=True) null=True, blank=True)
question = models.ForeignKey('Question', related_name='responses') question = models.ForeignKey('Question', related_name='responses')
owner = models.ForeignKey('auth.User', related_name='questions_responses') owner = models.ForeignKey('auth.User', related_name='questions_responses')

View File

@ -1,28 +1,23 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext
from django.utils import timezone from django.utils import timezone
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.models import UserManager
from greenmine.core.utils.slug import slugify_uniquely, ref_uniquely from greenmine.core.utils.slug import slugify_uniquely, ref_uniquely
from greenmine.core.fields import DictField, ListField from greenmine.core.fields import DictField
from greenmine.core.utils import iter_points from greenmine.core.utils import iter_points
from greenmine.taggit.managers import TaggableManager from greenmine.taggit.managers import TaggableManager
#import reversion
from .choices import * from greenmine.scrum.choices import *
from greenmine.scrum.utils import SCRUM_STATES
import datetime
import re
from .utils import SCRUM_STATES
class ProjectManager(models.Manager): class ProjectManager(models.Manager):
def get_by_natural_key(self, slug): def get_by_natural_key(self, slug):
@ -66,8 +61,10 @@ class Project(models.Model):
owner = models.ForeignKey("auth.User", related_name="projects") owner = models.ForeignKey("auth.User", related_name="projects")
participants = models.ManyToManyField('auth.User', participants = models.ManyToManyField('auth.User',
related_name="projects_participant", through="ProjectUserRole", related_name="projects_participant",
null=True, blank=True) through="ProjectUserRole",
null=True,
blank=True)
public = models.BooleanField(default=True) public = models.BooleanField(default=True)
markup = models.CharField(max_length=10, choices=MARKUP_TYPE, default='md') markup = models.CharField(max_length=10, choices=MARKUP_TYPE, default='md')
@ -118,110 +115,12 @@ class Project(models.Model):
def add_user(self, user, role): def add_user(self, user, role):
from greenmine.core import permissions from greenmine.core import permissions
return ProjectUserRole.objects.create( return ProjectUserRole.objects.create(
project = self, project=self,
user = user, user=user,
role = permissions.get_role(role), role=permissions.get_role(role),
) )
""" Permalinks """
@models.permalink
def get_absolute_url(self):
return ('project-backlog', (),
{'pslug': self.slug})
@models.permalink
def get_dashboard_url(self):
return ('dashboard', (), {'pslug': self.slug})
@models.permalink
def get_backlog_url(self):
return ('project-backlog', (),
{'pslug': self.slug})
@models.permalink
def get_backlog_stats_url(self):
return ('project-backlog-stats', (),
{'pslug': self.slug})
@models.permalink
def get_backlog_left_block_url(self):
return ('project-backlog-left-block', (),
{'pslug': self.slug})
@models.permalink
def get_backlog_right_block_url(self):
return ('project-backlog-right-block', (),
{'pslug': self.slug})
@models.permalink
def get_backlog_burndown_url(self):
return ('project-backlog-burndown', (),
{'pslug': self.slug})
@models.permalink
def get_backlog_burnup_url(self):
return ('project-backlog-burnup', (),
{'pslug': self.slug})
@models.permalink
def get_milestone_create_url(self):
return ('milestone-create', (),
{'pslug': self.slug})
@models.permalink
def get_userstory_create_url(self):
return ('user-story-create', (), {'pslug': self.slug})
@models.permalink
def get_edit_url(self):
return ('project-edit', (), {'pslug': self.slug})
@models.permalink
def get_delete_url(self):
return ('project-delete', (), {'pslug': self.slug})
@models.permalink
def get_export_url(self):
return ('project-export-settings', (), {'pslug': self.slug})
@models.permalink
def get_export_now_url(self):
return ('project-export-settings-now', (), {'pslug': self.slug})
@models.permalink
def get_export_rehash_url(self):
return ('project-export-settings-rehash', (), {'pslug': self.slug})
@models.permalink
def get_issues_url(self):
return ('issues-list', (), {'pslug': self.slug})
@models.permalink
def get_settings_url(self):
return ('project-personal-settings', (), {'pslug': self.slug})
@models.permalink
def get_general_settings_url(self):
return ('project-general-settings', (), {'pslug': self.slug})
@models.permalink
def get_questions_url(self):
return ('questions', (), {'pslug': self.slug})
@models.permalink
def get_questions_create_url(self):
return ('questions-create', (), {'pslug': self.slug})
@models.permalink
def get_documents_url(self):
return ('documents', (), {'pslug': self.slug})
@models.permalink
def get_wiki_url(self):
return ('wiki-page', (), {'pslug': self.slug, 'wslug': 'index'})
class ProjectUserRole(models.Model): class ProjectUserRole(models.Model):
project = models.ForeignKey("Project", related_name="user_roles") project = models.ForeignKey("Project", related_name="user_roles")
user = models.ForeignKey("auth.User", related_name="user_roles") user = models.ForeignKey("auth.User", related_name="user_roles")
@ -321,75 +220,6 @@ class Milestone(models.Model):
(float(self.completed_points) * 100) / float(self.total_points) (float(self.completed_points) * 100) / float(self.total_points)
) )
@models.permalink
def get_absolute_url(self):
return ('dashboard', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_edit_url(self):
return ('milestone-edit', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_delete_url(self):
return ('milestone-delete', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_dashboard_url(self):
return ('dashboard', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_stats_url(self):
return ('dashboard-api-stats', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_user_story_create_url(self):
return ('user-story-create', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_ml_detail_url(self):
return ('milestone-dashboard', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_create_task_url(self):
# TODO: deprecated
return ('api:task-create', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_stats_api_url(self):
return ('api:stats-milestone', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_tasks_url(self):
return ('tasks-view', (),
{'pslug': self.project.slug, 'mid': self.id})
@models.permalink
def get_tasks_url_filter_by_task(self):
return ('tasks-view', (),
{'pslug': self.project.slug, 'mid': self.id, 'filter_by':'task'})
@models.permalink
def get_tasks_url_filter_by_bug(self):
return ('tasks-view', (),
{'pslug': self.project.slug, 'mid': self.id, 'filter_by':'bug'})
@models.permalink
def get_task_create_url(self):
return ('task-create', (),
{'pslug': self.project.slug, 'mid': self.id})
class Meta(object):
unique_together = ('name', 'project')
def natural_key(self): def natural_key(self):
return (self.name,) + self.project.natural_key() return (self.name,) + self.project.natural_key()
@ -412,14 +242,16 @@ class UserStory(models.Model):
uuid = models.CharField(max_length=40, unique=True, blank=True) uuid = models.CharField(max_length=40, unique=True, blank=True)
ref = models.CharField(max_length=200, db_index=True, null=True, default=None) ref = models.CharField(max_length=200, db_index=True, null=True, default=None)
milestone = models.ForeignKey("Milestone", blank=True, milestone = models.ForeignKey("Milestone", blank=True,
related_name="user_stories", null=True, default=None) related_name="user_stories", null=True,
default=None)
project = models.ForeignKey("Project", related_name="user_stories") project = models.ForeignKey("Project", related_name="user_stories")
owner = models.ForeignKey("auth.User", null=True, owner = models.ForeignKey("auth.User", null=True, default=None,
default=None, related_name="user_stories") related_name="user_stories")
priority = models.IntegerField(default=1) priority = models.IntegerField(default=1)
points = models.IntegerField(choices=POINTS_CHOICES, default=-1) points = models.IntegerField(choices=POINTS_CHOICES, default=-1)
status = models.CharField(max_length=50, status = models.CharField(max_length=50,
choices=SCRUM_STATES.get_us_choices(), db_index=True, default="open") choices=SCRUM_STATES.get_us_choices(),
db_index=True, default="open")
tags = TaggableManager() tags = TaggableManager()
@ -431,8 +263,8 @@ class UserStory(models.Model):
description = models.TextField() description = models.TextField()
finish_date = models.DateTimeField(null=True, blank=True) finish_date = models.DateTimeField(null=True, blank=True)
watchers = models.ManyToManyField('auth.User', watchers = models.ManyToManyField('auth.User', related_name='us_watch',
related_name='us_watch', null=True) null=True)
client_requirement = models.BooleanField(default=False) client_requirement = models.BooleanField(default=False)
team_requirement = models.BooleanField(default=False) team_requirement = models.BooleanField(default=False)
@ -440,16 +272,6 @@ class UserStory(models.Model):
class Meta: class Meta:
unique_together = ('ref', 'project') unique_together = ('ref', 'project')
def to_dict(self):
return {
"id": self.pk,
"ref": self.ref,
"subject": self.subject,
"viewUrl": self.get_view_url(),
"pointsDisplay": self.get_points_display(),
"tags": [ {'id': tag.id, 'name': tag.name} for tag in self.tags.all() ]
}
def __repr__(self): def __repr__(self):
return u"<UserStory %s>" % (self.id) return u"<UserStory %s>" % (self.id)
@ -464,52 +286,6 @@ class UserStory(models.Model):
super(UserStory, self).save(*args, **kwargs) super(UserStory, self).save(*args, **kwargs)
@models.permalink
def get_absolute_url(self):
return ('user-story', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_assign_url(self):
return ('assign-us', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_unassign_url(self):
return ('unassign-us', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_drop_api_url(self):
# TODO: check if this url is used.
return ('api:user-story-drop', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_view_url(self):
return ('user-story', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_edit_url(self):
return ('user-story-edit', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_edit_inline_url(self):
return ('user-story-edit-inline', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_delete_url(self):
return ('user-story-delete', (),
{'pslug': self.project.slug, 'iref': self.ref})
@models.permalink
def get_task_create_url(self):
return ('task-create', (),
{'pslug': self.project.slug, 'usref': self.ref})
""" Propertys """ """ Propertys """
def update_status(self): def update_status(self):
tasks = self.tasks.all() tasks = self.tasks.all()
@ -519,7 +295,6 @@ class UserStory(models.Model):
used_states.append(task.fake_status) used_states.append(task.fake_status)
used_states = set(used_states) used_states = set(used_states)
all_completed = True
for state in SCRUM_STATES.ordered_us_states(): for state in SCRUM_STATES.ordered_us_states():
for task_state in used_states: for task_state in used_states:
if task_state == state: if task_state == state:
@ -564,8 +339,8 @@ class ChangeAttachment(models.Model):
owner = models.ForeignKey("auth.User", related_name="change_attachments") owner = models.ForeignKey("auth.User", related_name="change_attachments")
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
attached_file = models.FileField(upload_to="files/msg", attached_file = models.FileField(upload_to="files/msg", max_length=500,
max_length=500, null=True, blank=True) null=True, blank=True)
class TaskQuerySet(models.query.QuerySet): class TaskQuerySet(models.query.QuerySet):
@ -614,12 +389,12 @@ class TaskQuerySet(models.query.QuerySet):
return{ return{
'list': task_list, 'list': task_list,
'filters' : { 'filters': {
'milestones' : self._get_category(milestones), 'milestones': self._get_category(milestones),
'status' : self._get_category(status), 'status': self._get_category(status),
'tags' : self._get_category(tags), 'tags': self._get_category(tags),
'assigned_to' : self._get_category(assigned_to), 'assigned_to': self._get_category(assigned_to),
'severity' : self._get_category(severity), 'severity': self._get_category(severity),
} }
} }
@ -627,21 +402,20 @@ class TaskQuerySet(models.query.QuerySet):
queryset = self queryset = self
if milestone: if milestone:
queryset = queryset.filter(milestone = milestone) queryset = queryset.filter(milestone=milestone)
if status: if status:
queryset = queryset.filter(status = status) queryset = queryset.filter(status=status)
if tags: if tags:
for tag in tags: for tag in tags:
queryset = queryset.filter(tags__in=[tag]) queryset = queryset.filter(tags__in=[tag])
if assigned_to: if assigned_to:
queryset = queryset.filter(assigned_to = assigned_to) queryset = queryset.filter(assigned_to=assigned_to)
if severity: if severity:
queryset = queryset.filter(severity = severity) queryset = queryset.filter(severity=severity)
milestone_id = milestone and milestone.id milestone_id = milestone and milestone.id
status_id = status status_id = status
@ -651,6 +425,7 @@ class TaskQuerySet(models.query.QuerySet):
return self._get_filter_and_build_filter_dict(queryset, milestone_id, status_id, tags_ids, assigned_to_id, severity_id) return self._get_filter_and_build_filter_dict(queryset, milestone_id, status_id, tags_ids, assigned_to_id, severity_id)
class TaskManager(models.Manager): class TaskManager(models.Manager):
def get_query_set(self): def get_query_set(self):
return TaskQuerySet(self.model) return TaskQuerySet(self.model)
@ -661,34 +436,34 @@ class Task(models.Model):
user_story = models.ForeignKey('UserStory', related_name='tasks', null=True, blank=True) user_story = models.ForeignKey('UserStory', related_name='tasks', null=True, blank=True)
last_user_story = models.ForeignKey('UserStory', null=True, blank=True) last_user_story = models.ForeignKey('UserStory', null=True, blank=True)
ref = models.CharField(max_length=200, db_index=True, null=True, default=None) ref = models.CharField(max_length=200, db_index=True, null=True, default=None)
status = models.CharField(max_length=50, status = models.CharField(max_length=50, choices=TASK_STATUS_CHOICES,
choices=TASK_STATUS_CHOICES, default='open') default='open')
owner = models.ForeignKey("auth.User", null=True, owner = models.ForeignKey("auth.User", null=True, default=None,
default=None, related_name="tasks") related_name="tasks")
severity = models.IntegerField(choices=TASK_SEVERITY_CHOICES, default=3) severity = models.IntegerField(choices=TASK_SEVERITY_CHOICES, default=3)
priority = models.IntegerField(choices=TASK_PRIORITY_CHOICES, default=3) priority = models.IntegerField(choices=TASK_PRIORITY_CHOICES, default=3)
milestone = models.ForeignKey('Milestone', related_name='tasks', milestone = models.ForeignKey('Milestone', related_name='tasks', null=True,
null=True, default=None, blank=True) default=None, blank=True)
project = models.ForeignKey('Project', related_name='tasks') project = models.ForeignKey('Project', related_name='tasks')
type = models.CharField(max_length=10, type = models.CharField(max_length=10, choices=TASK_TYPE_CHOICES,
choices=TASK_TYPE_CHOICES, default='task') default='task')
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now_add=True)
finished_date = models.DateTimeField(null=True, blank=True) finished_date = models.DateTimeField(null=True, blank=True)
last_status = models.CharField(max_length=50, last_status = models.CharField(max_length=50, choices=TASK_STATUS_CHOICES,
choices=TASK_STATUS_CHOICES, null=True, blank=True) null=True, blank=True)
subject = models.CharField(max_length=500) subject = models.CharField(max_length=500)
description = models.TextField(blank=True) description = models.TextField(blank=True)
assigned_to = models.ForeignKey('auth.User', assigned_to = models.ForeignKey('auth.User',
related_name='user_storys_assigned_to_me', related_name='user_storys_assigned_to_me',
blank=True, null=True, default=None) blank=True, null=True, default=None)
watchers = models.ManyToManyField('auth.User', watchers = models.ManyToManyField('auth.User', related_name='task_watch',
related_name='task_watch', null=True) null=True)
changes = generic.GenericRelation(Change) changes = generic.GenericRelation(Change)
@ -706,39 +481,6 @@ class Task(models.Model):
def fake_status(self): def fake_status(self):
return SCRUM_STATES.get_us_state_for_task_state(self.status) return SCRUM_STATES.get_us_state_for_task_state(self.status)
@models.permalink
def get_absolute_url(self):
if self.type == "bug":
return ('issues-view', (), {'pslug':self.project.slug, 'tref': self.ref})
else:
return ('tasks-view', (), {'pslug':self.project.slug, 'tref': self.ref})
@models.permalink
def get_edit_url(self):
if self.type == 'bug':
return ('issues-edit', (),
{'pslug': self.project.slug, 'tref': self.ref})
else:
#TODO: make this url
return ('issues-edit', (),
{'pslug': self.project.slug, 'tref': self.ref})
#return ('tasks-edit', (),
#{'pslug': self.project.slug, 'tref': self.ref})
@models.permalink
def get_view_url(self):
if self.type == "bug":
return ('issues-view', (), {'pslug':self.project.slug, 'tref': self.ref})
else:
return ('tasks-view', (), {'pslug':self.project.slug, 'tref': self.ref})
@models.permalink
def get_delete_url(self):
if self.type == "bug":
return ('issues-delete', (), {'pslug':self.project.slug, 'tref': self.ref})
else:
return ('tasks-delete', (), {'pslug':self.project.slug, 'tref': self.ref})
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
last_user_story = None last_user_story = None
if self.last_user_story != self.user_story: if self.last_user_story != self.user_story:
@ -769,40 +511,4 @@ class Task(models.Model):
self.user_story.update_status() self.user_story.update_status()
def to_dict(self):
self_dict = {
'id': self.pk,
'editUrl': self.get_edit_url(),
'viewUrl': self.get_view_url(),
'deleteUrl': self.get_delete_url(),
'subject': self.subject,
'type': self.get_type_display(),
'statusDisplay': self.get_status_display(),
'status': self.status,
'fakeStatus': self.fake_status,
'us': self.user_story and self.user_story.pk or None,
'assignedTo': self.assigned_to and self.assigned_to.pk or None,
'tags': [tag.to_dict() for tag in self.tags.all()],
'priority': self.priority,
'priorityDisplay': self.get_priority_display(),
'severity': self.severity,
'severityDisplay': self.get_severity_display(),
}
if self_dict['assignedTo']:
self_dict['assignedToDisplay'] = self.assigned_to.get_full_name()
else:
self_dict['assignedToDisplay'] = ugettext("Unassigned")
return self_dict
#reversion.register(ProjectExtras)
#reversion.register(Project)
#reversion.register(ProjectUserRole)
#reversion.register(Milestone)
#reversion.register(UserStory)
#reversion.register(Change)
#reversion.register(ChangeAttachment)
#reversion.register(Task)
from . import sigdispatch from . import sigdispatch

View File

@ -1,5 +1,6 @@
from django.db import models from django.db import models
class WikiPage(models.Model): class WikiPage(models.Model):
project = models.ForeignKey('scrum.Project', related_name='wiki_pages') project = models.ForeignKey('scrum.Project', related_name='wiki_pages')
slug = models.SlugField(max_length=500, db_index=True) slug = models.SlugField(max_length=500, db_index=True)
@ -7,36 +8,11 @@ class WikiPage(models.Model):
owner = models.ForeignKey("auth.User", related_name="wiki_pages", null=True) owner = models.ForeignKey("auth.User", related_name="wiki_pages", null=True)
watchers = models.ManyToManyField('auth.User', watchers = models.ManyToManyField('auth.User',
related_name='wikipage_watchers', null=True) related_name='wikipage_watchers',
null=True)
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
@models.permalink
def get_absolute_url(self):
return ('wiki-page', (),
{'pslug': self.project.slug, 'wslug': self.slug})
@models.permalink
def get_view_url(self):
return ('wiki-page', (),
{'pslug': self.project.slug, 'wslug': self.slug})
@models.permalink
def get_edit_url(self):
return ('wiki-page-edit', (),
{'pslug': self.project.slug, 'wslug': self.slug})
@models.permalink
def get_delete_url(self):
return ('wiki-page-delete', (),
{'pslug': self.project.slug, 'wslug': self.slug})
@models.permalink
def get_history_view_url(self):
return ('wiki-page-history', (),
{'pslug': self.project.slug, 'wslug': self.slug})
class WikiPageHistory(models.Model): class WikiPageHistory(models.Model):
wikipage = models.ForeignKey("WikiPage", related_name="history_entries") wikipage = models.ForeignKey("WikiPage", related_name="history_entries")
@ -44,18 +20,11 @@ class WikiPageHistory(models.Model):
created_date = models.DateTimeField() created_date = models.DateTimeField()
owner = models.ForeignKey("auth.User", related_name="wiki_page_historys") owner = models.ForeignKey("auth.User", related_name="wiki_page_historys")
# TODO: fix this permalink. this implementation is bad for performance.
@models.permalink
def get_history_view_url(self):
return ('wiki-page-history-view', (),
{'pslug': self.wikipage.project.slug, 'wslug': self.wikipage.slug, 'hpk': self.pk})
class WikiPageAttachment(models.Model): class WikiPageAttachment(models.Model):
wikipage = models.ForeignKey('WikiPage', related_name='attachments') wikipage = models.ForeignKey('WikiPage', related_name='attachments')
owner = models.ForeignKey("auth.User", related_name="wikifiles") owner = models.ForeignKey("auth.User", related_name="wikifiles")
created_date = models.DateTimeField(auto_now_add=True) created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now_add=True)
attached_file = models.FileField(upload_to="files/wiki", attached_file = models.FileField(upload_to="files/wiki", max_length=500,
max_length=500, null=True, blank=True) null=True, blank=True)