from django.shortcuts import render, redirect from django.urls import reverse_lazy from django.views.generic.edit import CreateView 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 from .forms import InvitationCodeForm, CustomUserCreationForm, CustomUserChangeForm, PlayerCreationForm from .models import CustomUser, InvitationCode import uuid def invitation_code_view(request): if request.method == 'POST': form = InvitationCodeForm(request.POST) if form.is_valid(): code = form.cleaned_data['code'] request.session['invitation_code'] = code return redirect('register') else: form = InvitationCodeForm() return render(request, 'accounts/invitation_code.html', {'form': form}) def register_view(request): invitation_code_str = request.session.get('invitation_code') if not invitation_code_str: return redirect('invitation_code') try: invitation_code = InvitationCode.objects.get(code=invitation_code_str) if not invitation_code.is_valid(): # Handle invalid code, maybe redirect with a message return redirect('invitation_code') except InvitationCode.DoesNotExist: return redirect('invitation_code') if request.method == 'POST': form = CustomUserCreationForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.set_password(form.cleaned_data['password']) user.save() invitation_code.is_active = False invitation_code.user = user invitation_code.save() # Log the user in and redirect to the dashboard return redirect('login') # Or wherever you want to redirect after registration else: form = CustomUserCreationForm() return render(request, 'accounts/register.html', {'form': form}) @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 can only login after using invitation code player.save() # Create invitation code for player InvitationCode.objects.create(code=str(uuid.uuid4()), user=player) # Create parent users and invitation codes for email_field in ['parent1_email', 'parent2_email']: email = form.cleaned_data.get(email_field) if email: parent_user = CustomUser.objects.filter(email=email).first() if not parent_user: parent_user = CustomUser.objects.create(email=email, username=email, is_active=False) InvitationCode.objects.create(code=str(uuid.uuid4()), user=parent_user) 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)