Files
vrobbler/vrobbler/apps/webpages/views.py
Colin Powell 6fde9ec8d2
All checks were successful
build / test (push) Successful in 1m59s
[webpages] Add autotagging to webpages
2026-06-18 10:43:21 -04:00

135 lines
5.0 KiB
Python

import datetime
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.paginator import Paginator
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from django.urls import reverse
from django.utils import timezone
from django.views import generic
from scrobbles.models import Scrobble
from scrobbles.views import ScrobbleableDetailView, ScrobbleableListView
from webpages.forms import WebPageReadForm
from webpages.models import WebPage
class WebPageListView(ScrobbleableListView):
model = WebPage
def get_queryset(self):
queryset = super().get_queryset()
tag_name = self.request.GET.get("tag")
if tag_name:
from django.contrib.contenttypes.models import ContentType
from taggit.models import TaggedItem
ct = ContentType.objects.get_for_model(WebPage)
webpages = TaggedItem.objects.filter(
content_type=ct,
tag__name__iexact=tag_name,
).values_list("object_id", flat=True)
queryset = queryset.filter(pk__in=webpages)
return queryset
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
context_data["active_tag"] = self.request.GET.get("tag", "")
user = self.request.user
now = timezone.now()
start_day_of_week = now - datetime.timedelta(days=now.weekday())
start_day_of_month = now.replace(day=1)
scrobbles_this_week = Scrobble.objects.filter(
user=user,
web_page__isnull=False,
timestamp__gte=start_day_of_week,
).select_related("web_page", "web_page__domain")
scrobbles_this_month = Scrobble.objects.filter(
user=user,
web_page__isnull=False,
timestamp__gte=start_day_of_month,
).select_related("web_page", "web_page__domain")
domains_this_week = {}
for scrobble in scrobbles_this_week:
domain = scrobble.web_page.domain
if domain:
domains_this_week[domain.id] = {
"domain": domain,
"count": domains_this_week.get(domain.id, {}).get("count", 0) + 1,
}
domains_this_month = {}
for scrobble in scrobbles_this_month:
domain = scrobble.web_page.domain
if domain:
domains_this_month[domain.id] = {
"domain": domain,
"count": domains_this_month.get(domain.id, {}).get("count", 0) + 1,
}
domains_week_sorted = sorted(
domains_this_week.values(), key=lambda x: x["count"], reverse=True
)
domains_month_sorted = sorted(
domains_this_month.values(), key=lambda x: x["count"], reverse=True
)
domain_page = self.request.GET.get("domain_page", 1)
context_data["domains_this_week"] = Paginator(domains_week_sorted, 10).page(
domain_page
)
context_data["domains_this_month"] = Paginator(domains_month_sorted, 10).page(
domain_page
)
context_data["domain_page"] = int(domain_page)
context_data["domain_paginator"] = Paginator(domains_week_sorted, 10)
return context_data
class WebPageDetailView(ScrobbleableDetailView):
model = WebPage
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.user.is_authenticated:
latest = self.object.scrobbles(self.request.user).first()
if latest:
context["latest_scrobble_uuid"] = str(latest.uuid)
notes = latest.log.get("notes", []) if latest.log else []
context["latest_scrobble_notes"] = notes
context["latest_scrobble_notes_html"] = latest.logdata.notes_as_html()
context["article_length"] = (
len(self.object.extract) if self.object.extract else 0
)
return context
class WebPageReadView(LoginRequiredMixin, generic.edit.FormView, generic.DetailView):
model = WebPage
slug_field = "uuid"
template_name = "webpages/webpage_read.html"
form_class = WebPageReadForm
def get(self, *args, **kwargs):
user = self.request.user
webpage = WebPage.objects.get(uuid=kwargs.get("slug"))
latest_scrobble = webpage.scrobbles(user).last()
if latest_scrobble.played_to_completion:
redirect(reverse("webpages:webpage_detail", kwargs={"slug": webpage.uuid}))
return super().get(*args, **kwargs)
def form_valid(self, *args):
user = self.request.user
webpage = WebPage.objects.get(uuid=self.kwargs.get("slug"))
latest_scrobble = webpage.scrobbles(user).last()
if not latest_scrobble.played_to_completion:
latest_scrobble.stop()
latest_scrobble.log["notes"] = self.request.POST.get("notes")
latest_scrobble.save(update_fields=["log"])
return HttpResponseRedirect(webpage.url)