diff --git a/accounts/views.py b/accounts/views.py index efb4de5..b4c00ed 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -5,32 +5,101 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.contrib.auth import views as auth_views, login from django.contrib import messages -from django.db import Q, IntegrityError +from django.db.models import Q from django.http import JsonResponse from .forms import CustomUserCreationForm, CustomUserChangeForm, PlayerCreationForm, PlayerVerificationForm, ParentVerificationForm from .models import CustomUser from .utils import send_verification_email import uuid -... + +@login_required +def edit_profile(request): + if request.method == 'POST': + form = CustomUserChangeForm(request.POST, instance=request.user) + if form.is_valid(): + form.save() + return redirect('edit_profile') # Or wherever you want to redirect + else: + form = CustomUserChangeForm(instance=request.user) + return render(request, 'accounts/edit_profile.html', {'form': form}) + +class HeadCoachCheckMixin(UserPassesTestMixin): + def test_func(self): + return self.request.user.is_superuser or self.request.user.coached_teams.exists() + +class PlayerCreateView(LoginRequiredMixin, HeadCoachCheckMixin, CreateView): + model = CustomUser + form_class = PlayerCreationForm + template_name = 'accounts/player_form.html' + success_url = reverse_lazy('dashboard') + + def form_valid(self, form): + # Create player user + player = form.save(commit=False) + player.is_active = False # Player is inactive until verified + player.set_unusable_password() # Password must be set via verification + player.verification_code = uuid.uuid4() + player.save() + + # Send verification email to player + send_verification_email(player, self.request, is_parent=False) + + # Handle parents + for i in ['1', '2']: + search_identifier = form.cleaned_data.get(f'parent{i}_search') + new_email = form.cleaned_data.get(f'parent{i}_new') + + if search_identifier: + import re + match = re.search(r'\((\w+)\)', search_identifier) + if match: + username = match.group(1) + try: + parent_user = CustomUser.objects.get(username=username) + player.parents.add(parent_user) + except CustomUser.DoesNotExist: + form.add_error(f'parent{i}_search', 'User not found.') + else: + try: + parent_user = CustomUser.objects.get(Q(username=search_identifier) | Q(email=search_identifier)) + player.parents.add(parent_user) + except CustomUser.DoesNotExist: + form.add_error(f'parent{i}_search', 'User not found.') + except CustomUser.MultipleObjectsReturned: + form.add_error(f'parent{i}_search', 'Multiple users found. Please be more specific.') + elif new_email: - try: - parent_user = CustomUser.objects.create( - email=new_email, - username=new_email, - is_active=False - ) + parent_user, created = CustomUser.objects.get_or_create( + email=new_email, + defaults={'username': new_email, 'is_active': False} + ) + if created: parent_user.set_unusable_password() parent_user.verification_code = uuid.uuid4() parent_user.save() # Send verification email to new parent send_verification_email(parent_user, self.request, is_parent=True) - player.parents.add(parent_user) - except IntegrityError: - form.add_error(f'parent{i}_new', f"A user with the email '{new_email}' already exists. Please use the search field to add them.") + player.parents.add(parent_user) if form.errors: return self.form_invalid(form) -... + + return redirect(self.success_url) + +class MyLoginView(auth_views.LoginView): + def get(self, request, *args, **kwargs): + if request.user.is_authenticated: + return redirect('dashboard') + return super().get(request, *args, **kwargs) + +def user_search(request): + q = request.GET.get('q', '') + users = CustomUser.objects.filter(last_name__istartswith=q).values('username', 'first_name', 'last_name') + results = [] + for user in users: + results.append(f"{user['last_name']}, {user['first_name']} ({user['username']})") + return JsonResponse(results, safe=False) + def verify_account(request, verification_code): user = get_object_or_404(CustomUser, verification_code=verification_code, is_verified=False)