mirror of https://github.com/jumpserver/jumpserver
Merge branch 'master' of code.simcu.com:jumpserver/jumpserver
update:add_assets-grouppull/530/head
commit
184ac728db
|
@ -98,3 +98,16 @@ class GroupDeleteApi(generics.DestroyAPIView):
|
||||||
class UserBulkUpdateApi(ListBulkCreateUpdateDestroyAPIView):
|
class UserBulkUpdateApi(ListBulkCreateUpdateDestroyAPIView):
|
||||||
queryset = User.objects.all()
|
queryset = User.objects.all()
|
||||||
serializer_class = UserBulkUpdateSerializer
|
serializer_class = UserBulkUpdateSerializer
|
||||||
|
|
||||||
|
def filter_queryset(self, queryset):
|
||||||
|
id_list = self.request.query_params.get('id__in')
|
||||||
|
if id_list:
|
||||||
|
import json
|
||||||
|
try:
|
||||||
|
ids = json.loads(id_list)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(str(e))
|
||||||
|
return queryset
|
||||||
|
if isinstance(ids, list):
|
||||||
|
queryset = queryset.filter(id__in=ids)
|
||||||
|
return queryset
|
||||||
|
|
|
@ -215,6 +215,11 @@ class User(AbstractUser):
|
||||||
user.save()
|
user.save()
|
||||||
user.groups.add(UserGroup.initial())
|
user.groups.add(UserGroup.initial())
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
if self.is_superuser:
|
||||||
|
return
|
||||||
|
return super(User, self).delete()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def generate_fake(cls, count=100):
|
def generate_fake(cls, count=100):
|
||||||
from random import seed, choice
|
from random import seed, choice
|
||||||
|
|
|
@ -11,12 +11,12 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">{% trans 'Name' %}</a></th>
|
<th class="text-center">{% trans 'Name' %}</a></th>
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">{% trans 'Username' %}</a></th>
|
<th class="text-center">{% trans 'Username' %}</a></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 'Asset num' %}</th>
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Active' %}</a></th>
|
<th class="text-center">{% trans 'Active' %}</a></th>
|
||||||
<th class="text-center">{% trans 'Action' %}</th>
|
<th class="text-center">{% trans 'Action' %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -24,45 +24,12 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block table_body %}
|
|
||||||
{% for user in object_list %}
|
|
||||||
<tr class="gradeX">
|
|
||||||
<td class="text-center">
|
|
||||||
<input type="checkbox" name="checked" value="{{ user.id }}" class="ipt_bulk_update">
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'users:user-detail' pk=user.id %}">
|
|
||||||
{{ user.name }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="text-center">{{ user.username }}</td>
|
|
||||||
<td class="text-center">{{ user.get_role_display }}</td>
|
|
||||||
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
|
|
||||||
<th class="text-center">{{ user.name }}</th>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if user.is_expired and user.is_active %}
|
|
||||||
<i class="fa fa-times text-danger"></i>
|
|
||||||
{% else %}
|
|
||||||
<i class="fa fa-check text-navy"></i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
|
||||||
<!--<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>-->
|
|
||||||
<a onclick="obj_del(this,'{{ user.name }}','{% url 'users:user-delete' user.id %}')" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content_bottom_left %}
|
{% block content_bottom_left %}
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<select class="form-control m-b" style="width: auto" id="slct_bulk_update">
|
<select class="form-control m-b" style="width: auto" id="slct_bulk_update">
|
||||||
<option value="delete">{% trans 'Delete selected' %}</option>
|
<option value="delete">{% trans 'Delete selected' %}</option>
|
||||||
<option value="update">{% trans 'Update selected' %}</option>
|
<option value="update">{% trans 'Update selected' %}</option>
|
||||||
<option value="deactive">{% trans 'Deactive selected' %}</option>
|
<option value="deactive">{% trans 'Deactive selected' %}</option>
|
||||||
<option value="export">{% trans 'Export selected' %}</option>
|
|
||||||
</select>
|
</select>
|
||||||
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
||||||
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-primary">
|
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-primary">
|
||||||
|
@ -108,8 +75,14 @@ $(document).ready(function(){
|
||||||
{orderable: false, className: 'select-checkbox', targets: 0},
|
{orderable: false, className: 'select-checkbox', targets: 0},
|
||||||
{className: 'text-center', targets: [1, 2, 3, 4, 5, 6, 7]},
|
{className: 'text-center', targets: [1, 2, 3, 4, 5, 6, 7]},
|
||||||
{targets: 7,
|
{targets: 7,
|
||||||
createdCell: function (td, cellData) {
|
createdCell: function (td, cellData, rowData) {
|
||||||
$(td).html('<a href="#" class="btn btn-xs btn-info">{% trans "Update" %}</a><a class="btn btn-xs btn-danger del">{% trans "Delete" %}</a>')
|
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);
|
||||||
|
if (rowData.role === 'Admin') {
|
||||||
|
$(td).html(update_btn)
|
||||||
|
} else {
|
||||||
|
$(td).html(update_btn + del_btn)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{targets: 6,
|
{targets: 6,
|
||||||
|
@ -141,9 +114,14 @@ $(document).ready(function(){
|
||||||
var action = $('#slct_bulk_update').val();
|
var action = $('#slct_bulk_update').val();
|
||||||
var $data_table = $('#user_list_table').DataTable()
|
var $data_table = $('#user_list_table').DataTable()
|
||||||
var id_list = [];
|
var id_list = [];
|
||||||
|
var plain_id_list = [];
|
||||||
$data_table.rows({selected: true}).every(function(){
|
$data_table.rows({selected: true}).every(function(){
|
||||||
id_list.push({id: this.data().id})
|
id_list.push({id: this.data().id});
|
||||||
|
plain_id_list.push(this.data().id);
|
||||||
});
|
});
|
||||||
|
if (id_list === []) {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
var the_url = "{% url 'users:user-bulk-update-api' %}";
|
var the_url = "{% url 'users:user-bulk-update-api' %}";
|
||||||
function doDeactive() {
|
function doDeactive() {
|
||||||
var body = $.each(id_list, function(index, user_object) {
|
var body = $.each(id_list, function(index, user_object) {
|
||||||
|
@ -162,11 +140,19 @@ $(document).ready(function(){
|
||||||
confirmButtonText: "{% trans 'Confirm' %}",
|
confirmButtonText: "{% trans 'Confirm' %}",
|
||||||
closeOnConfirm: false
|
closeOnConfirm: false
|
||||||
}, function() {
|
}, function() {
|
||||||
APIUpdateAttr({url: the_url, method: 'DELETE', body: JSON.stringify(id_list)});
|
var success = function() {
|
||||||
$data_table.ajax.reload();
|
var msg = "{% trans 'User Deleted.' %}";
|
||||||
|
swal("{% trans 'User Delete' %}", msg, "success");
|
||||||
|
$('#user_list_table').DataTable().ajax.reload();
|
||||||
|
};
|
||||||
|
var fail = function() {
|
||||||
|
var msg = "{% trans 'User Deleting failed.' %}";
|
||||||
|
swal("{% trans 'User Delete' %}", msg, "error");
|
||||||
|
};
|
||||||
|
var url_delete = the_url + '?id__in=' + JSON.stringify(plain_id_list);
|
||||||
|
APIUpdateAttr({url: url_delete, method: 'DELETE', success: success, error: fail});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function doExport() {}
|
|
||||||
function doUpdate() {}
|
function doUpdate() {}
|
||||||
switch(action) {
|
switch(action) {
|
||||||
case 'deactive':
|
case 'deactive':
|
||||||
|
@ -178,12 +164,43 @@ $(document).ready(function(){
|
||||||
case 'update':
|
case 'update':
|
||||||
doUpdate();
|
doUpdate();
|
||||||
break;
|
break;
|
||||||
case 'export':
|
|
||||||
doExport();
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}).on('click', '.btn_user_delete', function(){
|
||||||
|
var $this = $(this);
|
||||||
|
function doDelete() {
|
||||||
|
var uid = $this.data('uid');
|
||||||
|
var the_url = '{% url "users:user-patch-api" pk=99991937 %}'.replace('99991937', uid);
|
||||||
|
var body = {};
|
||||||
|
var success = function() {
|
||||||
|
var msg = "{% trans 'User Deleted.' %}";
|
||||||
|
swal("{% trans 'User Delete' %}", msg, "success");
|
||||||
|
$('#user_list_table').DataTable().ajax.reload();
|
||||||
|
};
|
||||||
|
var fail = function() {
|
||||||
|
var msg = "{% trans 'User Deleting failed.' %}";
|
||||||
|
swal("{% trans 'User Delete' %}", msg, "error");
|
||||||
|
}
|
||||||
|
APIUpdateAttr({
|
||||||
|
url: the_url,
|
||||||
|
body: JSON.stringify(body),
|
||||||
|
method: 'DELETE',
|
||||||
|
success: success,
|
||||||
|
error: fail
|
||||||
|
});
|
||||||
|
}
|
||||||
|
swal({
|
||||||
|
title: "{% trans 'Are you sure?' %}",
|
||||||
|
text: "{% trans 'This will delete the selected user.' %}",
|
||||||
|
type: "warning",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#DD6B55",
|
||||||
|
confirmButtonText: "{% trans 'Confirm' %}",
|
||||||
|
closeOnConfirm: false
|
||||||
|
}, function() {
|
||||||
|
doDelete();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
{% extends '_base_list.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
{% load common_tags %}
|
|
||||||
{% block content_left_head %}
|
|
||||||
<a href="{% url 'users:user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create user" %} </a>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block table_head %}
|
|
||||||
<th class="text-center">
|
|
||||||
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
|
|
||||||
</th>
|
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">{% trans 'Name' %}</a></th>
|
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">{% trans 'Username' %}</a></th>
|
|
||||||
<th class="text-center">{% trans 'Role' %}</th>
|
|
||||||
<th class="text-center">{% trans 'User group' %}</th>
|
|
||||||
<th class="text-center">{% trans 'Asset num' %}</th>
|
|
||||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Active' %}</a></th>
|
|
||||||
<th class="text-center"></th>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block table_body %}
|
|
||||||
{% for user in object_list %}
|
|
||||||
<tr class="gradeX">
|
|
||||||
<td class="text-center">
|
|
||||||
<input type="checkbox" name="checked" value="{{ user.id }}" class="ipt_bulk_update">
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'users:user-detail' pk=user.id %}">
|
|
||||||
{{ user.name }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td class="text-center">{{ user.username }}</td>
|
|
||||||
<td class="text-center">{{ user.get_role_display }}</td>
|
|
||||||
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
|
|
||||||
<th class="text-center">{{ user.name }}</th>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if user.is_expired and user.is_active %}
|
|
||||||
<i class="fa fa-times text-danger"></i>
|
|
||||||
{% else %}
|
|
||||||
<i class="fa fa-check text-navy"></i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
|
||||||
<!--<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>-->
|
|
||||||
<a onclick="obj_del(this,'{{ user.name }}','{% url 'users:user-delete' user.id %}')" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content_bottom_left %}
|
|
||||||
<div class="input-group">
|
|
||||||
<select class="form-control m-b" style="width: auto" id="slct_bulk_update">
|
|
||||||
<option value="delete">{% trans 'Delete selected' %}</option>
|
|
||||||
<option value="update">{% trans 'Update selected' %}</option>
|
|
||||||
<option value="deactive">{% trans 'Deactive selected' %}</option>
|
|
||||||
<option value="export">{% trans 'Export selected' %}</option>
|
|
||||||
</select>
|
|
||||||
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
|
||||||
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-primary">
|
|
||||||
{% trans 'Submit' %}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
{% block custom_foot_js %}
|
|
||||||
<script>
|
|
||||||
$(document).on('click', '#btn_bulk_update', function(){
|
|
||||||
var action = $('#slct_bulk_update').val();
|
|
||||||
var id_list = $('.ipt_bulk_update:checked').map(function(){return {'id': parseInt($(this).val())}}).get();
|
|
||||||
var the_url = "{% url 'users:user-bulk-update-api' %}";
|
|
||||||
function doDeactive() {
|
|
||||||
var body = $.each(id_list, function(index, user_object) {
|
|
||||||
user_object['is_active'] = false;
|
|
||||||
});
|
|
||||||
APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(body)});
|
|
||||||
};
|
|
||||||
function doDelete() {
|
|
||||||
swal({
|
|
||||||
title: "{% trans 'Are you sure?' %}",
|
|
||||||
text: "{% trans 'This will delete the selected users !!!' %}",
|
|
||||||
type: "warning",
|
|
||||||
showCancelButton: true,
|
|
||||||
confirmButtonColor: "#DD6B55",
|
|
||||||
confirmButtonText: "{% trans 'Confirm' %}",
|
|
||||||
closeOnConfirm: false
|
|
||||||
}, function() {
|
|
||||||
APIUpdateAttr({url: the_url, method: 'DELETE', body: JSON.stringify(id_list)});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
function doExport() {};
|
|
||||||
function doUpdate() {};
|
|
||||||
switch(action) {
|
|
||||||
case 'deactive':
|
|
||||||
doDeactive();
|
|
||||||
break;
|
|
||||||
case 'delete':
|
|
||||||
doDelete();
|
|
||||||
break;
|
|
||||||
case 'update':
|
|
||||||
doUpdate();
|
|
||||||
break;
|
|
||||||
case 'export':
|
|
||||||
doExport();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
Loading…
Reference in New Issue