diff --git a/sync/admin.py b/sync/admin.py index 97d97b2..0f9f713 100644 --- a/sync/admin.py +++ b/sync/admin.py @@ -6,7 +6,7 @@ from .models import BaseModel, ModelLog, DataAccess class SyncedObjectAdmin(admin.ModelAdmin): exclude = ('data_access_ids',) - raw_id_fields = ['related_user'] + raw_id_fields = ['related_user', 'last_updated_by'] def save_model(self, request, obj, form, change): if isinstance(obj, BaseModel): diff --git a/tournaments/admin.py b/tournaments/admin.py index 3c7f7e5..4febf0d 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -1,19 +1,25 @@ -from django.contrib import admin +from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin from django.utils import timezone from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION from django.utils.html import escape -from django.urls import reverse, path # Add path import +from django.urls import reverse, path from django.utils.safestring import mark_safe -from django.shortcuts import render # Add this import -from django.db.models import Sum, Count, Avg, Q # Add these imports -from datetime import datetime, timedelta # Add this import +from django.shortcuts import render +from django.db.models import Avg +from datetime import timedelta, datetime + +from biz.models import Prospect from .models import Club, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, Court, DateInterval, FailedApiCall, Log, DeviceToken, DrawLog, UnregisteredTeam, UnregisteredPlayer, Image from .forms import CustomUserCreationForm, CustomUserChangeForm from .filters import TeamScoreTournamentListFilter, MatchTournamentListFilter, SimpleTournamentListFilter, MatchTypeListFilter, SimpleIndexListFilter, StartDateRangeFilter, UserWithEventsFilter, UserWithPurchasesFilter, UserWithProspectFilter from sync.admin import SyncedObjectAdmin +import logging + + +logger = logging.getLogger(__name__) class CustomUserAdmin(UserAdmin): form = CustomUserChangeForm @@ -21,6 +27,7 @@ class CustomUserAdmin(UserAdmin): model = CustomUser search_fields = ['username', 'email', 'phone', 'first_name', 'last_name', 'licence_id'] filter_horizontal = ('clubs',) + actions = ['convert_to_prospect'] list_display = ['email', 'first_name', 'last_name', 'username', 'date_joined', 'latest_event_club_name', 'is_active', 'event_count', 'origin', 'registration_payment_mode', 'licence_id'] list_filter = ['is_active', 'origin', UserWithEventsFilter, UserWithPurchasesFilter, UserWithProspectFilter] @@ -52,6 +59,33 @@ class CustomUserAdmin(UserAdmin): obj.last_update = timezone.now() super().save_model(request, obj, form, change) + def convert_to_prospect(self, request, queryset): + created_count = 0 + skipped_count = 0 + source_value = f"user_conversion_{datetime.now().strftime('%Y%m%d_%H%M')}" + + for user in queryset: + if user.email and Prospect.objects.filter(email=user.email).exists(): + skipped_count += 1 + continue + + prospect = Prospect.objects.create( + first_name=user.first_name, + last_name=user.last_name, + email=user.email, + phone=user.phone, + official_user=user, + source=source_value + ) + created_count += 1 + + if created_count > 0: + messages.success(request, f'{created_count} prospect(s) successfully created.') + if skipped_count > 0: + messages.warning(request, f'{skipped_count} user(s) skipped (prospect with same email already exists).') + + convert_to_prospect.short_description = "Convert selected users to prospects" + class EventAdmin(SyncedObjectAdmin): list_display = ['creation_date', 'name', 'club', 'creator', 'tenup_id', 'display_images'] list_filter = ['creator', 'club', 'tenup_id']