191 lines
6.8 KiB
Python
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')
|