Add order attr for user stories relationships

remotes/origin/issue/4795/notification_even_they_are_disabled
David Barragán Merino 2016-07-05 13:15:51 +02:00
parent a7c262ffdc
commit 46006706c5
2 changed files with 43 additions and 13 deletions

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-29 14:43
# Generated by Django 1.9.2 on 2016-07-05 11:12
from __future__ import unicode_literals
from django.conf import settings
@ -15,9 +15,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('projects', '0049_auto_20160629_1443'),
('userstories', '0012_auto_20160614_1201'),
('projects', '0049_auto_20160629_1443'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@ -30,11 +30,9 @@ class Migration(migrations.Migration):
('is_blocked', models.BooleanField(default=False, verbose_name='is blocked')),
('blocked_note', models.TextField(blank=True, default='', verbose_name='blocked note')),
('ref', models.BigIntegerField(blank=True, db_index=True, default=None, null=True, verbose_name='ref')),
('is_closed', models.BooleanField(default=False)),
('epics_order', models.IntegerField(default=10000, verbose_name='epics order')),
('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')),
('modified_date', models.DateTimeField(verbose_name='modified date')),
('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='finish date')),
('subject', models.TextField(verbose_name='subject')),
('description', models.TextField(blank=True, verbose_name='description')),
('client_requirement', models.BooleanField(default=False, verbose_name='is client requirement')),
@ -43,15 +41,33 @@ class Migration(migrations.Migration):
('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owned_epics', to=settings.AUTH_USER_MODEL, verbose_name='owner')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='epics', to='projects.Project', verbose_name='project')),
('status', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='epics', to='projects.EpicStatus', verbose_name='status')),
('user_stories', models.ManyToManyField(related_name='epics', to='userstories.UserStory', verbose_name='user stories')),
],
options={
'ordering': ['project', 'epics_order', 'ref'],
'verbose_name_plural': 'epics',
'ordering': ['project', 'ref'],
'verbose_name': 'epic',
},
bases=(taiga.projects.notifications.mixins.WatchedModelMixin, models.Model),
),
migrations.CreateModel(
name='RelatedUserStory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.IntegerField(default=10000, verbose_name='order')),
('epic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='epics.Epic')),
('user_story', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='userstories.UserStory')),
],
options={
'ordering': ['user_story', 'order', 'id'],
'verbose_name_plural': 'related user stories',
'verbose_name': 'related user story',
},
),
migrations.AddField(
model_name='epic',
name='user_stories',
field=models.ManyToManyField(related_name='epics', through='epics.RelatedUserStory', to='userstories.UserStory', verbose_name='user stories'),
),
# Execute trigger after epic update
migrations.RunSQL(
"""

View File

@ -39,8 +39,6 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
status = models.ForeignKey("projects.EpicStatus", null=True, blank=True,
related_name="epics", verbose_name=_("status"),
on_delete=models.SET_NULL)
is_closed = models.BooleanField(default=False)
epics_order = models.IntegerField(null=False, blank=False, default=10000,
verbose_name=_("epics order"))
@ -49,8 +47,6 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
default=timezone.now)
modified_date = models.DateTimeField(null=False, blank=False,
verbose_name=_("modified date"))
finish_date = models.DateTimeField(null=True, blank=True,
verbose_name=_("finish date"))
subject = models.TextField(null=False, blank=False,
verbose_name=_("subject"))
@ -64,6 +60,7 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
verbose_name=_("is team requirement"))
user_stories = models.ManyToManyField("userstories.UserStory", related_name="epics",
through='RelatedUserStory',
verbose_name=_("user stories"))
attachments = GenericRelation("attachments.Attachment")
@ -73,7 +70,7 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
class Meta:
verbose_name = "epic"
verbose_name_plural = "epics"
ordering = ["project", "ref"]
ordering = ["project", "epics_order", "ref"]
def save(self, *args, **kwargs):
if not self._importing or not self.modified_date:
@ -85,7 +82,24 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
super().save(*args, **kwargs)
def __str__(self):
return "({1}) {0}".format(self.ref, self.subject)
return "#{0} {1}".format(self.ref, self.subject)
def __repr__(self):
return "<Epic %s>" % (self.id)
class RelatedUserStory(models.Model):
user_story = models.ForeignKey("userstories.UserStory", on_delete=models.CASCADE)
epic = models.ForeignKey("epics.Epic", on_delete=models.CASCADE)
order = models.IntegerField(null=False, blank=False, default=10000,
verbose_name=_("order"))
class Meta:
verbose_name = "related user story"
verbose_name_plural = "related user stories"
ordering = ["user_story", "order", "id"]
def __str__(self):
return "{0} - {1}".format(self.epic, self.user_story)