user list csv export

This commit is contained in:
alex 2020-01-30 13:15:39 +03:00
parent 13968b3ed7
commit 57dd5cb521
3 changed files with 74 additions and 7 deletions

View File

@ -17,7 +17,6 @@ class _SiteSettingsSerializer(serializers.ModelSerializer):
class BackUserSerializer(UserSerializer):
last_country = _SiteSettingsSerializer(read_only=True)
roles = RoleBaseSerializer(many=True)
@ -150,3 +149,21 @@ class UserRoleSerializer(serializers.ModelSerializer):
'user',
'establishment'
]
class UserCSVSerializer(serializers.ModelSerializer):
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, source='date_joined')
last_seen_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, source='last_login')
class Meta:
model = models.User
fields = [
'id',
'username',
'email',
'locale',
'last_country',
'created_at',
'last_seen_at',
'last_ip',
]

View File

@ -12,4 +12,5 @@ urlpatterns = [
path('user/', views.UserListView.as_view(), name='user-create-list'),
path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'),
path('user/<int:id>/csv/', views.get_user_csv, name='user-csv'),
path('user/csv/', views.UserCSVViewSet.as_view({'get': 'to_csv'}), name='user-csv-list'),
]

View File

@ -1,10 +1,13 @@
import csv
from datetime import datetime
from django.http import HttpResponse, HttpResponseNotFound
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics, permissions, status
from rest_framework.response import Response
from rest_framework.filters import OrderingFilter
import csv
from django.http import HttpResponse, HttpResponseNotFound
from rest_framework.authtoken.models import Token
from rest_framework.filters import OrderingFilter
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from account import models, filters
from account.models import User
@ -118,8 +121,8 @@ def get_user_csv(request, id):
"is_admin": user.is_superuser,
"encrypted_password": user.password,
"reset_password_token": token.key,
"reset_password_sent_at": token.created, # TODO: не уверен в назначении поля, лучше проверить
"last_sign_in_at": user.last_login, # Повтор?
"reset_password_sent_at": token.created, # TODO: не уверен в назначении поля, лучше проверить
"last_sign_in_at": user.last_login, # Повтор?
"confirmation_token": user.confirm_email_token,
"unconfirmed_email": 1 if user.unconfirmed_email else 0
}
@ -132,3 +135,49 @@ def get_user_csv(request, id):
writer.writerow(fields.values())
return response
class UserCSVViewSet(ModelViewSet):
queryset = User.objects.all()
http_method_names = ['get', ]
serializer_class = serializers.UserCSVSerializer
permission_classes = (permissions.IsAdminUser,)
filter_class = filters.AccountBackOfficeFilter
filter_backends = (OrderingFilter, DjangoFilterBackend)
ordering_fields = (
'email_confirmed',
'is_staff',
'is_active',
'is_superuser',
'last_login',
'date_joined',
)
def to_csv(self, request):
queryset = self.filter_queryset(self.get_queryset())
serializer = serializers.UserCSVSerializer(queryset, many=True)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="users_{datetime.now().date()}.csv"'
writer = csv.writer(response)
writer.writerow((
'id',
'nickname',
'email',
'locale',
'last_country',
'created_at',
# 'confirmed_at',
'last_seen_at',
'last_ip',
# 'role',
))
for item in serializer.data:
print(item)
writer.writerow(item.values())
return response
# return Response(serializer.data)