diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index 93e33fa1..6f99a03d 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -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', + ] diff --git a/apps/account/urls/back.py b/apps/account/urls/back.py index a24a33e6..3f0e3edc 100644 --- a/apps/account/urls/back.py +++ b/apps/account/urls/back.py @@ -12,4 +12,5 @@ urlpatterns = [ path('user/', views.UserListView.as_view(), name='user-create-list'), path('user//', views.UserRUDView.as_view(), name='user-rud'), path('user//csv/', views.get_user_csv, name='user-csv'), + path('user/csv/', views.UserCSVViewSet.as_view({'get': 'to_csv'}), name='user-csv-list'), ] diff --git a/apps/account/views/back.py b/apps/account/views/back.py index 0fd9bdde..822ecc35 100644 --- a/apps/account/views/back.py +++ b/apps/account/views/back.py @@ -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)