{% bootstrap_field form.comment layout="horizontal" %}
@@ -84,15 +82,14 @@
{% endblock %}
\ No newline at end of file
diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html
index c1a3e6114..84ad0f4f0 100644
--- a/apps/perms/templates/perms/asset_permission_list.html
+++ b/apps/perms/templates/perms/asset_permission_list.html
@@ -1,238 +1,154 @@
-{% extends 'base.html' %}
-{% load static %}
+{% extends '_base_list.html' %}
{% load i18n %}
-
+{% load static %}
+{% load common_tags %}
{% block custom_head_css_js %}
-
-
-
-
+
+{% endblock %}
+
+{% block content_left_head %}
{% endblock %}
-{% block content %}
-
+{% block table_search %}
+
+
+{% endblock %}
+{% block table_container %}
+
{% endblock %}
{% block custom_foot_js %}
-
+
+
{% endblock %}
+
+
diff --git a/apps/perms/utils.py b/apps/perms/utils.py
index 7abf96352..5947ccefb 100644
--- a/apps/perms/utils.py
+++ b/apps/perms/utils.py
@@ -2,16 +2,183 @@
from __future__ import absolute_import, unicode_literals
import collections
+from collections import defaultdict
from django.utils import timezone
-from django.utils.translation import ugettext as _
import copy
-from common.utils import setattr_bulk, get_logger
-from .models import NodePermission
+from common.utils import set_or_append_attr_bulk, get_logger
+from .models import AssetPermission
logger = get_logger(__file__)
+class AssetPermissionUtils:
+
+ @staticmethod
+ def get_user_permissions(user):
+ return AssetPermission.valid.all().filter(users=user)
+
+ @staticmethod
+ def get_user_group_permissions(user_group):
+ return AssetPermission.valid.all().filter(user_groups=user_group)
+
+ @staticmethod
+ def get_asset_permissions(asset):
+ return AssetPermission.valid.all().filter(assets=asset)
+
+ @staticmethod
+ def get_node_permissions(node):
+ return AssetPermission.valid.all().filter(nodes=node)
+
+ @staticmethod
+ def get_system_user_permissions(system_user):
+ return AssetPermission.objects.all().filter(system_users=system_user)
+
+ @classmethod
+ def get_user_group_nodes(cls, group):
+ nodes = defaultdict(set)
+ permissions = cls.get_user_group_permissions(group)
+ for perm in permissions:
+ _nodes = perm.nodes.all()
+ _system_users = perm.system_users.all()
+ set_or_append_attr_bulk(_nodes, 'permission', perm.id)
+ for node in _nodes:
+ nodes[node].update(set(_system_users))
+ return nodes
+
+ @classmethod
+ def get_user_group_assets_direct(cls, group):
+ assets = defaultdict(set)
+ permissions = cls.get_user_group_permissions(group)
+ for perm in permissions:
+ _assets = perm.assets.all()
+ _system_users = perm.system_users.all()
+ set_or_append_attr_bulk(_assets, 'permission', perm.id)
+ for asset in _assets:
+ assets[asset].update(set(_system_users))
+ return assets
+
+ @classmethod
+ def get_user_group_nodes_assets(cls, group):
+ assets = defaultdict(set)
+ nodes = cls.get_user_group_nodes(group)
+ for node, _system_users in nodes.items():
+ _assets = node.get_all_assets()
+ set_or_append_attr_bulk(_assets, 'inherit_node', node.id)
+ set_or_append_attr_bulk(_assets, 'permission', getattr(node, 'permission', None))
+ for asset in _assets:
+ assets[asset].update(set(_system_users))
+ return assets
+
+ @classmethod
+ def get_user_group_assets(cls, group):
+ assets = defaultdict(set)
+ _assets = cls.get_user_group_assets_direct(group)
+ _nodes_assets = cls.get_user_group_nodes_assets(group)
+ for asset, _system_users in _assets.items():
+ assets[asset].update(set(_system_users))
+ for asset, _system_users in _nodes_assets.items():
+ assets[asset].update(set(_system_users))
+ return assets
+
+ @classmethod
+ def get_user_assets_direct(cls, user):
+ assets = defaultdict(set)
+ permissions = list(cls.get_user_permissions(user))
+ for perm in permissions:
+ _assets = perm.assets.all()
+ _system_users = perm.system_users.all()
+ set_or_append_attr_bulk(_assets, 'permission', perm.id)
+ for asset in _assets:
+ assets[asset].update(set(_system_users))
+ return assets
+
+ @classmethod
+ def get_user_nodes_direct(cls, user):
+ nodes = defaultdict(set)
+ permissions = cls.get_user_permissions(user)
+ for perm in permissions:
+ _nodes = perm.nodes.all()
+ _system_users = perm.system_users.all()
+ set_or_append_attr_bulk(_nodes, 'permission', perm.id)
+ for node in _nodes:
+ nodes[node].update(set(_system_users))
+ return nodes
+
+ @classmethod
+ def get_user_nodes_assets_direct(cls, user):
+ assets = defaultdict(set)
+ nodes = cls.get_user_nodes_direct(user)
+ for node, _system_users in nodes.items():
+ _assets = node.get_all_assets()
+ set_or_append_attr_bulk(_assets, 'inherit_node', node.id)
+ set_or_append_attr_bulk(_assets, 'permission', getattr(node, 'permission', None))
+ for asset in _assets:
+ assets[asset].update(set(_system_users))
+ return assets
+
+ @classmethod
+ def get_user_assets_inherit_group(cls, user):
+ assets = defaultdict(set)
+ for group in user.groups.all():
+ _assets = cls.get_user_group_assets(group)
+ set_or_append_attr_bulk(_assets, 'inherit_group', group.id)
+ for asset, _system_users in _assets.items():
+ assets[asset].update(_system_users)
+ return assets
+
+ @classmethod
+ def get_user_assets(cls, user):
+ assets = defaultdict(set)
+ _assets_direct = cls.get_user_assets_direct(user)
+ _nodes_assets_direct = cls.get_user_nodes_assets_direct(user)
+ _assets_inherit_group = cls.get_user_assets_inherit_group(user)
+ for asset, _system_users in _assets_direct.items():
+ assets[asset].update(_system_users)
+ for asset, _system_users in _nodes_assets_direct.items():
+ assets[asset].update(_system_users)
+ for asset, _system_users in _assets_inherit_group.items():
+ assets[asset].update(_system_users)
+ return assets
+
+ @classmethod
+ def get_user_node_with_assets(cls, user):
+ """
+ :param user:
+ :return: {node: {asset: set(su1, su2)}}
+ """
+ nodes = defaultdict(dict)
+ _assets = cls.get_user_assets(user)
+ for asset, _system_users in _assets.items():
+ _nodes = asset.get_nodes()
+ for node in _nodes:
+ if asset in nodes[node]:
+ nodes[node][asset].update(_system_users)
+ else:
+ nodes[node][asset] = _system_users
+ return nodes
+
+ @classmethod
+ def get_system_user_assets(cls, system_user):
+ assets = set()
+ permissions = cls.get_system_user_permissions(system_user)
+ for perm in permissions:
+ assets.update(set(perm.assets.all()))
+ nodes = perm.nodes.all()
+ for node in nodes:
+ assets.update(set(node.get_all_assets()))
+ return assets
+
+ @classmethod
+ def get_node_system_users(cls, node):
+ system_users = set()
+ permissions = cls.get_node_permissions(node)
+ for perm in permissions:
+ system_users.update(perm.system_users.all())
+ return system_users
+
+
+
class NodePermissionUtil:
@staticmethod
diff --git a/apps/perms/views.py b/apps/perms/views.py
index 33447db7b..01d621ce4 100644
--- a/apps/perms/views.py
+++ b/apps/perms/views.py
@@ -6,21 +6,65 @@ from django.utils.translation import ugettext as _
from django.views.generic import ListView, CreateView, UpdateView
from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
+from django.conf import settings
+from django.db.models import Q
-from common.utils import get_object_or_none
-from .hands import AdminUserRequiredMixin, Node
+from .hands import AdminUserRequiredMixin, Node, User, UserGroup, Asset, SystemUser
from .models import AssetPermission, NodePermission
from .forms import AssetPermissionForm
class AssetPermissionListView(AdminUserRequiredMixin, ListView):
- model = NodePermission
- context_object_name = 'asset_permission_list'
+ model = AssetPermission
template_name = 'perms/asset_permission_list.html'
+ paginate_by = settings.DISPLAY_PER_PAGE
+ user = user_group = asset = node = system_user = q = ""
+
+ def get_queryset(self):
+ self.q = self.request.GET.get('q', '')
+ self.user = self.request.GET.get("user", '')
+ self.user_group = self.request.GET.get("user_group", '')
+ self.asset = self.request.GET.get('asset', '')
+ self.node = self.request.GET.get('node', '')
+ self.system_user = self.request.GET.get('system_user', '')
+ filter_kwargs = dict()
+ if self.user:
+ filter_kwargs['users__name'] = self.user
+ if self.user_group:
+ filter_kwargs['user_groups__name'] = self.user_group
+ if self.asset:
+ filter_kwargs['assets__hostname'] = self.asset
+ if self.node:
+ filter_kwargs['nodes__value'] = self.node
+ if self.system_user:
+ filter_kwargs['system_users__name'] = self.system_user
+ queryset = self.model.objects.filter(**filter_kwargs)
+ if self.q:
+ queryset = queryset.filter(
+ Q(name__contains=self.q) |
+ Q(users__name=self.q) |
+ Q(user_groups__name=self.q) |
+ Q(assets__hostname=self.q) |
+ Q(nodes__value=self.q) |
+ Q(system_users__name=self.q)
+ )
+ queryset = queryset.order_by('-date_start')
+ return queryset
def get_context_data(self, **kwargs):
context = {
'app': _('Perms'),
+ 'user_list': User.objects.all().values_list('name', flat=True),
+ 'user_group_list': UserGroup.objects.all().values_list('name', flat=True),
+ 'asset_list': Asset.objects.all().values_list('hostname', flat=True),
+ 'node_list': Node.objects.all().values_list('value', flat=True),
+ 'system_user_list': SystemUser.objects.all().values_list('name', flat=True),
+ 'user': self.user,
+ 'user_group': self.user_group,
+ 'asset': self.asset,
+ 'node': self.node,
+ 'system_user': self.system_user,
+ 'q': self.q,
'action': _('Asset permission list'),
}
kwargs.update(context)
@@ -28,20 +72,11 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
class AssetPermissionCreateView(AdminUserRequiredMixin, CreateView):
- model = NodePermission
+ model = AssetPermission
form_class = AssetPermissionForm
template_name = 'perms/asset_permission_create_update.html'
success_url = reverse_lazy('perms:asset-permission-list')
- def get_form(self, form_class=None):
- form = super().get_form(form_class=form_class)
- node_id = self.request.GET.get("node_id")
- node = get_object_or_none(Node, id=node_id)
- if not node:
- node = Node.root()
- form['node'].initial = node
- return form
-
def get_context_data(self, **kwargs):
context = {
'app': _('Perms'),
@@ -52,16 +87,11 @@ class AssetPermissionCreateView(AdminUserRequiredMixin, CreateView):
class AssetPermissionUpdateView(AdminUserRequiredMixin, UpdateView):
- model = NodePermission
+ model = AssetPermission
form_class = AssetPermissionForm
template_name = 'perms/asset_permission_create_update.html'
success_url = reverse_lazy("perms:asset-permission-list")
- def get_form(self, form_class=None):
- form = super().get_form(form_class=form_class)
- form['node'].initial = form.instance.node
- return form
-
def get_context_data(self, **kwargs):
context = {
'app': _('Perms'),
diff --git a/apps/terminal/templates/terminal/command_list.html b/apps/terminal/templates/terminal/command_list.html
index c8e4cf6ac..6b55d787e 100644
--- a/apps/terminal/templates/terminal/command_list.html
+++ b/apps/terminal/templates/terminal/command_list.html
@@ -18,7 +18,7 @@
{% endblock %}
{% block table_search %}
-