81 lines
3.1 KiB
Python
81 lines
3.1 KiB
Python
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)
|