Add duedates attributes to retrive project
parent
0ea3898f8d
commit
872ad281b4
|
@ -940,9 +940,12 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
"points": getattr(project.default_points, "name", None),
|
"points": getattr(project.default_points, "name", None),
|
||||||
"epic_status": getattr(project.default_epic_status, "name", None),
|
"epic_status": getattr(project.default_epic_status, "name", None),
|
||||||
"us_status": getattr(project.default_us_status, "name", None),
|
"us_status": getattr(project.default_us_status, "name", None),
|
||||||
|
"us_duedate": getattr(project.default_us_duedate, "name", None),
|
||||||
"task_status": getattr(project.default_task_status, "name", None),
|
"task_status": getattr(project.default_task_status, "name", None),
|
||||||
|
"task_duedate": getattr(project.default_task_duedate, "name", None),
|
||||||
"issue_status": getattr(project.default_issue_status, "name", None),
|
"issue_status": getattr(project.default_issue_status, "name", None),
|
||||||
"issue_type": getattr(project.default_issue_type, "name", None),
|
"issue_type": getattr(project.default_issue_type, "name", None),
|
||||||
|
"issue_duedate": getattr(project.default_issue_duedate, "name", None),
|
||||||
"priority": getattr(project.default_priority, "name", None),
|
"priority": getattr(project.default_priority, "name", None),
|
||||||
"severity": getattr(project.default_severity, "name", None)
|
"severity": getattr(project.default_severity, "name", None)
|
||||||
}
|
}
|
||||||
|
@ -969,6 +972,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
"order": us_status.order,
|
"order": us_status.order,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
self.us_duedates = []
|
||||||
|
for us_duedate in project.us_duedates.all():
|
||||||
|
self.us_duedates.append({
|
||||||
|
"name": us_duedate.name,
|
||||||
|
"slug": us_duedate.slug,
|
||||||
|
"by_default": us_duedate.by_default,
|
||||||
|
"color": us_duedate.color,
|
||||||
|
"days_to_due": us_duedate.days_to_due,
|
||||||
|
"order": us_duedate.order,
|
||||||
|
})
|
||||||
|
|
||||||
self.points = []
|
self.points = []
|
||||||
for us_point in project.points.all():
|
for us_point in project.points.all():
|
||||||
self.points.append({
|
self.points.append({
|
||||||
|
@ -987,6 +1001,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
"order": task_status.order,
|
"order": task_status.order,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
self.task_duedates = []
|
||||||
|
for task_duedate in project.task_duedates.all():
|
||||||
|
self.task_duedates.append({
|
||||||
|
"name": task_duedate.name,
|
||||||
|
"slug": task_duedate.slug,
|
||||||
|
"by_default": task_duedate.by_default,
|
||||||
|
"color": task_duedate.color,
|
||||||
|
"days_to_due": task_duedate.days_to_due,
|
||||||
|
"order": task_duedate.order,
|
||||||
|
})
|
||||||
|
|
||||||
self.issue_statuses = []
|
self.issue_statuses = []
|
||||||
for issue_status in project.issue_statuses.all():
|
for issue_status in project.issue_statuses.all():
|
||||||
self.issue_statuses.append({
|
self.issue_statuses.append({
|
||||||
|
@ -1005,6 +1030,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
"order": issue_type.order,
|
"order": issue_type.order,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
self.issue_duedates = []
|
||||||
|
for issue_duedate in project.issue_duedates.all():
|
||||||
|
self.issue_duedates.append({
|
||||||
|
"name": issue_duedate.name,
|
||||||
|
"slug": issue_duedate.slug,
|
||||||
|
"by_default": issue_duedate.by_default,
|
||||||
|
"color": issue_duedate.color,
|
||||||
|
"days_to_due": issue_duedate.days_to_due,
|
||||||
|
"order": issue_duedate.order,
|
||||||
|
})
|
||||||
|
|
||||||
self.priorities = []
|
self.priorities = []
|
||||||
for priority in project.priorities.all():
|
for priority in project.priorities.all():
|
||||||
self.priorities.append({
|
self.priorities.append({
|
||||||
|
@ -1116,6 +1152,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
project=project
|
project=project
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for us_duedate in self.us_duedates:
|
||||||
|
UserStoryDueDate.objects.create(
|
||||||
|
name=us_duedate["name"],
|
||||||
|
slug=us_duedate["slug"],
|
||||||
|
by_default=us_duedate["by_default"],
|
||||||
|
color=us_duedate["color"],
|
||||||
|
days_to_due=us_duedate["days_to_due"],
|
||||||
|
order=us_duedate["order"],
|
||||||
|
project=project
|
||||||
|
)
|
||||||
|
|
||||||
for point in self.points:
|
for point in self.points:
|
||||||
Points.objects.create(
|
Points.objects.create(
|
||||||
name=point["name"],
|
name=point["name"],
|
||||||
|
@ -1134,6 +1181,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
project=project
|
project=project
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for task_duedate in self.task_duedates:
|
||||||
|
TaskDueDate.objects.create(
|
||||||
|
name=task_duedate["name"],
|
||||||
|
slug=task_duedate["slug"],
|
||||||
|
by_default=task_duedate["by_default"],
|
||||||
|
color=task_duedate["color"],
|
||||||
|
days_to_due=task_duedate["days_to_due"],
|
||||||
|
order=task_duedate["order"],
|
||||||
|
project=project
|
||||||
|
)
|
||||||
|
|
||||||
for issue_status in self.issue_statuses:
|
for issue_status in self.issue_statuses:
|
||||||
IssueStatus.objects.create(
|
IssueStatus.objects.create(
|
||||||
name=issue_status["name"],
|
name=issue_status["name"],
|
||||||
|
@ -1152,6 +1210,17 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
project=project
|
project=project
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for issue_duedate in self.issue_duedates:
|
||||||
|
IssueDueDate.objects.create(
|
||||||
|
name=issue_duedate["name"],
|
||||||
|
slug=issue_duedate["slug"],
|
||||||
|
by_default=issue_duedate["by_default"],
|
||||||
|
color=issue_duedate["color"],
|
||||||
|
days_to_due=issue_duedate["days_to_due"],
|
||||||
|
order=issue_duedate["order"],
|
||||||
|
project=project
|
||||||
|
)
|
||||||
|
|
||||||
for priority in self.priorities:
|
for priority in self.priorities:
|
||||||
Priority.objects.create(
|
Priority.objects.create(
|
||||||
name=priority["name"],
|
name=priority["name"],
|
||||||
|
@ -1185,6 +1254,9 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
if self.us_statuses:
|
if self.us_statuses:
|
||||||
project.default_us_status = UserStoryStatus.objects.get(name=self.default_options["us_status"],
|
project.default_us_status = UserStoryStatus.objects.get(name=self.default_options["us_status"],
|
||||||
project=project)
|
project=project)
|
||||||
|
if self.us_duedates:
|
||||||
|
project.default_us_duedate = UserStoryDueDate.objects.get(name=self.default_options["us_duedates"],
|
||||||
|
project=project)
|
||||||
if self.points:
|
if self.points:
|
||||||
project.default_points = Points.objects.get(name=self.default_options["points"],
|
project.default_points = Points.objects.get(name=self.default_options["points"],
|
||||||
project=project)
|
project=project)
|
||||||
|
@ -1192,10 +1264,15 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
|
||||||
if self.task_statuses:
|
if self.task_statuses:
|
||||||
project.default_task_status = TaskStatus.objects.get(name=self.default_options["task_status"],
|
project.default_task_status = TaskStatus.objects.get(name=self.default_options["task_status"],
|
||||||
project=project)
|
project=project)
|
||||||
|
if self.task_duedates:
|
||||||
|
project.default_task_duedate = TaskDueDate.objects.get(name=self.default_options["task_duedates"],
|
||||||
|
project=project)
|
||||||
if self.issue_statuses:
|
if self.issue_statuses:
|
||||||
project.default_issue_status = IssueStatus.objects.get(name=self.default_options["issue_status"],
|
project.default_issue_status = IssueStatus.objects.get(name=self.default_options["issue_status"],
|
||||||
project=project)
|
project=project)
|
||||||
|
if self.issue_duedates:
|
||||||
|
project.default_issue_duedate = TaskDueDate.objects.get(name=self.default_options["issue_duedates"],
|
||||||
|
project=project)
|
||||||
if self.issue_types:
|
if self.issue_types:
|
||||||
project.default_issue_type = IssueType.objects.get(name=self.default_options["issue_type"],
|
project.default_issue_type = IssueType.objects.get(name=self.default_options["issue_type"],
|
||||||
project=project)
|
project=project)
|
||||||
|
|
|
@ -37,6 +37,17 @@ from .notifications.choices import NotifyLevel
|
||||||
# Custom values for selectors
|
# Custom values for selectors
|
||||||
######################################################
|
######################################################
|
||||||
|
|
||||||
|
class BaseDueDateSerializer(serializers.LightSerializer):
|
||||||
|
id = Field()
|
||||||
|
name = I18NField()
|
||||||
|
slug = Field()
|
||||||
|
order = Field()
|
||||||
|
by_default = Field()
|
||||||
|
days_to_due = Field()
|
||||||
|
color = Field()
|
||||||
|
project = Field(attr="project_id")
|
||||||
|
|
||||||
|
|
||||||
class EpicStatusSerializer(serializers.LightSerializer):
|
class EpicStatusSerializer(serializers.LightSerializer):
|
||||||
id = Field()
|
id = Field()
|
||||||
name = I18NField()
|
name = I18NField()
|
||||||
|
@ -67,17 +78,6 @@ class PointsSerializer(serializers.LightSerializer):
|
||||||
project = Field(attr="project_id")
|
project = Field(attr="project_id")
|
||||||
|
|
||||||
|
|
||||||
class BaseDueDateSerializer(serializers.LightSerializer):
|
|
||||||
id = Field()
|
|
||||||
name = I18NField()
|
|
||||||
slug = Field()
|
|
||||||
order = Field()
|
|
||||||
by_default = Field()
|
|
||||||
days_to_due = Field()
|
|
||||||
color = Field()
|
|
||||||
project = Field(attr="project_id")
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryDueDateSerializer(BaseDueDateSerializer):
|
class UserStoryDueDateSerializer(BaseDueDateSerializer):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -379,10 +379,13 @@ class ProjectSerializer(serializers.LightSerializer):
|
||||||
class ProjectDetailSerializer(ProjectSerializer):
|
class ProjectDetailSerializer(ProjectSerializer):
|
||||||
epic_statuses = Field(attr="epic_statuses_attr")
|
epic_statuses = Field(attr="epic_statuses_attr")
|
||||||
us_statuses = Field(attr="userstory_statuses_attr")
|
us_statuses = Field(attr="userstory_statuses_attr")
|
||||||
|
us_duedates = Field(attr="userstory_duedates_attr")
|
||||||
points = Field(attr="points_attr")
|
points = Field(attr="points_attr")
|
||||||
task_statuses = Field(attr="task_statuses_attr")
|
task_statuses = Field(attr="task_statuses_attr")
|
||||||
|
task_duedates = Field(attr="task_duedates_attr")
|
||||||
issue_statuses = Field(attr="issue_statuses_attr")
|
issue_statuses = Field(attr="issue_statuses_attr")
|
||||||
issue_types = Field(attr="issue_types_attr")
|
issue_types = Field(attr="issue_types_attr")
|
||||||
|
issue_duedates = Field(attr="issue_duedates_attr")
|
||||||
priorities = Field(attr="priorities_attr")
|
priorities = Field(attr="priorities_attr")
|
||||||
severities = Field(attr="severities_attr")
|
severities = Field(attr="severities_attr")
|
||||||
epic_custom_attributes = Field(attr="epic_custom_attributes_attr")
|
epic_custom_attributes = Field(attr="epic_custom_attributes_attr")
|
||||||
|
@ -413,10 +416,15 @@ class ProjectDetailSerializer(ProjectSerializer):
|
||||||
|
|
||||||
def to_value(self, instance):
|
def to_value(self, instance):
|
||||||
# Name attributes must be translated
|
# Name attributes must be translated
|
||||||
for attr in ["epic_statuses_attr", "userstory_statuses_attr", "points_attr", "task_statuses_attr",
|
for attr in ["epic_statuses_attr", "userstory_statuses_attr",
|
||||||
"issue_statuses_attr", "issue_types_attr", "priorities_attr", "severities_attr",
|
"userstory_duedates_attr", "points_attr",
|
||||||
"epic_custom_attributes_attr", "userstory_custom_attributes_attr",
|
"task_statuses_attr", "task_duedates_attr",
|
||||||
"task_custom_attributes_attr", "issue_custom_attributes_attr", "roles_attr"]:
|
"issue_statuses_attr", "issue_types_attr",
|
||||||
|
"issue_duedates_attr", "priorities_attr",
|
||||||
|
"severities_attr", "epic_custom_attributes_attr",
|
||||||
|
"userstory_custom_attributes_attr",
|
||||||
|
"task_custom_attributes_attr",
|
||||||
|
"issue_custom_attributes_attr", "roles_attr"]:
|
||||||
|
|
||||||
assert hasattr(instance, attr), "instance must have a {} attribute".format(attr)
|
assert hasattr(instance, attr), "instance must have a {} attribute".format(attr)
|
||||||
val = getattr(instance, attr)
|
val = getattr(instance, attr)
|
||||||
|
|
|
@ -167,6 +167,29 @@ def attach_userstory_statuses(queryset, as_field="userstory_statuses_attr"):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
def attach_userstory_duedates(queryset, as_field="userstory_duedates_attr"):
|
||||||
|
"""Attach a json userstory duedates representation to each object of the queryset.
|
||||||
|
|
||||||
|
:param queryset: A Django projects queryset object.
|
||||||
|
:param as_field: Attach the userstory duedates as an attribute with this name.
|
||||||
|
|
||||||
|
:return: Queryset object with the additional `as_field` field.
|
||||||
|
"""
|
||||||
|
model = queryset.model
|
||||||
|
sql = """
|
||||||
|
SELECT json_agg(
|
||||||
|
row_to_json(projects_userstoryduedate)
|
||||||
|
ORDER BY projects_userstoryduedate.order
|
||||||
|
)
|
||||||
|
FROM projects_userstoryduedate
|
||||||
|
WHERE projects_userstoryduedate.project_id = {tbl}.id
|
||||||
|
"""
|
||||||
|
|
||||||
|
sql = sql.format(tbl=model._meta.db_table)
|
||||||
|
queryset = queryset.extra(select={as_field: sql})
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
def attach_points(queryset, as_field="points_attr"):
|
def attach_points(queryset, as_field="points_attr"):
|
||||||
"""Attach a json points representation to each object of the queryset.
|
"""Attach a json points representation to each object of the queryset.
|
||||||
|
|
||||||
|
@ -213,6 +236,29 @@ def attach_task_statuses(queryset, as_field="task_statuses_attr"):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
def attach_task_duedates(queryset, as_field="task_duedates_attr"):
|
||||||
|
"""Attach a json task duedates representation to each object of the queryset.
|
||||||
|
|
||||||
|
:param queryset: A Django projects queryset object.
|
||||||
|
:param as_field: Attach the task duedates as an attribute with this name.
|
||||||
|
|
||||||
|
:return: Queryset object with the additional `as_field` field.
|
||||||
|
"""
|
||||||
|
model = queryset.model
|
||||||
|
sql = """
|
||||||
|
SELECT json_agg(
|
||||||
|
row_to_json(projects_taskduedate)
|
||||||
|
ORDER BY projects_taskduedate.order
|
||||||
|
)
|
||||||
|
FROM projects_taskduedate
|
||||||
|
WHERE projects_taskduedate.project_id = {tbl}.id
|
||||||
|
"""
|
||||||
|
|
||||||
|
sql = sql.format(tbl=model._meta.db_table)
|
||||||
|
queryset = queryset.extra(select={as_field: sql})
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
def attach_issue_statuses(queryset, as_field="issue_statuses_attr"):
|
def attach_issue_statuses(queryset, as_field="issue_statuses_attr"):
|
||||||
"""Attach a json issue statuses representation to each object of the queryset.
|
"""Attach a json issue statuses representation to each object of the queryset.
|
||||||
|
|
||||||
|
@ -259,6 +305,29 @@ def attach_issue_types(queryset, as_field="issue_types_attr"):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
def attach_issue_duedates(queryset, as_field="issue_duedates_attr"):
|
||||||
|
"""Attach a json issue duedates representation to each object of the queryset.
|
||||||
|
|
||||||
|
:param queryset: A Django projects queryset object.
|
||||||
|
:param as_field: Attach the duedates as an attribute with this name.
|
||||||
|
|
||||||
|
:return: Queryset object with the additional `as_field` field.
|
||||||
|
"""
|
||||||
|
model = queryset.model
|
||||||
|
sql = """
|
||||||
|
SELECT json_agg(
|
||||||
|
row_to_json(projects_issueduedate)
|
||||||
|
ORDER BY projects_issueduedate.order
|
||||||
|
)
|
||||||
|
FROM projects_issueduedate
|
||||||
|
WHERE projects_issueduedate.project_id = {tbl}.id
|
||||||
|
"""
|
||||||
|
|
||||||
|
sql = sql.format(tbl=model._meta.db_table)
|
||||||
|
queryset = queryset.extra(select={as_field: sql})
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
def attach_priorities(queryset, as_field="priorities_attr"):
|
def attach_priorities(queryset, as_field="priorities_attr"):
|
||||||
"""Attach a json priorities representation to each object of the queryset.
|
"""Attach a json priorities representation to each object of the queryset.
|
||||||
|
|
||||||
|
@ -530,9 +599,12 @@ def attach_extra_info(queryset, user=None):
|
||||||
queryset = attach_notify_policies(queryset)
|
queryset = attach_notify_policies(queryset)
|
||||||
queryset = attach_epic_statuses(queryset)
|
queryset = attach_epic_statuses(queryset)
|
||||||
queryset = attach_userstory_statuses(queryset)
|
queryset = attach_userstory_statuses(queryset)
|
||||||
|
queryset = attach_userstory_duedates(queryset)
|
||||||
queryset = attach_points(queryset)
|
queryset = attach_points(queryset)
|
||||||
queryset = attach_task_statuses(queryset)
|
queryset = attach_task_statuses(queryset)
|
||||||
|
queryset = attach_task_duedates(queryset)
|
||||||
queryset = attach_issue_statuses(queryset)
|
queryset = attach_issue_statuses(queryset)
|
||||||
|
queryset = attach_issue_duedates(queryset)
|
||||||
queryset = attach_issue_types(queryset)
|
queryset = attach_issue_types(queryset)
|
||||||
queryset = attach_priorities(queryset)
|
queryset = attach_priorities(queryset)
|
||||||
queryset = attach_severities(queryset)
|
queryset = attach_severities(queryset)
|
||||||
|
|
Loading…
Reference in New Issue