diff --git a/apps/assets/api.py b/apps/assets/api.py index aadebbd93..19e04a713 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -172,3 +172,19 @@ class AssetAdminUserTestView(AssetRefreshHardwareView): return Response('1') else: return Response('0', status=502) + + +class AssetGroupPushSystemUserView(generics.UpdateAPIView): + queryset = AssetGroup.objects.all() + permission_classes = (IsSuperUser,) + + def patch(self, request, *args, **kwargs): + asset_group = self.get_object() + assets = asset_group.assets.all() + system_user_id = self.request.data['system_user'] + system_user = get_object_or_none(SystemUser, id=system_user_id) + if not assets or not system_user: + return Response('Invalid system user id or asset group id', status=404) + task = push_users.delay([asset._to_secret_json() for asset in assets], + system_user._to_secret_json()) + return Response(task.id) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index c2d7e9cd4..7c176b026 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -70,7 +70,7 @@ class AssetBulkUpdateForm(forms.ModelForm): required=True, help_text='* required', label=_('Select assets'), - choices=[(asset.id, asset.hostname) for asset in Asset.objects.all()], + # choices=[(asset.id, asset.hostname) for asset in Asset.objects.all()], widget=forms.SelectMultiple( attrs={ 'class': 'select2', diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 1504f9c2f..a07aae5de 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -157,6 +157,7 @@ class SystemUser(models.Model): def __unicode__(self): return self.name + __str__ = __unicode__ @property def password(self): diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html index 26162f4e0..a764acc15 100644 --- a/apps/assets/templates/assets/asset_group_detail.html +++ b/apps/assets/templates/assets/asset_group_detail.html @@ -51,22 +51,6 @@ -{# {% for asset in assets %}#} -{# #} -{# {{ asset.hostname }}#} -{# {{ asset.ip }}#} -{# {{ asset.port }}#} -{# {% if asset.is_active %}#} -{# #} -{# {% else %}#} -{# #} -{# {% endif %}#} -{# #} -{# {% trans "Delete" %}#} -{# {% trans "Update" %}#} -{# #} -{# #} -{# {% endfor %}#} @@ -83,9 +67,9 @@
- {% for asset in assets_remain %} - + {% endfor %} @@ -100,20 +84,47 @@ + +
+
+
+ {% trans 'Push system user to this group assets' %} +
+
+ + + + + + + + + + + +
+ +
+ +
+
+
- +{# #} {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index f54b0a0e6..e6c213158 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -29,6 +29,9 @@ urlpatterns = [ url(r'^v1/assets/(?P\d+)/system-users/$', api.SystemUserUpdateApi.as_view(), name='asset-update-system-users'), + url(r'^v1/asset-groups/(?P\d+)/push-system-user/$', + api.AssetGroupPushSystemUserView.as_view(), name='asset-group-push-system-user'), + # update the system users, which add and delete the asset to the system user url(r'^v1/system_user/(?P\d+)/assets/$', api.SystemUserUpdateAssetsApi.as_view(), name='systemuser-update-assets'), diff --git a/apps/ops/models.py b/apps/ops/models.py index 3a253bfbb..6c9079014 100644 --- a/apps/ops/models.py +++ b/apps/ops/models.py @@ -7,6 +7,7 @@ import json from django.db import models from django.utils.translation import ugettext_lazy as _ +from assets.models import Asset __all__ = ["Task"] @@ -33,7 +34,9 @@ class Task(models.Model): @property def total_assets(self): - return self.assets.split(',') + assets_id = [i for i in self.assets.split(',') if i.isdigit()] + assets = Asset.objects.filter(id__in=assets_id) + return assets @property def assets_json(self): diff --git a/apps/ops/templates/ops/task_detail.html b/apps/ops/templates/ops/task_detail.html index 6002befbf..d34afea35 100644 --- a/apps/ops/templates/ops/task_detail.html +++ b/apps/ops/templates/ops/task_detail.html @@ -83,11 +83,11 @@ {% trans 'assets' %}: - - {% for asset in object.total_assets %} - {{ asset }}
- {% endfor %} -
+ + {% for asset in object.total_assets %} + {{ asset.hostname }}
+ {% endfor %} +
diff --git a/apps/perms/templates/perms/asset_permission_create_update.html b/apps/perms/templates/perms/asset_permission_create_update.html index 50b8f1c67..b8c2a60f0 100644 --- a/apps/perms/templates/perms/asset_permission_create_update.html +++ b/apps/perms/templates/perms/asset_permission_create_update.html @@ -38,9 +38,9 @@ {% bootstrap_field form.user_groups layout="horizontal" %}

{% trans 'Asset' %}

- {{ form.assets|bootstrap_horizontal|safe }} + {% bootstrap_field form.assets layout="horizontal" %} {% bootstrap_field form.asset_groups layout="horizontal" %} - {{ form.system_users |bootstrap_horizontal }} + {% bootstrap_field form.system_users layout="horizontal" %}

{% trans 'Other' %}

diff --git a/apps/users/forms.py b/apps/users/forms.py index a334f7a7e..091ea01ff 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -123,7 +123,7 @@ class UserBulkUpdateForm(forms.ModelForm): required=True, help_text='* required', label=_('Select users'), - choices=[(user.id, user.name ) for user in User.objects.all()], + # choices=[(user.id, user.name) for user in User.objects.all()], widget=forms.SelectMultiple( attrs={ 'class': 'select2', diff --git a/apps/users/templates/users/_user_bulk_update_modal.html b/apps/users/templates/users/_user_bulk_update_modal.html deleted file mode 100644 index c1c5852e6..000000000 --- a/apps/users/templates/users/_user_bulk_update_modal.html +++ /dev/null @@ -1,72 +0,0 @@ -{% extends '_modal.html' %} -{% load i18n %} -{% load bootstrap3 %} -{% block modal_id %}user_bulk_update_modal{% endblock %} -{% block modal_class %}modal-lg{% endblock %} -{% block modal_title%}{% trans "Update selected user" %}{% endblock %} -{% block modal_body %} -{% block form %} -
-

选择需要修改属性

-
- 全选 - {% for field in form %} -{# {% if field.name != 'assets' %}#} - {{ field.label }} -{# {% endif %}#} - {% endfor %} -
-
-
- {% csrf_token %} - {% bootstrap_form form layout="horizontal" %} -
-
- - -
-
-
-{% endblock %} -{% endblock %} -{#{% block custom_foot_js %}#} -{##} -{#{% endblock %}#} - diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index b7fcde217..0cc5a8a80 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -48,7 +48,6 @@
-{% include "users/_user_bulk_update_modal.html" %} {% include "users/_user_import_modal.html" %} {% endblock %} {% block content_bottom_left %}{% endblock %} @@ -235,40 +234,6 @@ $(document).ready(function(){ var uid = $this.data('uid'); var the_url = '{% url "api-users:user-detail" pk=99991937 %}'.replace('99991937', uid); objectDelete($this, name, the_url); -}).on('click', '#btn_user_bulk_update', function(){ - var json_data = $('#fm_user_bulk_update').serializeObject(); - var body = {}; - body.enable_otp = (json_data.enable_otp === 'on')? true: false; - if (json_data.role != '') { - body.role = json_data.role; - } - if (json_data.groups != undefined) { - body.groups = json_data.groups; - } - if (typeof body.groups === 'string') { - body.groups = [parseInt(body.groups)] - } else if(typeof body.groups === 'array') { - var new_groups = body.groups.map(Number); - body.groups = new_groups; - } - var $data_table = $('#user_list_table').DataTable(); - var post_list = []; - $data_table.rows({selected: true}).every(function(){ - var content = Object.assign({id: this.data().id}, body); - post_list.push(content); - }); - if (post_list === []) { - return false - } - var the_url = "{% url 'api-users:user-list' %}"; - var success = function() { - var msg = "{% trans 'The selected users has been updated successfully.' %}"; - swal("{% trans 'User Updated' %}", msg, "success"); - $('#user_list_table').DataTable().ajax.reload(); - jumpserver.checked = false; - }; -{# APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(post_list), success: success});#} - $('#user_bulk_update_modal').modal('hide'); }) {% endblock %} diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 61faebdd1..b30419ffa 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -17,3 +17,4 @@ itsdangerous eventlet django-filter passlib +ForgeryPy