@@ -19,10 +24,10 @@
{{ action }}
-
{% block content_left_head %} {% endblock %}
+ {% block table_search %}
+ {% endblock %}
-
+ {% block table_container %}
{# Update batch #}
{% block content_bottom_left %} {% endblock %}
+ {% block table_pagination %}
{% include '_pagination.html' %}
+ {% endblock %}
-
{% endblock %}
diff --git a/apps/users/api.py b/apps/users/api.py
index 2f683dcb6761..c90bde91064b 100644
--- a/apps/users/api.py
+++ b/apps/users/api.py
@@ -4,9 +4,10 @@
import logging
from rest_framework import generics
+from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView
from .serializers import UserSerializer, UserGroupSerializer, UserAttributeSerializer, UserGroupEditSerializer, \
- GroupEditSerializer, UserPKUpdateSerializer
+ GroupEditSerializer, UserPKUpdateSerializer, UserBulkUpdateSerializer
from .models import User, UserGroup
@@ -92,3 +93,8 @@ def perform_update(self, serializer):
class GroupDeleteApi(generics.DestroyAPIView):
queryset = UserGroup.objects.all()
serializer_class = GroupEditSerializer
+
+
+class UserBulkUpdateApi(ListBulkCreateUpdateDestroyAPIView):
+ queryset = User.objects.all()
+ serializer_class = UserBulkUpdateSerializer
diff --git a/apps/users/serializers.py b/apps/users/serializers.py
index 8e117a90de4a..c5e8f39262d9 100644
--- a/apps/users/serializers.py
+++ b/apps/users/serializers.py
@@ -3,6 +3,7 @@
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
+from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin
from .models import User, UserGroup
@@ -67,3 +68,22 @@ def validate__public_key(self, value):
print e
raise serializers.ValidationError(_('Not a valid ssh public key'))
return value
+
+
+class UserBulkUpdateSerializer(BulkSerializerMixin, serializers.ModelSerializer):
+ group_display = serializers.SerializerMethodField()
+ active_display = serializers.SerializerMethodField()
+
+ class Meta(object):
+ model = User
+ list_serializer_class = BulkListSerializer
+ fields = ['id', 'is_active', 'username', 'name', 'email', 'role', 'avatar',
+ 'enable_otp', 'comment', 'groups', 'get_role_display',
+ 'group_display', 'active_display']
+
+ def get_group_display(self, obj):
+ return " ".join([group.name for group in obj.groups.all()])
+
+ def get_active_display(self, obj):
+ # TODO: user ative state
+ return not (obj.is_expired and obj.is_active)
diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html
index 2017510ead40..da36ab903c0d 100644
--- a/apps/users/templates/users/user_list.html
+++ b/apps/users/templates/users/user_list.html
@@ -1,28 +1,35 @@
{% extends '_base_list.html' %}
-{% load i18n %}
+{% load i18n static %}
+{% get_current_language as LANGUAGE_CODE %}
{% load common_tags %}
{% block content_left_head %}