Commit 930eb1d2 authored by ibuler's avatar ibuler

[Update] 修正migrations

parent 79554b47
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from django import forms from django import forms
from django.core.exceptions import ValidationError
import re
from orgs.mixins import OrgModelForm from orgs.mixins import OrgModelForm
from ..models import CommandFilter, CommandFilterRule from ..models import CommandFilter, CommandFilterRule
...@@ -15,6 +17,8 @@ class CommandFilterForm(OrgModelForm): ...@@ -15,6 +17,8 @@ class CommandFilterForm(OrgModelForm):
class CommandFilterRuleForm(OrgModelForm): class CommandFilterRuleForm(OrgModelForm):
invalid_pattern = re.compile(r'[\.\*\+\[\\\?\{\}\^\$\|\(\)\#\<\>]')
class Meta: class Meta:
model = CommandFilterRule model = CommandFilterRule
fields = [ fields = [
...@@ -25,3 +29,11 @@ class CommandFilterRuleForm(OrgModelForm): ...@@ -25,3 +29,11 @@ class CommandFilterRuleForm(OrgModelForm):
'placeholder': 'eg:\r\nreboot\r\nrm -rf' 'placeholder': 'eg:\r\nreboot\r\nrm -rf'
}), }),
} }
def clean_content(self):
content = self.cleaned_data.get("content")
if self.invalid_pattern.search(content):
invalid_char = self.invalid_pattern.pattern.replace('\\', '')
msg = _("Content should not be contain: {}").format(invalid_char)
raise ValidationError(msg)
return content
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import re
from rest_framework import serializers from rest_framework import serializers
from common.fields import ChoiceDisplayField from common.fields import ChoiceDisplayField
...@@ -20,8 +21,16 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer): ...@@ -20,8 +21,16 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer):
class CommandFilterRuleSerializer(BulkOrgResourceModelSerializer): class CommandFilterRuleSerializer(BulkOrgResourceModelSerializer):
serializer_choice_field = ChoiceDisplayField serializer_choice_field = ChoiceDisplayField
invalid_pattern = re.compile(r'[\.\*\+\[\\\?\{\}\^\$\|\(\)\#\<\>]')
class Meta: class Meta:
model = CommandFilterRule model = CommandFilterRule
fields = '__all__' fields = '__all__'
list_serializer_class = AdaptedBulkListSerializer list_serializer_class = AdaptedBulkListSerializer
def validate_content(self, content):
if self.invalid_pattern.search(content):
invalid_char = self.invalid_pattern.pattern.replace('\\', '')
msg = _("Content should not be contain: {}").format(invalid_char)
raise serializers.ValidationError(msg)
return content
This diff is collapsed.
...@@ -10,7 +10,7 @@ from rest_framework.pagination import LimitOffsetPagination ...@@ -10,7 +10,7 @@ from rest_framework.pagination import LimitOffsetPagination
from common.permissions import IsOrgAdmin from common.permissions import IsOrgAdmin
from common.utils import get_object_or_none from common.utils import get_object_or_none
from ..models import AssetPermission, Action from ..models import AssetPermission
from ..hands import ( from ..hands import (
User, UserGroup, Asset, Node, SystemUser, User, UserGroup, Asset, Node, SystemUser,
) )
......
...@@ -21,7 +21,7 @@ from ..utils import ( ...@@ -21,7 +21,7 @@ from ..utils import (
from ..hands import User, Asset, Node, SystemUser, NodeSerializer from ..hands import User, Asset, Node, SystemUser, NodeSerializer
from .. import serializers, const from .. import serializers, const
from ..mixins import AssetsFilterMixin from ..mixins import AssetsFilterMixin
from ..models import ActionFlag from ..models import Action
logger = get_logger(__name__) logger = get_logger(__name__)
...@@ -423,7 +423,7 @@ class ValidateUserAssetPermissionApi(UserPermissionCacheMixin, APIView): ...@@ -423,7 +423,7 @@ class ValidateUserAssetPermissionApi(UserPermissionCacheMixin, APIView):
return Response({'msg': False}, status=403) return Response({'msg': False}, status=403)
action = granted_system_users[su] action = granted_system_users[su]
choices = ActionFlag.value_to_choices(action) choices = Action.value_to_choices(action)
if action_name not in choices: if action_name not in choices:
return Response({'msg': False}, status=403) return Response({'msg': False}, status=403)
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from django.utils.translation import ugettext_lazy as _ UNGROUPED_NODE_ID = "00000000-0000-0000-0000-000000000002"
__all__ = [
'PERMS_ACTION_NAME_ALL', 'PERMS_ACTION_NAME_CONNECT',
'PERMS_ACTION_NAME_DOWNLOAD_FILE', 'PERMS_ACTION_NAME_UPLOAD_FILE',
'PERMS_ACTION_NAME_CHOICES'
]
PERMS_ACTION_NAME_ALL = 'all'
PERMS_ACTION_NAME_CONNECT = 'connect'
PERMS_ACTION_NAME_UPLOAD_FILE = 'upload_file'
PERMS_ACTION_NAME_DOWNLOAD_FILE = 'download_file'
PERMS_ACTION_NAME_CHOICES = (
(PERMS_ACTION_NAME_ALL, _('All')),
(PERMS_ACTION_NAME_CONNECT, _('Connect')),
(PERMS_ACTION_NAME_UPLOAD_FILE, _('Upload file')),
(PERMS_ACTION_NAME_DOWNLOAD_FILE, _('Download file')),
)
UNGROUPED_NODE_ID = "00000000-0000-0000-0000-000000000000"
...@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _ ...@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
from orgs.mixins import OrgModelForm from orgs.mixins import OrgModelForm
from orgs.utils import current_org from orgs.utils import current_org
from assets.models import Asset, Node from assets.models import Asset, Node
from ..models import AssetPermission, ActionFlag from ..models import AssetPermission, Action
__all__ = [ __all__ = [
'AssetPermissionForm', 'AssetPermissionForm',
...@@ -16,20 +16,20 @@ __all__ = [ ...@@ -16,20 +16,20 @@ __all__ = [
class ActionField(forms.MultipleChoiceField): class ActionField(forms.MultipleChoiceField):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['choices'] = ActionFlag.CHOICES kwargs['choices'] = Action.CHOICES
kwargs['initial'] = ActionFlag.ALL kwargs['initial'] = Action.ALL
kwargs['label'] = _("Action") kwargs['label'] = _("Action")
kwargs['widget'] = forms.CheckboxSelectMultiple() kwargs['widget'] = forms.CheckboxSelectMultiple()
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def to_python(self, value): def to_python(self, value):
value = super().to_python(value) value = super().to_python(value)
return ActionFlag.choices_to_value(value) return Action.choices_to_value(value)
def prepare_value(self, value): def prepare_value(self, value):
if value is None: if value is None:
return value return value
value = ActionFlag.value_to_choices(value) value = Action.value_to_choices(value)
return value return value
......
...@@ -4,14 +4,6 @@ from django.db import migrations, models ...@@ -4,14 +4,6 @@ from django.db import migrations, models
import uuid import uuid
def add_default_actions(apps, schema_editor):
from ..const import PERMS_ACTION_NAME_CHOICES
action_model = apps.get_model('perms', 'Action')
db_alias = schema_editor.connection.alias
for action, _ in PERMS_ACTION_NAME_CHOICES:
action_model.objects.using(db_alias).update_or_create(name=action)
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
...@@ -29,5 +21,4 @@ class Migration(migrations.Migration): ...@@ -29,5 +21,4 @@ class Migration(migrations.Migration):
'verbose_name': 'Action', 'verbose_name': 'Action',
}, },
), ),
migrations.RunPython(add_default_actions)
] ]
...@@ -3,18 +3,6 @@ ...@@ -3,18 +3,6 @@
from django.db import migrations, models from django.db import migrations, models
def set_default_action_to_existing_perms(apps, schema_editor):
from orgs.utils import set_to_root_org
from ..models import Action
set_to_root_org()
perm_model = apps.get_model('perms', 'AssetPermission')
db_alias = schema_editor.connection.alias
perms = perm_model.objects.using(db_alias).all()
default_action = Action.get_action_all()
for perm in perms:
perm.actions.add(default_action.id)
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
...@@ -27,5 +15,4 @@ class Migration(migrations.Migration): ...@@ -27,5 +15,4 @@ class Migration(migrations.Migration):
name='actions', name='actions',
field=models.ManyToManyField(blank=True, related_name='permissions', to='perms.Action', verbose_name='Action'), field=models.ManyToManyField(blank=True, related_name='permissions', to='perms.Action', verbose_name='Action'),
), ),
migrations.RunPython(set_default_action_to_existing_perms)
] ]
...@@ -6,21 +6,22 @@ from functools import reduce ...@@ -6,21 +6,22 @@ from functools import reduce
def migrate_old_actions(apps, schema_editor): def migrate_old_actions(apps, schema_editor):
from orgs.utils import set_to_root_org from orgs.utils import set_to_root_org
from ..models import ActionFlag
set_to_root_org() set_to_root_org()
perm_model = apps.get_model('perms', 'AssetPermission') perm_model = apps.get_model('perms', 'AssetPermission')
db_alias = schema_editor.connection.alias db_alias = schema_editor.connection.alias
perms = perm_model.objects.using(db_alias).all() perms = perm_model.objects.using(db_alias).all()
actions_map = { actions_map = {
"all": ActionFlag.ALL, "all": 0b11111111,
"connect": ActionFlag.CONNECT, "connect": 0b00000001,
"upload_file": ActionFlag.UPLOAD, "upload_file": 0b00000010,
"download_file": ActionFlag.DOWNLOAD, "download_file": 0b00000100,
} }
for perm in perms: for perm in perms:
actions = perm.actions.all() actions = perm.actions.all()
new_actions = [actions_map.get(action.name, ActionFlag.ALL) for action in actions] if not actions:
continue
new_actions = [actions_map.get(action.name, 0b11111111) for action in actions]
new_action = reduce(lambda x, y: x | y, new_actions) new_action = reduce(lambda x, y: x | y, new_actions)
perm.action = new_action perm.action = new_action
perm.save() perm.save()
......
...@@ -19,4 +19,5 @@ class Migration(migrations.Migration): ...@@ -19,4 +19,5 @@ class Migration(migrations.Migration):
old_name='action', old_name='action',
new_name='actions', new_name='actions',
), ),
migrations.DeleteModel(name='Action'),
] ]
...@@ -4,37 +4,18 @@ from functools import reduce ...@@ -4,37 +4,18 @@ from functools import reduce
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.utils import date_expired_default, set_or_append_attr_bulk from common.utils import date_expired_default
from orgs.mixins import OrgModelMixin from orgs.mixins import OrgModelMixin
from ..const import PERMS_ACTION_NAME_CHOICES, PERMS_ACTION_NAME_ALL
from .base import BasePermission from .base import BasePermission
__all__ = [ __all__ = [
'Action', 'AssetPermission', 'NodePermission', 'ActionFlag' 'AssetPermission', 'NodePermission', 'Action',
] ]
class Action(models.Model): class Action:
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(
max_length=128, unique=True, choices=PERMS_ACTION_NAME_CHOICES,
verbose_name=_('Name')
)
class Meta:
verbose_name = _('Action')
def __str__(self):
return self.get_name_display()
@classmethod
def get_action_all(cls):
return cls.objects.get(name=PERMS_ACTION_NAME_ALL)
class ActionFlag:
CONNECT = 0b00000001 CONNECT = 0b00000001
UPLOAD = 0b00000010 UPLOAD = 0b00000010
DOWNLOAD = 0b00000100 DOWNLOAD = 0b00000100
...@@ -86,7 +67,7 @@ class AssetPermission(BasePermission): ...@@ -86,7 +67,7 @@ class AssetPermission(BasePermission):
nodes = models.ManyToManyField('assets.Node', related_name='granted_by_permissions', blank=True, verbose_name=_("Nodes")) nodes = models.ManyToManyField('assets.Node', related_name='granted_by_permissions', blank=True, verbose_name=_("Nodes"))
system_users = models.ManyToManyField('assets.SystemUser', related_name='granted_by_permissions', verbose_name=_("System user")) system_users = models.ManyToManyField('assets.SystemUser', related_name='granted_by_permissions', verbose_name=_("System user"))
# actions = models.ManyToManyField(Action, related_name='permissions', blank=True, verbose_name=_('Action')) # actions = models.ManyToManyField(Action, related_name='permissions', blank=True, verbose_name=_('Action'))
actions = models.IntegerField(choices=ActionFlag.DB_CHOICES, default=ActionFlag.ALL, verbose_name=_("Actions")) actions = models.IntegerField(choices=Action.DB_CHOICES, default=Action.ALL, verbose_name=_("Actions"))
class Meta: class Meta:
unique_together = [('org_id', 'name')] unique_together = [('org_id', 'name')]
......
...@@ -5,7 +5,7 @@ from rest_framework import serializers ...@@ -5,7 +5,7 @@ from rest_framework import serializers
from common.fields import StringManyToManyField from common.fields import StringManyToManyField
from orgs.mixins import BulkOrgResourceModelSerializer from orgs.mixins import BulkOrgResourceModelSerializer
from perms.models import AssetPermission, ActionFlag from perms.models import AssetPermission, Action
__all__ = [ __all__ = [
'AssetPermissionCreateUpdateSerializer', 'AssetPermissionListSerializer', 'AssetPermissionCreateUpdateSerializer', 'AssetPermissionListSerializer',
...@@ -16,20 +16,20 @@ __all__ = [ ...@@ -16,20 +16,20 @@ __all__ = [
class ActionField(serializers.MultipleChoiceField): class ActionField(serializers.MultipleChoiceField):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['choices'] = ActionFlag.CHOICES kwargs['choices'] = Action.CHOICES
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def to_representation(self, value): def to_representation(self, value):
return ActionFlag.value_to_choices(value) return Action.value_to_choices(value)
def to_internal_value(self, data): def to_internal_value(self, data):
return ActionFlag.choices_to_value(data) return Action.choices_to_value(data)
class ActionDisplayField(ActionField): class ActionDisplayField(ActionField):
def to_representation(self, value): def to_representation(self, value):
values = super().to_representation(value) values = super().to_representation(value)
choices = dict(ActionFlag.CHOICES) choices = dict(Action.CHOICES)
return [choices.get(i) for i in values] return [choices.get(i) for i in values]
......
...@@ -6,7 +6,7 @@ from django.db import transaction ...@@ -6,7 +6,7 @@ from django.db import transaction
from common.utils import get_logger from common.utils import get_logger
from .utils import AssetPermissionUtil from .utils import AssetPermissionUtil
from .models import AssetPermission, Action from .models import AssetPermission
logger = get_logger(__file__) logger = get_logger(__file__)
......
...@@ -17,7 +17,7 @@ from orgs.utils import set_to_root_org ...@@ -17,7 +17,7 @@ from orgs.utils import set_to_root_org
from common.utils import get_logger from common.utils import get_logger
from common.tree import TreeNode from common.tree import TreeNode
from .. import const from .. import const
from ..models import AssetPermission, Action, ActionFlag from ..models import AssetPermission, Action
from ..hands import Node, Asset from ..hands import Node, Asset
from assets.utils import NodeUtil from assets.utils import NodeUtil
...@@ -569,7 +569,7 @@ def parse_asset_to_tree_node(node, asset, system_users): ...@@ -569,7 +569,7 @@ def parse_asset_to_tree_node(node, asset, system_users):
'protocol': system_user.protocol, 'protocol': system_user.protocol,
'priority': system_user.priority, 'priority': system_user.priority,
'login_mode': system_user.login_mode, 'login_mode': system_user.login_mode,
'actions': [ActionFlag.value_to_choices(action)], 'actions': [Action.value_to_choices(action)],
}) })
data = { data = {
'id': str(asset.id), 'id': str(asset.id),
......
...@@ -10,10 +10,9 @@ from django.conf import settings ...@@ -10,10 +10,9 @@ from django.conf import settings
from common.permissions import PermissionsMixin, IsOrgAdmin from common.permissions import PermissionsMixin, IsOrgAdmin
from orgs.utils import current_org from orgs.utils import current_org
from perms.hands import Node, Asset, SystemUser, User, UserGroup from perms.hands import Node, Asset, SystemUser, UserGroup
from perms.models import AssetPermission, Action from perms.models import AssetPermission
from perms.forms import AssetPermissionForm from perms.forms import AssetPermissionForm
from perms.const import PERMS_ACTION_NAME_ALL
__all__ = [ __all__ = [
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment