Add order attr for user stories relationships
parent
a7c262ffdc
commit
46006706c5
|
@ -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(
|
||||
"""
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue