From 1216f15e45734f4cc9c6bb3ce69ddd4979a2caef Mon Sep 17 00:00:00 2001 From: Bai <bugatti_it@163.com> Date: Tue, 16 Mar 2021 20:17:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=B0=E6=97=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=AF=B9=E4=BA=8Edefault=5Fnode=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=8F=98=E6=9B=B4=E5=86=B2=E7=AA=81=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98(=E6=97=A7=E7=89=88=E6=9C=AC=E4=BC=9A=E5=B0=86?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC=E8=BF=81=E7=A7=BB=E5=90=8E=E7=9A=84?= =?UTF-8?q?default=5Fnode=E8=8A=82=E7=82=B9=E7=9A=84key=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E9=9D=9E1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/apps.py | 14 -- apps/assets/models/node.py | 151 +++++------------- .../migrations/0010_auto_20210219_1241.py | 2 +- apps/orgs/models.py | 4 +- apps/perms/const.py | 10 -- 5 files changed, 47 insertions(+), 134 deletions(-) delete mode 100644 apps/perms/const.py diff --git a/apps/assets/apps.py b/apps/assets/apps.py index a7267c7b6..04ed9fded 100644 --- a/apps/assets/apps.py +++ b/apps/assets/apps.py @@ -1,16 +1,6 @@ from __future__ import unicode_literals from django.apps import AppConfig -from django.db.models.signals import post_migrate - - -def initial_some_nodes(): - from .models import Node - Node.initial_some_nodes() - - -def initial_some_nodes_callback(sender, **kwargs): - initial_some_nodes() class AssetsConfig(AppConfig): @@ -19,7 +9,3 @@ class AssetsConfig(AppConfig): def ready(self): super().ready() from . import signals_handler - try: - initial_some_nodes() - except Exception: - post_migrate.connect(initial_some_nodes_callback, sender=self) diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index d2a8c3ccf..ad17a8be9 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -465,44 +465,6 @@ class SomeNodesMixin: empty_key = '-11' empty_value = _("empty") - @classmethod - def correct_default_node_if_need(cls): - with tmp_to_root_org(): - wrong_default_org = cls.objects.filter(key='1', value='Default').first() - if not wrong_default_org: - return - - if wrong_default_org.has_children_or_has_assets(): - return - - default_org = Organization.default() - right_default_org = cls.objects.filter(value=default_org.name).first() - if not right_default_org: - return - - if right_default_org.date_create > wrong_default_org.date_create: - return - - with atomic(): - logger.warn(f'Correct default node: ' - f'old={wrong_default_org.value}-{wrong_default_org.key} ' - f'new={right_default_org.value}-{right_default_org.key}') - wrong_default_org.delete() - right_default_org.key = '1' - right_default_org.save() - - @classmethod - def default_node(cls): - cls.correct_default_node_if_need() - - default_org = Organization.default() - with tmp_to_org(default_org): - defaults = {'value': default_org.name} - obj, created = cls.objects.get_or_create( - defaults=defaults, key=cls.default_key, - ) - return obj - def is_default_node(self): return self.key == self.default_key @@ -513,15 +475,36 @@ class SomeNodesMixin: return False @classmethod - def get_next_org_root_node_key(cls): - with tmp_to_org(Organization.root()): - org_nodes_roots = cls.objects.filter(key__regex=r'^[0-9]+$') - org_nodes_roots_keys = org_nodes_roots.values_list('key', flat=True) - if not org_nodes_roots_keys: - org_nodes_roots_keys = ['1'] - max_key = max([int(k) for k in org_nodes_roots_keys]) - key = str(max_key + 1) if max_key > 0 else '2' - return key + def org_root(cls): + # 如果使用current_org 在set_current_org时会死循环 + ori_org = get_current_org() + + if ori_org and ori_org.is_default(): + return cls.default_node() + + if ori_org and ori_org.is_root(): + return None + + org_roots = cls.org_root_nodes() + org_roots_length = len(org_roots) + + if org_roots_length == 1: + root = org_roots[0] + return root + elif org_roots_length == 0: + root = cls.create_org_root_node() + return root + else: + error = 'Current org {} root node not 1, get {}'.format(ori_org, org_roots_length) + raise ValueError(error) + + @classmethod + def default_node(cls): + default_org = Organization.default() + with tmp_to_org(default_org): + defaults = {'value': default_org.name} + obj, created = cls.objects.get_or_create(defaults=defaults, key=cls.default_key) + return obj @classmethod def create_org_root_node(cls): @@ -531,68 +514,22 @@ class SomeNodesMixin: root = cls.objects.create(key=key, value=ori_org.name) return root + @classmethod + def get_next_org_root_node_key(cls): + with tmp_to_root_org(): + org_nodes_roots = cls.org_root_nodes() + org_nodes_roots_keys = org_nodes_roots.values_list('key', flat=True) + if not org_nodes_roots_keys: + org_nodes_roots_keys = ['1'] + max_key = max([int(k) for k in org_nodes_roots_keys]) + key = str(max_key + 1) if max_key > 0 else '2' + return key + @classmethod def org_root_nodes(cls): - nodes = cls.objects.filter(parent_key='') \ - .filter(key__regex=r'^[0-9]+$') \ - .exclude(key__startswith='-') \ - .order_by('key') - return nodes - - @classmethod - def org_root(cls): - # 如果使用current_org 在set_current_org时会死循环 - ori_org = get_current_org() - - if ori_org and ori_org.is_default(): - return cls.default_node() - if ori_org and ori_org.is_root(): - return None - - org_roots = cls.org_root_nodes() - org_roots_length = len(org_roots) - - if org_roots_length == 1: - return org_roots[0] - elif org_roots_length == 0: - root = cls.create_org_root_node() - return root - else: - raise ValueError('Current org root node not 1, get {}'.format(org_roots_length)) - - @classmethod - def initial_some_nodes(cls): - cls.default_node() - - @classmethod - def modify_other_org_root_node_key(cls): - """ - 解决创建 default 节点失败的问题, - 因为在其他组织下存在 default 节点,故在 DEFAULT 组织下 get 不到 create 失败 - """ - logger.info("Modify other org root node key") - - with tmp_to_org(Organization.root()): - node_key1 = cls.objects.filter(key='1').first() - if not node_key1: - logger.info("Not found node that `key` = 1") - return - if node_key1.org_id == '': - node_key1.org_id = str(Organization.default().id) - node_key1.save() - return - - with transaction.atomic(): - with tmp_to_org(node_key1.org): - org_root_node_new_key = cls.get_next_org_root_node_key() - for n in cls.objects.all(): - old_key = n.key - key_list = n.key.split(':') - key_list[0] = org_root_node_new_key - new_key = ':'.join(key_list) - n.key = new_key - n.save() - logger.info('Modify key ( {} > {} )'.format(old_key, new_key)) + root_nodes = cls.objects.filter(parent_key='', key__regex=r'^[0-9]+$') \ + .exclude(key__startswith='-').order_by('key') + return root_nodes class Node(OrgModelMixin, SomeNodesMixin, FamilyMixin, NodeAssetsMixin): diff --git a/apps/orgs/migrations/0010_auto_20210219_1241.py b/apps/orgs/migrations/0010_auto_20210219_1241.py index 9a9043f94..37b40e350 100644 --- a/apps/orgs/migrations/0010_auto_20210219_1241.py +++ b/apps/orgs/migrations/0010_auto_20210219_1241.py @@ -6,7 +6,7 @@ import sys from django.db import migrations -default_id = '00000000-0000-0000-0000-000000000001' +default_id = '00000000-0000-0000-0000-000000000002' def add_default_org(apps, schema_editor): diff --git a/apps/orgs/models.py b/apps/orgs/models.py index ac0830592..26f39c231 100644 --- a/apps/orgs/models.py +++ b/apps/orgs/models.py @@ -28,8 +28,8 @@ class Organization(models.Model): ROOT_ID = '00000000-0000-0000-0000-000000000000' ROOT_NAME = _('GLOBAL') - DEFAULT_ID = '00000000-0000-0000-0000-000000000001' - DEFAULT_NAME = 'DEFAULT' + DEFAULT_ID = '00000000-0000-0000-0000-000000000002' + DEFAULT_NAME = 'Default' orgs_mapping = None class Meta: diff --git a/apps/perms/const.py b/apps/perms/const.py deleted file mode 100644 index 476fc9d3f..000000000 --- a/apps/perms/const.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# -from django.utils.translation import ugettext_lazy as _ - -UNGROUPED_NODE_ID = "00000000-0000-0000-0000-000000000002" -UNGROUPED_NODE_KEY = '-2' -UNGROUPED_NODE_VALUE = _("Ungrouped") -EMPTY_NODE_ID = "00000000-0000-0000-0000-000000000003" -EMPTY_NODE_KEY = "-3" -EMPTY_NODE_VALUE = _("Empty")