From 6c63d02b17d49ae37c0696b5024d7a6d523c441b Mon Sep 17 00:00:00 2001 From: Yaser Alraddadi Date: Fri, 19 Feb 2016 03:06:39 +0300 Subject: [PATCH] usage of cached_property --- taiga/projects/milestones/api.py | 4 ++-- taiga/projects/milestones/models.py | 18 +++++++----------- taiga/projects/models.py | 10 +++------- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index b4d54023..1728362b 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -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(), diff --git a/taiga/projects/milestones/models.py b/taiga/projects/milestones/models.py index 65459a6a..1e30d858 100644 --- a/taiga/projects/milestones/models.py +++ b/taiga/projects/milestones/models.py @@ -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 diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 5bcb546b..5cbf5554 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -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()