From b38ddc3f0d0ea36e352fadd27c6414dcdfc19874 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 3 Feb 2025 15:04:37 +0100 Subject: [PATCH 1/3] Adds text export of users view --- tournaments/urls.py | 1 + tournaments/views.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/tournaments/urls.py b/tournaments/urls.py index 1862f85..3b8e8e3 100644 --- a/tournaments/urls.py +++ b/tournaments/urls.py @@ -66,5 +66,6 @@ urlpatterns = [ path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), path('profile/', views.ProfileUpdateView.as_view(), name='profile'), path('admin/tournament-import/', views.tournament_import_view, name='tournament_import'), + path('admin/users-export/', views.UserListExportView.as_view(), name='users_export'), ] diff --git a/tournaments/views.py b/tournaments/views.py index e1333a5..5109296 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -11,6 +11,7 @@ from django.views.decorators.csrf import csrf_exempt from django.contrib.admin.views.decorators import staff_member_required from django.core.files.storage import default_storage from django.core.files.base import ContentFile +from django.views.generic import View from tournaments.models.device_token import DeviceToken @@ -882,3 +883,38 @@ def team_details(request, tournament_id, team_id): 'matches': all_matches, 'debug': False # Set to False in production }) + +class UserListExportView(LoginRequiredMixin, View): + def get(self, request, *args, **kwargs): + # Get users, excluding those with origin=UserOrigin.SITE, ordered by date_joined + users = CustomUser.objects.exclude( + origin=UserOrigin.SITE + ).order_by('date_joined') + + # Prepare the response + response = HttpResponse(content_type='text/plain; charset=utf-8') + + # Write header + headers = [ + 'Prenom', 'Nom', 'Email', 'Club', + 'Login', 'Actif', 'Inscription', 'Nombre de tournois' + ] + response.write('\t'.join(headers) + '\n') + + # Write data rows + for user in users: + row = [ + str(user.first_name or ''), + str(user.last_name or ''), + str(user.email or ''), + str(user.latest_event_club_name() or ''), + str(user.username or ''), + 'Oui' if user.is_active else 'Non', + user.date_joined.strftime('%Y-%m-%d %H:%M:%S'), + str(user.event_count()) + ] + # Replace any tabs or newlines in the data to prevent formatting issues + row = [field.replace('\t', ' ') for field in row] + response.write('\t'.join(row) + '\r\n') + + return response From 81b6b69d1f99bb944c785d8a4978b5a1b624784a Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 3 Feb 2025 15:08:00 +0100 Subject: [PATCH 2/3] Change column name for user export --- tournaments/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tournaments/views.py b/tournaments/views.py index 995232f..b536c92 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -898,7 +898,7 @@ class UserListExportView(LoginRequiredMixin, View): # Write header headers = [ 'Prenom', 'Nom', 'Email', 'Club', - 'Login', 'Actif', 'Inscription', 'Nombre de tournois' + 'Login', 'Actif', 'Inscription', 'Tournois' ] response.write('\t'.join(headers) + '\n') From a3935268060e8f80fa044b399154e063ad7807a6 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 3 Feb 2025 15:14:07 +0100 Subject: [PATCH 3/3] Add phone to user export --- tournaments/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tournaments/views.py b/tournaments/views.py index b536c92..add3598 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -897,7 +897,7 @@ class UserListExportView(LoginRequiredMixin, View): # Write header headers = [ - 'Prenom', 'Nom', 'Email', 'Club', + 'Prenom', 'Nom', 'Club', 'Email', 'Telephone', 'Login', 'Actif', 'Inscription', 'Tournois' ] response.write('\t'.join(headers) + '\n') @@ -907,8 +907,9 @@ class UserListExportView(LoginRequiredMixin, View): row = [ str(user.first_name or ''), str(user.last_name or ''), - str(user.email or ''), str(user.latest_event_club_name() or ''), + str(user.email or ''), + str(user.phone or ''), str(user.username or ''), 'Oui' if user.is_active else 'Non', user.date_joined.strftime('%Y-%m-%d %H:%M:%S'),