Add account csv endpoint

This commit is contained in:
littlewolf 2019-12-11 12:10:26 +03:00
parent 47cb7f8e63
commit a254160f43

View File

@ -3,6 +3,7 @@ from rest_framework import generics, permissions
from rest_framework.filters import OrderingFilter from rest_framework.filters import OrderingFilter
import csv import csv
from django.http import HttpResponse, HttpResponseNotFound from django.http import HttpResponse, HttpResponseNotFound
from rest_framework.authtoken.models import Token
from account import models from account import models
from account.models import User from account.models import User
@ -50,20 +51,67 @@ class UserRUDView(generics.RetrieveUpdateDestroyAPIView):
lookup_field = 'id' lookup_field = 'id'
def get_user_csv(request, user_id): def get_user_csv(request, id):
# fields = ["id", "uuid", "nickname", "locale", "country_code", "city", "role", "consent_purpose", "consent_at",
# "last_seen_at", "created_at", "updated_at", "email", "is_admin", "ezuser_id", "ez_user_id",
# "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at",
# "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip",
# "confirmation_token", "confirmed_at", "confirmation_sent_at", "unconfirmed_email", "webpush_subscription"]
# uuid == id
#
# Не найдены:
# consent_purpose
# consent_at
# ezuser_id
# ez_user_id
# remember_created_at
# sign_in_count
# current_sign_in_at
# current_sign_in_ip
# last_sign_in_ip
# confirmed_at
# confirmation_sent_at
# webpush_subscription
#
# country_code не получить - клиент не привязан к стране
try: try:
user = User.objects.get(id=user_id).values_list() user = User.objects.get(id=id)
except User.DoesNotExist: except User.DoesNotExist:
return HttpResponseNotFound("User not found") return HttpResponseNotFound("User not found")
# try:
# roles = " ".join([role for role in user.roles])
# response = HttpResponse(content_type='text/csv') except:
# response['Content-Disposition'] = f'attachment; filename="{user}.csv"' roles = ""
#
# writer = csv.writer(response) token, _ = Token.objects.get_or_create(user=user)
# writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
# writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"]) fields = {
# "id": user.id,
# return response "uuid": user.id,
return HttpResponseNotFound(user) "username": getattr(user, "username", ""),
"locale": getattr(user, "locale", ""),
"city": getattr(user, "city", ""),
"role": roles,
"created_at": getattr(user, "date_joined", ""),
"updated_at": user.last_login,
"email": user.email,
"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, # Повтор?
"confirmation_token": user.confirm_email_token,
"unconfirmed_email": 1 if user.unconfirmed_email else 0
}
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="{user.email}.csv"'
writer = csv.writer(response)
writer.writerow(fields.keys())
writer.writerow(fields.values())
return response