profile changes

This commit is contained in:
pacnpal
2024-11-05 23:36:50 +00:00
parent eb5d2acab5
commit 33b7c1a81a
47 changed files with 207 additions and 37 deletions

View File

@@ -18,7 +18,7 @@ from django.contrib.sites.shortcuts import get_current_site
from django.db.models import Prefetch
from django.http import HttpResponseRedirect
from django.urls import reverse
from accounts.models import User, PasswordReset
from accounts.models import User, PasswordReset, TopList, EmailVerification
from reviews.models import Review
from email_service.services import EmailService
from allauth.account.views import LoginView, SignupView
@@ -101,16 +101,8 @@ class ProfileView(DetailView):
context['recent_reviews'] = reviews_queryset
# Get user's top lists with optimized queries
context['top_lists'] = user.top_lists.select_related(
'user',
'user__profile'
).prefetch_related(
Prefetch('items', queryset=(
user.top_lists.through.objects.select_related(
'content_type'
).prefetch_related('content_object')
))
).order_by('-created_at')[:5]
top_lists_queryset = TopList.objects.filter(user=user).select_related('user', 'user__profile').prefetch_related('items')
context['top_lists'] = top_lists_queryset.order_by('-created_at')[:5]
return context
@@ -128,8 +120,7 @@ class SettingsView(LoginRequiredMixin, TemplateView):
if action == 'update_profile':
# Handle profile updates
user = request.user
user.first_name = request.POST.get('first_name', user.first_name)
user.last_name = request.POST.get('last_name', user.last_name)
user.profile.display_name = request.POST.get('display_name', user.profile.display_name)
if 'avatar' in request.FILES:
user.profile.avatar = request.FILES['avatar']
@@ -150,7 +141,37 @@ class SettingsView(LoginRequiredMixin, TemplateView):
return HttpResponseRedirect(reverse('account_login'))
else:
messages.error(request, 'Current password is incorrect')
elif action == 'change_email':
# Handle email change with verification
new_email = request.POST.get('new_email')
if new_email:
token = get_random_string(64)
EmailVerification.objects.update_or_create(
user=request.user,
defaults={'token': token}
)
site = get_current_site(request)
verification_url = reverse('verify_email', kwargs={'token': token})
context = {
'user': request.user,
'verification_url': verification_url,
'site_name': site.name,
}
email_html = render_to_string('accounts/email/verify_email.html', context)
EmailService.send_email(
to=new_email,
subject='Verify your new email address',
text='Click the link to verify your new email address',
site=site,
html=email_html
)
request.user.pending_email = new_email
request.user.save()
messages.success(request, 'Verification email sent to your new email address')
else:
messages.error(request, 'New email is required')
return self.get(request, *args, **kwargs)
def request_password_reset(request):