diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index ca3607cf6..c2a8fce33 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -5,9 +5,10 @@ import uuid from django.db import models, transaction from django.db.models import Q from django.utils.translation import ugettext_lazy as _ +from django.core.cache import cache from orgs.mixins import OrgModelMixin -from orgs.utils import current_org, set_current_org, get_current_org +from orgs.utils import set_current_org, get_current_org from orgs.models import Organization __all__ = ['Node'] @@ -21,10 +22,10 @@ class Node(OrgModelMixin): date_create = models.DateTimeField(auto_now_add=True) is_node = True + _full_value_cache_key_prefix = '_NODE_VALUE_{}' def __str__(self): - return self.value - # return self.full_value + return self.full_value def __eq__(self, other): return self.key == other.key @@ -47,10 +48,29 @@ class Node(OrgModelMixin): @property def full_value(self): - ancestor = [a.value for a in self.get_ancestor(with_self=True)] + key = self._full_value_cache_key_prefix.format(self.key) + cached = cache.get(key) + if cached: + return cached + value = self.get_full_value() + self.cache_full_value(value) + return value + + def get_full_value(self): + # ancestor = [a.value for a in self.get_ancestor(with_self=True)] if self.is_root(): return self.value - return ' / '.join(ancestor) + parent_full_value = self.parent.full_value + value = parent_full_value + ' / ' + self.value + return value + + def cache_full_value(self, value): + key = self._full_value_cache_key_prefix.format(self.key) + cache.set(key, value, 3600) + + def expire_full_value(self): + key = self._full_value_cache_key_prefix.format(self.key) + cache.delete_pattern(key+'*') @property def level(self): @@ -204,6 +224,10 @@ class Node(OrgModelMixin): defaults = {'value': 'Default'} return cls.objects.get_or_create(defaults=defaults, key='0') + @classmethod + def get_tree_name_ref(cls): + pass + @classmethod def generate_fake(cls, count=100): import random @@ -212,4 +236,3 @@ class Node(OrgModelMixin): node.create_child('Node {}'.format(i)) - diff --git a/apps/assets/signals_handler.py b/apps/assets/signals_handler.py index 157c88012..71866c5d0 100644 --- a/apps/assets/signals_handler.py +++ b/apps/assets/signals_handler.py @@ -86,3 +86,9 @@ def on_node_assets_changed(sender, instance=None, **kwargs): system_users = SystemUser.objects.filter(nodes=instance) for system_user in system_users: system_user.assets.add(*tuple(assets)) + + +@receiver(post_save, sender=Node) +def on_node_update_or_created(sender, instance=None, created=False, **kwargs): + if instance and not created: + instance.expire_full_value() diff --git a/apps/orgs/apps.py b/apps/orgs/apps.py index fdd6dc1b6..c83d67e3c 100644 --- a/apps/orgs/apps.py +++ b/apps/orgs/apps.py @@ -3,3 +3,6 @@ from django.apps import AppConfig class OrgsConfig(AppConfig): name = 'orgs' + + def ready(self): + from . import signals_handler diff --git a/apps/orgs/hands.py b/apps/orgs/hands.py new file mode 100644 index 000000000..f3dbd3211 --- /dev/null +++ b/apps/orgs/hands.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# +from assets.models import Node +from orgs.utils import set_current_org, current_org diff --git a/apps/orgs/models.py b/apps/orgs/models.py index 5d3539ae1..f9e866741 100644 --- a/apps/orgs/models.py +++ b/apps/orgs/models.py @@ -27,7 +27,7 @@ class Organization(models.Model): def expire_cache(self): key = self.CACHE_PREFIX.format(self.id) - cache.set(key, self, 0) + cache.set(key, self, 1) @classmethod def get_instance_from_cache(cls, oid): diff --git a/apps/orgs/signals_handler.py b/apps/orgs/signals_handler.py new file mode 100644 index 000000000..9427649b2 --- /dev/null +++ b/apps/orgs/signals_handler.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# + +from django.db.models.signals import post_save +from django.dispatch import receiver + +from .models import Organization +from .hands import set_current_org, current_org, Node + + +@receiver(post_save, sender=Organization) +def on_org_create_or_update(sender, instance=None, created=False, **kwargs): + if instance: + old_org = current_org + set_current_org(instance) + node_root = Node.root() + if node_root.value != instance.name: + node_root.value = instance.name + node_root.save() + set_current_org(old_org) + + if instance and not created: + instance.expire_cache()