Files
Example-TCG-Site/users/views.py
2026-01-20 05:22:38 -06:00

140 lines
5.0 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import login
from .forms import CustomUserCreationForm, ProfileForm, AddressForm, PaymentMethodForm
from django.views.generic import CreateView
from django.urls import reverse_lazy
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import User, Address, PaymentMethod
from store.models import VaultItem, Set, Card
class RegisterView(CreateView):
model = User
form_class = CustomUserCreationForm
template_name = 'users/register.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('home')
@login_required
def profile_view(request):
if request.method == 'POST':
form = ProfileForm(request.POST, instance=request.user.profile)
if form.is_valid():
form.save()
messages.success(request, 'Profile updated successfully.')
return redirect('users:profile')
else:
form = ProfileForm(instance=request.user.profile)
# Order filtering
orders = request.user.orders.all().order_by('-created_at')
date_query = request.GET.get('date')
if date_query:
orders = orders.filter(created_at__date=date_query)
addresses = request.user.addresses.all()
payment_methods = request.user.payment_methods.all()
return render(request, 'users/profile.html', {
'user': request.user,
'form': form,
'orders': orders,
'date_query': date_query,
'addresses': addresses,
'payment_methods': payment_methods,
})
@login_required
def upgrade_account_view(request):
if request.method == 'POST':
# Mock payment processing would go here
profile = request.user.profile
profile.is_pro = True
profile.save()
messages.success(request, 'Account upgraded to Pro!')
return redirect('users:profile')
return redirect('users:profile')
@login_required
def add_address_view(request):
if request.method == 'POST':
form = AddressForm(request.POST)
if form.is_valid():
address = form.save(commit=False)
address.user = request.user
if address.is_default:
# Unset previous default
Address.objects.filter(user=request.user, address_type=address.address_type, is_default=True).update(is_default=False)
address.save()
messages.success(request, 'Address added successfully.')
return redirect('users:profile')
else:
form = AddressForm()
return render(request, 'users/address_form.html', {'form': form})
@login_required
def delete_address_view(request, pk):
address = get_object_or_404(Address, pk=pk, user=request.user)
if request.method == 'POST':
address.delete()
messages.success(request, 'Address deleted.')
return redirect('users:profile')
@login_required
def add_payment_method_view(request):
if request.method == 'POST':
form = PaymentMethodForm(request.POST)
if form.is_valid():
pm = form.save(commit=False)
pm.user = request.user
if pm.is_default:
PaymentMethod.objects.filter(user=request.user, is_default=True).update(is_default=False)
pm.save()
messages.success(request, 'Payment method added successfully.')
return redirect('users:profile')
else:
form = PaymentMethodForm()
return render(request, 'users/payment_form.html', {'form': form})
@login_required
def delete_payment_method_view(request, pk):
pm = get_object_or_404(PaymentMethod, pk=pk, user=request.user)
if request.method == 'POST':
pm.delete()
messages.success(request, 'Payment method deleted.')
return redirect('users:profile')
@login_required
def vault_view(request):
vault_items = VaultItem.objects.filter(user=request.user).select_related('card', 'card__set').order_by('-added_at')
# Filtering
set_id = request.GET.get('set')
rarity = request.GET.get('rarity')
if set_id:
vault_items = vault_items.filter(card__set_id=set_id)
if rarity:
vault_items = vault_items.filter(card__rarity=rarity)
total_cards = sum(item.quantity for item in vault_items)
# Get options for filters
# We only want sets and rarities that are actually in the user's vault
user_card_ids = VaultItem.objects.filter(user=request.user).values_list('card_id', flat=True)
available_sets = Set.objects.filter(cards__id__in=user_card_ids).distinct()
available_rarities = Card.objects.filter(id__in=user_card_ids).values_list('rarity', flat=True).distinct()
return render(request, 'users/vault.html', {
'vault_items': vault_items,
'total_cards': total_cards,
'available_sets': available_sets,
'available_rarities': available_rarities,
'current_set': int(set_id) if set_id else None,
'current_rarity': rarity
})