from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth import login from django.contrib.auth.decorators import login_required from django.views.generic import CreateView, ListView, DetailView, UpdateView, DeleteView, View from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.http import JsonResponse from .models import Item, Favorite from .forms import CustomUserCreationForm class RegisterView(CreateView): form_class = CustomUserCreationForm template_name = 'registration/register.html' success_url = reverse_lazy('item_list') def form_valid(self, form): response = super().form_valid(form) login(self.request, self.object) return response class AuctioneerRequiredMixin(UserPassesTestMixin): def test_func(self): return self.request.user.is_authenticated and self.request.user.is_auctioneer class ItemListView(LoginRequiredMixin, ListView): model = Item template_name = 'raffle/item_list.html' context_object_name = 'items' def get_queryset(self): qs = super().get_queryset() favorites_only = self.request.GET.get('favorites') if favorites_only == '1': return qs.filter(favorited_by__user=self.request.user) return qs def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) user_favorites = Favorite.objects.filter(user=self.request.user).values_list('item_id', flat=True) context['user_favorites'] = list(user_favorites) return context class ItemCreateView(AuctioneerRequiredMixin, CreateView): model = Item fields = ['item_number', 'title', 'description', 'picture'] template_name = 'raffle/item_form.html' success_url = reverse_lazy('item_list') class ItemUpdateView(AuctioneerRequiredMixin, UpdateView): model = Item fields = ['item_number', 'title', 'description', 'picture'] template_name = 'raffle/item_form.html' success_url = reverse_lazy('item_list') class ItemDeleteView(AuctioneerRequiredMixin, DeleteView): model = Item template_name = 'raffle/item_confirm_delete.html' success_url = reverse_lazy('item_list') class ItemDetailView(AuctioneerRequiredMixin, DetailView): model = Item template_name = 'raffle/item_detail.html' context_object_name = 'item' class ToggleFavoriteView(LoginRequiredMixin, View): def post(self, request, pk): try: item = Item.objects.get(pk=pk) favorite, created = Favorite.objects.get_or_create(user=request.user, item=item) if not created: favorite.delete() is_favorite = False else: is_favorite = True # Count how many favorited count = item.favorited_by.count() return JsonResponse({'status': 'success', 'is_favorite': is_favorite, 'count': count}) except Item.DoesNotExist: return JsonResponse({'status': 'error', 'message': 'Item not found'}, status=404)