|
|
|
|
@ -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'] |
|
|
|
|
|