82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
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')
|