user-group-detail: user-adding frontend integration

parent e7fddf80
...@@ -93,14 +93,16 @@ class GroupEditApi(generics.RetrieveUpdateDestroyAPIView): ...@@ -93,14 +93,16 @@ class GroupEditApi(generics.RetrieveUpdateDestroyAPIView):
serializer_class = GroupEditSerializer serializer_class = GroupEditSerializer
def perform_update(self, serializer): def perform_update(self, serializer):
partial = serializer.validated_data.get('partial', False)
users = serializer.validated_data.get('users') users = serializer.validated_data.get('users')
if partial and users: if users:
group = self.get_object() group = self.get_object()
group.users.add(users) # Note: use `list` method to force hitting the db.
group_users = list(group.users.all())
serializer.save()
group.users.set(users + group_users)
group.save() group.save()
return return
return super(GroupEditApi, self).perform_update(serializer) serializer.save()
class UserBulkUpdateApi(ListBulkCreateUpdateDestroyAPIView): class UserBulkUpdateApi(ListBulkCreateUpdateDestroyAPIView):
......
...@@ -11,15 +11,48 @@ ...@@ -11,15 +11,48 @@
<script src="{% static "js/plugins/sweetalert/sweetalert.min.js" %}"></script> <script src="{% static "js/plugins/sweetalert/sweetalert.min.js" %}"></script>
<script src="{% static "js/plugins/dataTables/dataTables.min.js" %}"></script> <script src="{% static "js/plugins/dataTables/dataTables.min.js" %}"></script>
<style> <style>
.label { .user_div {
font-size: 14px; background-color: #d1dade;
line-height: 2.5; color: #5e5e5e;
font-family: "Open Sans";
padding: 3px 8px;
text-shadow: none;
} }
.label .remove { .user_div .remove {
color: #fff; color: #fff;
} }
.label span { .user_div span {
color: #5e5e5e; color: #5e5e5e;
}
dl {
width: 100%;
overflow: hidden;
padding: 0;
margin: 10px;
border-bottom: 1px solid #e7eaec;
}
dt {
float: left;
width: 30%;
padding: 0;
margin: 0
}
dd {
float: left;
width: 70%;
padding: 0;
margin: 0
}
#group_user_row dt {
border-bottom: 1px solid #e7eaec;
width: 100%;
margin-bottom: 20px;
}
#group_user_row dd {
width: 100%;
overflow: auto;
} }
</style> </style>
{% endblock %} {% endblock %}
...@@ -50,29 +83,26 @@ ...@@ -50,29 +83,26 @@
</div> </div>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<table class="table"> <dl>
<tbody> <dt width="20%">{% trans 'Name' %}:</dt>
<tr> <dd><b>{{ object.name }}</b></dd>
<td width="20%">{% trans 'Name' %}:</td> </dl>
<td><b>{{ object.name }}</b></td> <dl>
</tr> <dt>{% trans 'Comment' %}:</dt>
<tr> <dd><b>{{ object.comment }}</b></dd>
<td>{% trans 'Comment' %}:</td> </dl>
<td><b>{{ object.comment }}</b></td> <dl>
</tr> <dt>{% trans 'Created at' %}:</dt>
<tr> <dd><b>{{ object.date_created }}</b></dd>
<td>{% trans 'Created at' %}:</td> </dl>
<td><b>{{ object.date_created }}</b></td> <dl id="group_user_row">
</tr> <dt>{% trans 'Users' %}:</dt>
<tr> <dd style="line-height: 2" id="group_user_container">
<td>{% trans 'Users' %}:</td>
<td style="line-height: 2">
{% for user in object.users.all %} {% for user in object.users.all %}
<span class="label m-l-xs"><a href="{{ user.get_absolute_url }}"><span>{{ user.name }}</span></a><a data-uid="{{ user.id }}" class="btn_remove"><i class="remove fa fa-times-circle"></i></a></span> <div class="col-sm-4 user_div"><div class="col-xs-9"><a href="{{ user.get_absolute_url }}"><span>{{ user.name }}</span></a></div><div class="col-xs-3"><a data-uid="{{ user.id }}" class="btn_remove m-l-5"><i class="remove fa fa-times-circle"></i></a></div></div>
{% endfor %} {% endfor %}
</td> </dd>
</tr> </dl>
</table>
</div> </div>
</div> </div>
</div> </div>
...@@ -119,7 +149,7 @@ $(document).on('click', '.btn_remove', function(){ ...@@ -119,7 +149,7 @@ $(document).on('click', '.btn_remove', function(){
var uid = $this.data('uid'); var uid = $this.data('uid');
var the_url = '{% url "users:delete-user-from-group-api" pk=object.id uid=99991937 %}'.replace('99991937', uid); var the_url = '{% url "users:delete-user-from-group-api" pk=object.id uid=99991937 %}'.replace('99991937', uid);
var success = function(){ var success = function(){
$this.closest('.label').remove(); $this.closest('.user_div').remove();
}; };
var error = function(){}; var error = function(){};
APIUpdateAttr({url: the_url, body: "{}", method: "DELETE", success: success, error: error}); APIUpdateAttr({url: the_url, body: "{}", method: "DELETE", success: success, error: error});
...@@ -167,25 +197,39 @@ $(document).on('click', '.btn_remove', function(){ ...@@ -167,25 +197,39 @@ $(document).on('click', '.btn_remove', function(){
jumpserver.initDataTable(options); jumpserver.initDataTable(options);
}).on('click', '#btn_select_user', function() { }).on('click', '#btn_select_user', function() {
var $data_table = $('#select_user_table').DataTable(); var $data_table = $('#select_user_table').DataTable();
var id_list = [];
var plain_id_list = []; var plain_id_list = [];
var selected_users = [];
$data_table.rows({selected: true}).every(function(){ $data_table.rows({selected: true}).every(function(){
id_list.push({id: this.data().id});
plain_id_list.push(this.data().id); plain_id_list.push(this.data().id);
selected_users.push({id: this.data().id, name: this.data().name});
}); });
if (id_list === []) { console.log(selected_users)
if (plain_id_list === []) {
return false; return false;
}; };
console.log(id_list);
console.log(plain_id_list);
var body = { var body = {
id: {{ object.id }}, id: {{ object.id }},
users: plain_id_list.map(Number) users: plain_id_list.map(Number)
}; };
console.log(body);
$('#select_user_modal').modal('hide'); $('#select_user_modal').modal('hide');
var the_url = "{% url 'users:user-group-edit-api' pk=object.id %}"; var the_url = "{% url 'users:user-group-edit-api' pk=object.id %}";
APIUpdateAttr({url: the_url, body: JSON.stringify(body)}); var success = function() {
toastr.success('{% trans "The selected users has been added to current group." %}');
var html = "";
$.each(selected_users, function(index, user) {
html += [
'<div class="col-sm-4 user_div"><div class="col-xs-9"><a href="',
'{% url "users:user-detail" pk=99991937 %}'.replace(99991937, user.id),
'"><span>',
user.name,
'</span></a></div><div class="col-xs-3"><a data-uid="',
user.id,
'" class="btn_remove m-l-5"><i class="remove fa fa-times-circle"></i></a></div></div>\n',
].join("");
});
$(html).appendTo($('#group_user_container'));
}
APIUpdateAttr({url: the_url, body: JSON.stringify(body), success: success});
}) })
</script> </script>
{% endblock %} {% endblock %}
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