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 })