Add order attr for user stories relationships
parent
a7c262ffdc
commit
46006706c5
|
@ -1,5 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- 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 __future__ import unicode_literals
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -15,9 +15,9 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('projects', '0049_auto_20160629_1443'),
|
|
||||||
('userstories', '0012_auto_20160614_1201'),
|
('userstories', '0012_auto_20160614_1201'),
|
||||||
|
('projects', '0049_auto_20160629_1443'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
@ -30,11 +30,9 @@ class Migration(migrations.Migration):
|
||||||
('is_blocked', models.BooleanField(default=False, verbose_name='is blocked')),
|
('is_blocked', models.BooleanField(default=False, verbose_name='is blocked')),
|
||||||
('blocked_note', models.TextField(blank=True, default='', verbose_name='blocked note')),
|
('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')),
|
('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')),
|
('epics_order', models.IntegerField(default=10000, verbose_name='epics order')),
|
||||||
('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')),
|
('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')),
|
||||||
('modified_date', models.DateTimeField(verbose_name='modified 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')),
|
('subject', models.TextField(verbose_name='subject')),
|
||||||
('description', models.TextField(blank=True, verbose_name='description')),
|
('description', models.TextField(blank=True, verbose_name='description')),
|
||||||
('client_requirement', models.BooleanField(default=False, verbose_name='is client requirement')),
|
('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')),
|
('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')),
|
('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')),
|
('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={
|
options={
|
||||||
|
'ordering': ['project', 'epics_order', 'ref'],
|
||||||
'verbose_name_plural': 'epics',
|
'verbose_name_plural': 'epics',
|
||||||
'ordering': ['project', 'ref'],
|
|
||||||
'verbose_name': 'epic',
|
'verbose_name': 'epic',
|
||||||
},
|
},
|
||||||
bases=(taiga.projects.notifications.mixins.WatchedModelMixin, models.Model),
|
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
|
# Execute trigger after epic update
|
||||||
migrations.RunSQL(
|
migrations.RunSQL(
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -39,8 +39,6 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
|
||||||
status = models.ForeignKey("projects.EpicStatus", null=True, blank=True,
|
status = models.ForeignKey("projects.EpicStatus", null=True, blank=True,
|
||||||
related_name="epics", verbose_name=_("status"),
|
related_name="epics", verbose_name=_("status"),
|
||||||
on_delete=models.SET_NULL)
|
on_delete=models.SET_NULL)
|
||||||
is_closed = models.BooleanField(default=False)
|
|
||||||
|
|
||||||
epics_order = models.IntegerField(null=False, blank=False, default=10000,
|
epics_order = models.IntegerField(null=False, blank=False, default=10000,
|
||||||
verbose_name=_("epics order"))
|
verbose_name=_("epics order"))
|
||||||
|
|
||||||
|
@ -49,8 +47,6 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
|
||||||
default=timezone.now)
|
default=timezone.now)
|
||||||
modified_date = models.DateTimeField(null=False, blank=False,
|
modified_date = models.DateTimeField(null=False, blank=False,
|
||||||
verbose_name=_("modified date"))
|
verbose_name=_("modified date"))
|
||||||
finish_date = models.DateTimeField(null=True, blank=True,
|
|
||||||
verbose_name=_("finish date"))
|
|
||||||
|
|
||||||
subject = models.TextField(null=False, blank=False,
|
subject = models.TextField(null=False, blank=False,
|
||||||
verbose_name=_("subject"))
|
verbose_name=_("subject"))
|
||||||
|
@ -64,6 +60,7 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
|
||||||
verbose_name=_("is team requirement"))
|
verbose_name=_("is team requirement"))
|
||||||
|
|
||||||
user_stories = models.ManyToManyField("userstories.UserStory", related_name="epics",
|
user_stories = models.ManyToManyField("userstories.UserStory", related_name="epics",
|
||||||
|
through='RelatedUserStory',
|
||||||
verbose_name=_("user stories"))
|
verbose_name=_("user stories"))
|
||||||
|
|
||||||
attachments = GenericRelation("attachments.Attachment")
|
attachments = GenericRelation("attachments.Attachment")
|
||||||
|
@ -73,7 +70,7 @@ class Epic(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.M
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "epic"
|
verbose_name = "epic"
|
||||||
verbose_name_plural = "epics"
|
verbose_name_plural = "epics"
|
||||||
ordering = ["project", "ref"]
|
ordering = ["project", "epics_order", "ref"]
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self._importing or not self.modified_date:
|
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)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "({1}) {0}".format(self.ref, self.subject)
|
return "#{0} {1}".format(self.ref, self.subject)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Epic %s>" % (self.id)
|
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