usage of cached_property
parent
11a116029a
commit
6c63d02b17
|
@ -116,8 +116,8 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin,
|
||||||
'estimated_finish': milestone.estimated_finish,
|
'estimated_finish': milestone.estimated_finish,
|
||||||
'total_points': total_points,
|
'total_points': total_points,
|
||||||
'completed_points': milestone.closed_points.values(),
|
'completed_points': milestone.closed_points.values(),
|
||||||
'total_userstories': milestone.get_cached_user_stories().count(),
|
'total_userstories': milestone.cached_user_stories.count(),
|
||||||
'completed_userstories': milestone.get_cached_user_stories().filter(is_closed=True).count(),
|
'completed_userstories': milestone.cached_user_stories.filter(is_closed=True).count(),
|
||||||
'total_tasks': milestone.tasks.count(),
|
'total_tasks': milestone.tasks.count(),
|
||||||
'completed_tasks': milestone.tasks.filter(status__is_closed=True).count(),
|
'completed_tasks': milestone.tasks.filter(status__is_closed=True).count(),
|
||||||
'iocaine_doses': milestone.tasks.filter(is_iocaine=True).count(),
|
'iocaine_doses': milestone.tasks.filter(is_iocaine=True).count(),
|
||||||
|
|
|
@ -22,6 +22,7 @@ from django.conf import settings
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
from taiga.base.utils.slug import slugify_uniquely
|
from taiga.base.utils.slug import slugify_uniquely
|
||||||
from taiga.base.utils.dicts import dict_sum
|
from taiga.base.utils.dicts import dict_sum
|
||||||
|
@ -57,7 +58,6 @@ class Milestone(WatchedModelMixin, models.Model):
|
||||||
verbose_name=_("order"))
|
verbose_name=_("order"))
|
||||||
_importing = None
|
_importing = None
|
||||||
_total_closed_points_by_date = None
|
_total_closed_points_by_date = None
|
||||||
_cached_user_stories = None
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "milestone"
|
verbose_name = "milestone"
|
||||||
|
@ -87,13 +87,9 @@ class Milestone(WatchedModelMixin, models.Model):
|
||||||
|
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
def get_cached_user_stories(self):
|
@cached_property
|
||||||
if self._cached_user_stories is None:
|
def cached_user_stories(self):
|
||||||
self._cached_user_stories = self.user_stories.\
|
return self.user_stories.prefetch_related("role_points", "role_points__points").annotate(num_tasks=Count("tasks"))
|
||||||
prefetch_related("role_points", "role_points__points").\
|
|
||||||
annotate(num_tasks=Count("tasks"))
|
|
||||||
|
|
||||||
return self._cached_user_stories
|
|
||||||
|
|
||||||
def _get_user_stories_points(self, user_stories):
|
def _get_user_stories_points(self, user_stories):
|
||||||
role_points = [us.role_points.all() for us in user_stories]
|
role_points = [us.role_points.all() for us in user_stories]
|
||||||
|
@ -104,13 +100,13 @@ class Milestone(WatchedModelMixin, models.Model):
|
||||||
@property
|
@property
|
||||||
def total_points(self):
|
def total_points(self):
|
||||||
return self._get_user_stories_points(
|
return self._get_user_stories_points(
|
||||||
[us for us in self.get_cached_user_stories()]
|
[us for us in self.cached_user_stories]
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def closed_points(self):
|
def closed_points(self):
|
||||||
return self._get_user_stories_points(
|
return self._get_user_stories_points(
|
||||||
[us for us in self.get_cached_user_stories() if us.is_closed]
|
[us for us in self.cached_user_stories if us.is_closed]
|
||||||
)
|
)
|
||||||
|
|
||||||
def _get_increment_points(self):
|
def _get_increment_points(self):
|
||||||
|
@ -168,7 +164,7 @@ class Milestone(WatchedModelMixin, models.Model):
|
||||||
|
|
||||||
# We need to keep the milestone user stories indexed by id in a dict
|
# We need to keep the milestone user stories indexed by id in a dict
|
||||||
user_stories = {}
|
user_stories = {}
|
||||||
for us in self.get_cached_user_stories():
|
for us in self.cached_user_stories:
|
||||||
us._total_us_points = sum(self._get_user_stories_points([us]).values())
|
us._total_us_points = sum(self._get_user_stories_points([us]).values())
|
||||||
user_stories[us.id] = us
|
user_stories[us.id] = us
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ from django.dispatch import receiver
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
from django_pgjson.fields import JsonField
|
from django_pgjson.fields import JsonField
|
||||||
from djorm_pgarray.fields import TextArrayField
|
from djorm_pgarray.fields import TextArrayField
|
||||||
|
@ -251,7 +252,6 @@ class Project(ProjectDefaults, TaggedMixin, models.Model):
|
||||||
choices=choices.BLOCKING_CODES + settings.EXTRA_BLOCKING_CODES, default=None,
|
choices=choices.BLOCKING_CODES + settings.EXTRA_BLOCKING_CODES, default=None,
|
||||||
verbose_name=_("blocked code"))
|
verbose_name=_("blocked code"))
|
||||||
|
|
||||||
_cached_user_stories = None
|
|
||||||
_importing = None
|
_importing = None
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -341,13 +341,9 @@ class Project(ProjectDefaults, TaggedMixin, models.Model):
|
||||||
if save:
|
if save:
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
@property
|
@cached_property
|
||||||
def cached_user_stories(self):
|
def cached_user_stories(self):
|
||||||
print(1111111, self._cached_user_stories)
|
return list(self.user_stories.all())
|
||||||
if self._cached_user_stories is None:
|
|
||||||
self._cached_user_stories = list(self.user_stories.all())
|
|
||||||
|
|
||||||
return self._cached_user_stories
|
|
||||||
|
|
||||||
def get_roles(self):
|
def get_roles(self):
|
||||||
return self.roles.all()
|
return self.roles.all()
|
||||||
|
|
Loading…
Reference in New Issue