from django.shortcuts import render, redirect from django.contrib.auth import login, logout, get_user_model from django.contrib.auth.decorators import login_required from django.contrib import messages from django.contrib.sites.shortcuts import get_current_site from django.utils.encoding import force_bytes, force_str from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.template.loader import render_to_string from django.core.mail import EmailMessage from .models import Profile from .forms import SignupForm from .tokens import account_activation_token User = get_user_model() def home(request): if request.user.is_authenticated: return redirect('dashboard') return render(request, 'core/index.html') def signup(request): if request.user.is_authenticated: return redirect('dashboard') if request.method == 'POST': form = SignupForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.is_active = False user.save() # Send activation email current_site = get_current_site(request) mail_subject = 'Activate your Referral Rewards account.' message = render_to_string('core/emails/activation_email.html', { 'user': user, 'domain': current_site.domain, 'protocol': 'https' if request.is_secure() else 'http', 'uid': urlsafe_base64_encode(force_bytes(user.pk)), 'token': account_activation_token.make_token(user), }) to_email = form.cleaned_data.get('email') email = EmailMessage( mail_subject, message, to=[to_email] ) try: email.send() messages.success(request, 'Please confirm your email address to complete the registration. Check your inbox.') except Exception as e: messages.error(request, f'Error sending email: {str(e)}. Please contact support.') return redirect('login') else: form = SignupForm() return render(request, 'core/signup.html', {'form': form}) def activate(request, uidb64, token): try: uid = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=uid) except(TypeError, ValueError, OverflowError, User.DoesNotExist): user = None if user is not None and account_activation_token.check_token(user, token): user.is_active = True user.save() login(request, user) messages.success(request, 'Thank you for your email confirmation. Now you can enjoy our services.') return redirect('dashboard') else: messages.error(request, 'Activation link is invalid!') return redirect('home') @login_required def dashboard(request): # Ensure profile exists (though signal should handle it) profile, created = Profile.objects.get_or_create(user=request.user) return render(request, 'core/dashboard.html', {'profile': profile}) def logout_view(request): logout(request) return redirect('home')