Commit bd882c8b authored by ibuler's avatar ibuler

User group detail

parent 8d358a7a
...@@ -297,6 +297,7 @@ jumpserver.initDataTable = function (options) { ...@@ -297,6 +297,7 @@ jumpserver.initDataTable = function (options) {
url: options.i18n_url || "/static/js/plugins/dataTables/i18n/zh-hans.json" url: options.i18n_url || "/static/js/plugins/dataTables/i18n/zh-hans.json"
}, },
order: options.order || [[ 1, 'asc' ]], order: options.order || [[ 1, 'asc' ]],
select: options.select || 'multi',
buttons: options.buttons || [ buttons: options.buttons || [
{extend: 'excel', {extend: 'excel',
exportOptions: { exportOptions: {
...@@ -323,9 +324,6 @@ jumpserver.initDataTable = function (options) { ...@@ -323,9 +324,6 @@ jumpserver.initDataTable = function (options) {
} }
], ],
columnDefs: columnDefs, columnDefs: columnDefs,
// select: 'single',
// select: options.select || {style: 'single'},
// select: false,
ajax: { ajax: {
url: options.ajax_url , url: options.ajax_url ,
dataSrc: "" dataSrc: ""
...@@ -333,16 +331,16 @@ jumpserver.initDataTable = function (options) { ...@@ -333,16 +331,16 @@ jumpserver.initDataTable = function (options) {
columns: options.columns || [], columns: options.columns || [],
lengthMenu: [[15, 25, 50, -1], [15, 25, 50, "All"]] lengthMenu: [[15, 25, 50, -1], [15, 25, 50, "All"]]
}); });
// table.on('select', function(e, dt, type, indexes) { table.on('select', function(e, dt, type, indexes) {
// var $node = table[ type ]( indexes ).nodes().to$(); var $node = table[ type ]( indexes ).nodes().to$();
// $node.find('input.ipt_check').prop('checked', true); $node.find('input.ipt_check').prop('checked', true);
// }).on('deselect', function(e, dt, type, indexes) { }).on('deselect', function(e, dt, type, indexes) {
// var $node = table[ type ]( indexes ).nodes().to$(); var $node = table[ type ]( indexes ).nodes().to$();
// $node.find('input.ipt_check').prop('checked', false); $node.find('input.ipt_check').prop('checked', false);
// }).on('draw', function(){ }).on('draw', function(){
// $('#op').html(options.op_html || ''); $('#op').html(options.op_html || '');
// $('#uc').html(options.uc_html || ''); $('#uc').html(options.uc_html || '');
// }); });
$('.ipt_check_all').on('click', function() { $('.ipt_check_all').on('click', function() {
if (!jumpserver.checked) { if (!jumpserver.checked) {
$(this).closest('table').find('.ipt_check').prop('checked', true); $(this).closest('table').find('.ipt_check').prop('checked', true);
...@@ -354,5 +352,6 @@ jumpserver.initDataTable = function (options) { ...@@ -354,5 +352,6 @@ jumpserver.initDataTable = function (options) {
table.rows().deselect(); table.rows().deselect();
} }
}); });
return table; return table;
}; };
...@@ -30,9 +30,9 @@ class UserViewSet(BulkModelViewSet): ...@@ -30,9 +30,9 @@ class UserViewSet(BulkModelViewSet):
permission_classes = (IsSuperUser,) permission_classes = (IsSuperUser,)
class UserAndGroupEditApi(generics.RetrieveUpdateAPIView): class UserUpdateGroupApi(generics.RetrieveUpdateAPIView):
queryset = User.objects.all() queryset = User.objects.all()
serializer_class = serializers.UserAndGroupSerializer serializer_class = serializers.UserUpdateGroupSerializer
permission_classes = (IsSuperUser,) permission_classes = (IsSuperUser,)
...@@ -72,7 +72,17 @@ class UserUpdatePKApi(generics.UpdateAPIView): ...@@ -72,7 +72,17 @@ class UserUpdatePKApi(generics.UpdateAPIView):
user.public_key = serializer.validated_data['_public_key'] user.public_key = serializer.validated_data['_public_key']
user.save() user.save()
#
class UserGroupViewSet(viewsets.ModelViewSet):
queryset = UserGroup.objects.all()
serializer_class = serializers.UserGroupSerializer
class UserGroupUpdateUserApi(generics.RetrieveUpdateAPIView):
queryset = UserGroup.objects.all()
serializer_class = serializers.UserGroupUpdateMemeberSerializer
permission_classes = (IsSuperUser,)
# class GroupDetailApi(generics.RetrieveUpdateDestroyAPIView): # class GroupDetailApi(generics.RetrieveUpdateDestroyAPIView):
# queryset = UserGroup.objects.all() # queryset = UserGroup.objects.all()
# serializer_class = serializers.GroupDetailSerializer # serializer_class = serializers.GroupDetailSerializer
......
...@@ -16,8 +16,7 @@ from .models import User, UserGroup ...@@ -16,8 +16,7 @@ from .models import User, UserGroup
class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer): class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer):
group_display = serializers.SerializerMethodField() groups_display = serializers.SerializerMethodField()
active_display = serializers.SerializerMethodField()
groups = serializers.PrimaryKeyRelatedField(many=True, queryset=UserGroup.objects.all()) groups = serializers.PrimaryKeyRelatedField(many=True, queryset=UserGroup.objects.all())
class Meta: class Meta:
...@@ -27,17 +26,16 @@ class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer): ...@@ -27,17 +26,16 @@ class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer):
def get_field_names(self, declared_fields, info): def get_field_names(self, declared_fields, info):
fields = super(UserSerializer, self).get_field_names(declared_fields, info) fields = super(UserSerializer, self).get_field_names(declared_fields, info)
fields.extend(['group_display', 'get_role_display']) fields.extend(['groups_display', 'get_role_display', 'is_valid'])
return fields return fields
@staticmethod @staticmethod
def get_group_display(obj): def get_groups_display(obj):
return " ".join([group.name for group in obj.groups.all()]) return " ".join([group.name for group in obj.groups.all()])
@staticmethod # @staticmethod
def get_active_display(obj): # def get_active_display(obj):
# TODO: user active state # return not (obj.is_expired and obj.is_active)
return not (obj.is_expired and obj.is_active)
class UserPKUpdateSerializer(serializers.ModelSerializer): class UserPKUpdateSerializer(serializers.ModelSerializer):
...@@ -54,7 +52,7 @@ class UserPKUpdateSerializer(serializers.ModelSerializer): ...@@ -54,7 +52,7 @@ class UserPKUpdateSerializer(serializers.ModelSerializer):
return value return value
class UserAndGroupSerializer(serializers.ModelSerializer): class UserUpdateGroupSerializer(serializers.ModelSerializer):
groups = serializers.PrimaryKeyRelatedField(many=True, queryset=UserGroup.objects.all()) groups = serializers.PrimaryKeyRelatedField(many=True, queryset=UserGroup.objects.all())
class Meta: class Meta:
...@@ -62,6 +60,26 @@ class UserAndGroupSerializer(serializers.ModelSerializer): ...@@ -62,6 +60,26 @@ class UserAndGroupSerializer(serializers.ModelSerializer):
fields = ['id', 'groups'] fields = ['id', 'groups']
class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
user_amount = serializers.SerializerMethodField()
class Meta:
model = UserGroup
list_serializer_class = BulkListSerializer
@staticmethod
def get_user_amount(obj):
return obj.users.count()
class UserGroupUpdateMemeberSerializer(serializers.ModelSerializer):
users = serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all())
class Meta:
model = UserGroup
fields = ['id', 'users']
# class GroupDetailSerializer(serializers.ModelSerializer): # class GroupDetailSerializer(serializers.ModelSerializer):
# class Meta: # class Meta:
# model = UserGroup # model = UserGroup
......
...@@ -224,9 +224,8 @@ ...@@ -224,9 +224,8 @@
jumpserver.selected_groups = {}; jumpserver.selected_groups = {};
function updateUserGroups(user_groups) { function updateUserGroups(user_groups) {
var the_url = "{% url 'users:group-user-edit-api' pk=user.id %}"; var the_url = "{% url 'users:api-user-update-group' pk=user.id %}";
var body = { var body = {
id: {{ user.id }},
groups: Object.assign([], user_groups) groups: Object.assign([], user_groups)
}; };
var success = function(data) { var success = function(data) {
...@@ -245,13 +244,11 @@ function updateUserGroups(user_groups) { ...@@ -245,13 +244,11 @@ function updateUserGroups(user_groups) {
}); });
// clear jumpserver.selected_groups // clear jumpserver.selected_groups
jumpserver.selected_groups = {}; jumpserver.selected_groups = {};
toastr.success('{% trans "UserGroup Update Success!" %}')
}; };
APIUpdateAttr({ APIUpdateAttr({
url: the_url, url: the_url,
body: JSON.stringify(body), body: JSON.stringify(body),
success: success, success: success
method: 'PUT'
}); });
} }
$(document).ready(function() { $(document).ready(function() {
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
</th> </th>
<th class="text-center">{% trans 'Name' %}</th> <th class="text-center">{% trans 'Name' %}</th>
<th class="text-center">{% trans 'User Amount' %}</th> <th class="text-center">{% trans 'User Amount' %}</th>
<th class="text-center">{% trans 'Asset Amount' %}</th>
<th class="text-center">{% trans 'Comment' %}</th> <th class="text-center">{% trans 'Comment' %}</th>
<th class="text-center">{% trans 'Action' %}</th> <th class="text-center">{% trans 'Action' %}</th>
</tr> </tr>
...@@ -43,11 +42,11 @@ $(document).ready(function() { ...@@ -43,11 +42,11 @@ $(document).ready(function() {
var detail_btn = '<a href="{% url "users:user-group-detail" pk=99991937 %}">' + cellData + '</a>'; var detail_btn = '<a href="{% url "users:user-group-detail" pk=99991937 %}">' + cellData + '</a>';
$(td).html(detail_btn.replace('99991937', rowData.id)); $(td).html(detail_btn.replace('99991937', rowData.id));
}}, }},
{targets: 4, createdCell: function (td, cellData) { {targets: 3, createdCell: function (td, cellData) {
var innerHtml = cellData.length > 18 ? cellData.substring(0, 18) + '...': cellData; var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData;
$(td).html('<a href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</a>'); $(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
}}, }},
{targets: 5, createdCell: function (td, cellData, rowData) { {targets: 4, createdCell: function (td, cellData, rowData) {
var update_btn = '<a href="{% url "users:user-group-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData); var update_btn = '<a href="{% url "users:user-group-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData);
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_delete_user_group" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData); var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_delete_user_group" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData);
if (rowData.id === 1) { if (rowData.id === 1) {
...@@ -56,9 +55,9 @@ $(document).ready(function() { ...@@ -56,9 +55,9 @@ $(document).ready(function() {
$(td).html(update_btn + del_btn) $(td).html(update_btn + del_btn)
} }
}}], }}],
ajax_url: '{% url "users:user-group-bulk-update-api" %}', ajax_url: '{% url "users:api-user-group-list" %}',
columns: [{data: function(){return ""}}, {data: "name" }, {data: "user_amount"}, columns: [{data: function(){return ""}}, {data: "name" }, {data: "user_amount"},
{data: function(){return 999}}, {data: "comment"}, {data: "id" }], {data: "comment"}, {data: "id" }],
op_html: $('#actions').html() op_html: $('#actions').html()
}; };
jumpserver.initDataTable(options); jumpserver.initDataTable(options);
...@@ -66,7 +65,7 @@ $(document).ready(function() { ...@@ -66,7 +65,7 @@ $(document).ready(function() {
var $this = $(this); var $this = $(this);
function doDelete() { function doDelete() {
var group_id = $this.data('gid'); var group_id = $this.data('gid');
var the_url = "{% url 'users:user-group-detail-api' 99991937 %}".replace('99991937', group_id); var the_url = "{% url 'users:api-user-group-detail' pk=99991937 %}".replace('99991937', group_id);
var body = {}; var body = {};
var success = function() { var success = function() {
var msg = "{% trans 'Group Deleted.' %}"; var msg = "{% trans 'Group Deleted.' %}";
...@@ -76,7 +75,7 @@ $(document).ready(function() { ...@@ -76,7 +75,7 @@ $(document).ready(function() {
var fail = function() { var fail = function() {
var msg = "{% trans 'Group Deleting failed.' %}"; var msg = "{% trans 'Group Deleting failed.' %}";
swal("{% trans 'Group Delete' %}", msg, "error"); swal("{% trans 'Group Delete' %}", msg, "error");
} };
APIUpdateAttr({ APIUpdateAttr({
url: the_url, url: the_url,
body: JSON.stringify(body), body: JSON.stringify(body),
...@@ -105,8 +104,8 @@ $(document).ready(function() { ...@@ -105,8 +104,8 @@ $(document).ready(function() {
}); });
if (plain_id_list === []) { if (plain_id_list === []) {
return false; return false;
}; }
var the_url = "{% url 'users:user-group-bulk-update-api' %}"; var the_url = "{% url 'users:api-user-group-list' %}";
function doDelete() { function doDelete() {
swal({ swal({
title: "{% trans 'Are you sure?' %}", title: "{% trans 'Are you sure?' %}",
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
<th class="text-center">{% trans 'Username' %}</th> <th class="text-center">{% trans 'Username' %}</th>
<th class="text-center">{% trans 'Role' %}</th> <th class="text-center">{% trans 'Role' %}</th>
<th class="text-center">{% trans 'User group' %}</th> <th class="text-center">{% trans 'User group' %}</th>
<th class="text-center">{% trans 'Asset num' %}</th>
<th class="text-center">{% trans 'Active' %}</th> <th class="text-center">{% trans 'Active' %}</th>
<th class="text-center">{% trans 'Action' %}</th> <th class="text-center">{% trans 'Action' %}</th>
</tr> </tr>
...@@ -56,14 +55,14 @@ $(document).ready(function(){ ...@@ -56,14 +55,14 @@ $(document).ready(function(){
var innerHtml = cellData.length > 20 ? cellData.substring(0, 20) + '...': cellData; var innerHtml = cellData.length > 20 ? cellData.substring(0, 20) + '...': cellData;
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>'); $(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
}}, }},
{targets: 6, createdCell: function (td, cellData) { {targets: 5, createdCell: function (td, cellData) {
if (!cellData) { if (!cellData) {
$(td).html('<i class="fa fa-times text-danger"></i>') $(td).html('<i class="fa fa-times text-danger"></i>')
} else { } else {
$(td).html('<i class="fa fa-check text-navy"></i>') $(td).html('<i class="fa fa-check text-navy"></i>')
} }
}}, }},
{targets: 7, createdCell: function (td, cellData, rowData) { {targets: 6, createdCell: function (td, cellData, rowData) {
var update_btn = '<a href="{% url "users:user-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData); var update_btn = '<a href="{% url "users:user-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData);
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_user_delete" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData); var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_user_delete" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData);
if (rowData.id === 1 || rowData.username == "admin") { if (rowData.id === 1 || rowData.username == "admin") {
...@@ -73,8 +72,8 @@ $(document).ready(function(){ ...@@ -73,8 +72,8 @@ $(document).ready(function(){
} }
}}], }}],
ajax_url: '{% url "users:api-user-list" %}', ajax_url: '{% url "users:api-user-list" %}',
columns: [{data: function(){return ""}}, {data: "username" }, {data: "name" }, {data: "get_role_display" }, {data: "group_display" }, columns: [{data: function(){return ""}}, {data: "username" }, {data: "name" }, {data: "get_role_display" },
{data: function(){return 999}}, {data: "active_display" }, {data: "id" }], {data: "groups_display" }, {data: "is_valid" }, {data: "id" }],
op_html: $('#actions').html() op_html: $('#actions').html()
}; };
jumpserver.initDataTable(options); jumpserver.initDataTable(options);
...@@ -224,6 +223,8 @@ $(document).ready(function(){ ...@@ -224,6 +223,8 @@ $(document).ready(function(){
$form.ajaxSubmit({success: success}); $form.ajaxSubmit({success: success});
}).on('change', '#id_excel', function() { }).on('change', '#id_excel', function() {
$(this).siblings('.help-block').remove(); $(this).siblings('.help-block').remove();
}).on('click', '.ipt_check', function () {
console.log('Hello')
}) })
</script> </script>
{% endblock %} {% endblock %}
......
...@@ -39,6 +39,7 @@ urlpatterns = [ ...@@ -39,6 +39,7 @@ urlpatterns = [
router = BulkRouter() router = BulkRouter()
router.register(r'v1/users', api.UserViewSet, 'api-user') router.register(r'v1/users', api.UserViewSet, 'api-user')
router.register(r'v1/user-groups', api.UserGroupViewSet, 'api-user-group')
# router.register(r'v1/user-groups', api.AssetViewSet, 'api-groups') # router.register(r'v1/user-groups', api.AssetViewSet, 'api-groups')
...@@ -53,7 +54,9 @@ urlpatterns += [ ...@@ -53,7 +54,9 @@ urlpatterns += [
# url(r'^v1/user-groups/(?P<pk>\d+)/user/(?P<uid>\d+)/$', # url(r'^v1/user-groups/(?P<pk>\d+)/user/(?P<uid>\d+)/$',
# api.DeleteUserFromGroupApi.as_view(), name='delete-user-from-group-api'), # api.DeleteUserFromGroupApi.as_view(), name='delete-user-from-group-api'),
url(r'^v1/users/(?P<pk>\d+)/groups/$', url(r'^v1/users/(?P<pk>\d+)/groups/$',
api.UserAndGroupEditApi.as_view(), name='group-user-edit-api'), api.UserUpdateGroupApi.as_view(), name='api-user-update-group'),
url(r'^v1/user-groups/(?P<pk>\d+)/users/$',
api.UserGroupUpdateUserApi.as_view(), name='api-user-group-update-user'),
] ]
urlpatterns += router.urls urlpatterns += router.urls
...@@ -216,10 +216,16 @@ class UserGroupUpdateView(AdminUserRequiredMixin, UpdateView): ...@@ -216,10 +216,16 @@ class UserGroupUpdateView(AdminUserRequiredMixin, UpdateView):
class UserGroupDetailView(AdminUserRequiredMixin, DetailView): class UserGroupDetailView(AdminUserRequiredMixin, DetailView):
model = UserGroup model = UserGroup
context_object_name = 'user_group'
template_name = 'users/user_group_detail.html' template_name = 'users/user_group_detail.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = {'app': _('Users'), 'action': _('User Group Detail')} users = User.objects.exclude(id__in=self.object.users.all())
context = {
'app': _('Users'),
'action': _('User Group Detail'),
'users': users,
}
kwargs.update(context) kwargs.update(context)
return super(UserGroupDetailView, self).get_context_data(**kwargs) return super(UserGroupDetailView, self).get_context_data(**kwargs)
......
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