Files
Example-TCG-Site/users/views.py
Ryan Westfall 739d136209 Last bit of major changes
Closes #1
Closes #5
Closes #6
Closes #8
Closes #9
Closes #10
2026-01-26 04:11:38 -06:00

191 lines
6.8 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse
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('users:login_success')
def form_valid(self, form):
user = form.save()
# Create Buyer profile for every new user registered via this form
from .models import Buyer
Buyer.objects.create(user=user)
login(self.request, user)
return redirect('users:login_success')
@login_required
def seller_dashboard_view(request):
return render(request, 'users/seller_dashboard.html')
@login_required
def login_success_view(request):
if hasattr(request.user, 'profile') and request.user.profile.is_seller:
return redirect('store:seller_dashboard')
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 = []
if hasattr(request.user, 'buyer_profile'):
orders = request.user.buyer_profile.orders.all().order_by('-created_at')
date_query = request.GET.get('date')
if date_query and orders:
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, user=request.user)
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(user=request.user)
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):
if not hasattr(request.user, 'buyer_profile'):
# If not a buyer (e.g. seller), maybe show empty or redirect?
# For now, let's just show empty list
vault_items = VaultItem.objects.none()
else:
vault_items = VaultItem.objects.filter(buyer=request.user.buyer_profile).select_related('card', 'card__set').order_by('-added_at')
# Filtering
set_id = request.GET.get('set')
rarity = request.GET.get('rarity')
search_query = request.GET.get('q')
if search_query:
vault_items = vault_items.filter(card__name__icontains=search_query)
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
if hasattr(request.user, 'buyer_profile'):
user_card_ids = VaultItem.objects.filter(buyer=request.user.buyer_profile).values_list('card_id', flat=True)
else:
user_card_ids = []
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,
'search_query': search_query
})
@login_required
def vault_autocomplete(request):
if not hasattr(request.user, 'buyer_profile'):
return JsonResponse({'results': []})
query = request.GET.get('q', '')
if len(query) < 2:
return JsonResponse({'results': []})
# Filter items in user's vault matching the query
items = VaultItem.objects.filter(
buyer=request.user.buyer_profile,
card__name__icontains=query
).values_list('card__name', flat=True).distinct()[:10]
return JsonResponse({'results': list(items)})
def sell_on_tcgkof_view(request):
return render(request, 'users/sell_on_tcgkof.html')