views.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.contrib.auth.mixins import LoginRequiredMixin
  2. from django.db.models import Count
  3. from django.http import HttpResponseRedirect
  4. from django.shortcuts import redirect
  5. from django.urls import reverse
  6. from django.views import generic
  7. from webpages.forms import WebPageReadForm
  8. from webpages.models import WebPage
  9. class WebPageListView(LoginRequiredMixin, generic.ListView):
  10. model = WebPage
  11. paginate_by = 20
  12. def get_queryset(self):
  13. return (
  14. super()
  15. .get_queryset()
  16. .annotate(scrobble_count=Count("scrobble"))
  17. .order_by("-scrobble_count")
  18. )
  19. class WebPageDetailView(LoginRequiredMixin, generic.DetailView):
  20. model = WebPage
  21. slug_field = "uuid"
  22. def get_context_data(self, **kwargs):
  23. user = self.request.user
  24. context_data = super().get_context_data(**kwargs)
  25. context_data["scrobbles"] = self.object.scrobbles(user)
  26. return context_data
  27. class WebPageReadView(
  28. LoginRequiredMixin, generic.edit.FormView, generic.DetailView
  29. ):
  30. model = WebPage
  31. slug_field = "uuid"
  32. template_name = "webpages/webpage_read.html"
  33. form_class = WebPageReadForm
  34. def get(self, *args, **kwargs):
  35. user = self.request.user
  36. webpage = WebPage.objects.get(uuid=kwargs.get("slug"))
  37. latest_scrobble = webpage.scrobbles(user).last()
  38. if latest_scrobble.played_to_completion:
  39. redirect(
  40. reverse(
  41. "webpages:webpage-detail", kwargs={"slug": webpage.uuid}
  42. )
  43. )
  44. return super().get(*args, **kwargs)
  45. def form_valid(self, *args):
  46. user = self.request.user
  47. webpage = WebPage.objects.get(uuid=self.kwargs.get("slug"))
  48. latest_scrobble = webpage.scrobbles(user).last()
  49. if not latest_scrobble.played_to_completion:
  50. latest_scrobble.stop()
  51. latest_scrobble.log["notes"] = self.request.POST.get("notes")
  52. latest_scrobble.save(update_fields=["log"])
  53. return HttpResponseRedirect(webpage.url)