from django.core.paginator import Paginator from django.shortcuts import get_object_or_404, redirect, render from django.views.generic import DetailView, ListView, TemplateView from .models import Album, Photo, Redir class Main(TemplateView): template_name = "gallery/main.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) session_expiry = self.request.session.get_expiry_date() context['session_expiry'] = session_expiry return context class AlbumsList(ListView): model = Album template_name = 'gallery/album_list.html' queryset = Album.objects.filter(is_public=True) ordering = ['-album_date'] paginate_by = 30 class AlbumDetail(DetailView): model = Album template_name = 'gallery/album_detail.html' def get_object(self, queryset=None): return get_object_or_404(Album, slug=self.kwargs.get('album_slug')) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) photos = self.object.photos.all().order_by('taken_at') # Pagination paginator = Paginator(photos, 30) page_number = self.request.GET.get('page') page_obj = paginator.get_page(page_number) # Return context['photos'] = page_obj.object_list context['page_obj'] = page_obj return context class PhotosList(ListView): model = Photo paginate_by = 30 ordering = ['-taken_at'] class PhotoDetail(DetailView): model = Photo slug_url_kwarg = 'photo_slug' template_name = 'gallery/photo_detail.html' def get_object(self, queryset=None): album_slug = self.kwargs.get('album_slug') photo_slug = self.kwargs.get('photo_slug') photo = get_object_or_404(Photo, slug=photo_slug, album__slug=album_slug) if photo.slug not in self.request.session: photo.add_view() self.request.session[photo.slug] = 0 return photo def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) context["next"] = self.object.get_next() context["prev"] = self.object.get_prev() return context def post(self, request, *args, **kwargs): photo = self.get_object() if request.POST.get("like") == "true": if self.request.session.get(photo.slug) == 0: photo.add_like() self.request.session[photo.slug] = 1 if request.user.is_authenticated: photo.is_favorite = True photo.save() return redirect('gallery:photo_url', album_slug=self.kwargs['album_slug'], photo_slug=self.kwargs['photo_slug']) def redirect_to_album(request, redir_path): redir = get_object_or_404(Redir, path=redir_path) return redirect('gallery:album_url', album_slug=redir.album.slug)