usage of cached_property

remotes/origin/issue/4795/notification_even_they_are_disabled
Yaser Alraddadi 2016-02-19 03:06:39 +03:00 committed by Alejandro Alonso
parent 11a116029a
commit 6c63d02b17
3 changed files with 12 additions and 20 deletions

View File

@ -116,8 +116,8 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin,
'estimated_finish': milestone.estimated_finish,
'total_points': total_points,
'completed_points': milestone.closed_points.values(),
'total_userstories': milestone.get_cached_user_stories().count(),
'completed_userstories': milestone.get_cached_user_stories().filter(is_closed=True).count(),
'total_userstories': milestone.cached_user_stories.count(),
'completed_userstories': milestone.cached_user_stories.filter(is_closed=True).count(),
'total_tasks': milestone.tasks.count(),
'completed_tasks': milestone.tasks.filter(status__is_closed=True).count(),
'iocaine_doses': milestone.tasks.filter(is_iocaine=True).count(),

View File

@ -22,6 +22,7 @@ from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
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.dicts import dict_sum
@ -57,7 +58,6 @@ class Milestone(WatchedModelMixin, models.Model):
verbose_name=_("order"))
_importing = None
_total_closed_points_by_date = None
_cached_user_stories = None
class Meta:
verbose_name = "milestone"
@ -87,13 +87,9 @@ class Milestone(WatchedModelMixin, models.Model):
super().save(*args, **kwargs)
def get_cached_user_stories(self):
if self._cached_user_stories is None:
self._cached_user_stories = self.user_stories.\
prefetch_related("role_points", "role_points__points").\
annotate(num_tasks=Count("tasks"))
return self._cached_user_stories
@cached_property
def cached_user_stories(self):
return self.user_stories.prefetch_related("role_points", "role_points__points").annotate(num_tasks=Count("tasks"))
def _get_user_stories_points(self, user_stories):
role_points = [us.role_points.all() for us in user_stories]
@ -104,13 +100,13 @@ class Milestone(WatchedModelMixin, models.Model):
@property
def total_points(self):
return self._get_user_stories_points(
[us for us in self.get_cached_user_stories()]
[us for us in self.cached_user_stories]
)
@property
def closed_points(self):
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):
@ -168,7 +164,7 @@ class Milestone(WatchedModelMixin, models.Model):
# We need to keep the milestone user stories indexed by id in a dict
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())
user_stories[us.id] = us

View File

@ -28,6 +28,7 @@ from django.dispatch import receiver
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.utils.functional import cached_property
from django_pgjson.fields import JsonField
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,
verbose_name=_("blocked code"))
_cached_user_stories = None
_importing = None
class Meta:
@ -341,13 +341,9 @@ class Project(ProjectDefaults, TaggedMixin, models.Model):
if save:
self.save()
@property
@cached_property
def cached_user_stories(self):
print(1111111, self._cached_user_stories)
if self._cached_user_stories is None:
self._cached_user_stories = list(self.user_stories.all())
return self._cached_user_stories
return list(self.user_stories.all())
def get_roles(self):
return self.roles.all()