[people] Add rough scrobble count field for sorting
This commit is contained in:
9
vrobbler/apps/people/apps.py
Normal file
9
vrobbler/apps/people/apps.py
Normal file
@ -0,0 +1,9 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class PeopleConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "people"
|
||||
|
||||
def ready(self):
|
||||
import people.signals # noqa
|
||||
0
vrobbler/apps/people/management/__init__.py
Normal file
0
vrobbler/apps/people/management/__init__.py
Normal file
@ -0,0 +1,15 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from people.models import Person
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Backfill scrobble counts for all people"
|
||||
|
||||
def handle(self, *args, **options):
|
||||
for person in Person.objects.all():
|
||||
person.update_scrobble_count()
|
||||
self.stdout.write(
|
||||
f"{person.name}: {person.scrobble_count} scrobbles"
|
||||
)
|
||||
self.stdout.write(self.style.SUCCESS("Done!"))
|
||||
18
vrobbler/apps/people/migrations/0004_add_scrobble_count.py
Normal file
18
vrobbler/apps/people/migrations/0004_add_scrobble_count.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.29 on 2026-03-21 15:20
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("people", "0003_person_created_by"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="person",
|
||||
name="scrobble_count",
|
||||
field=models.IntegerField(default=0),
|
||||
),
|
||||
]
|
||||
@ -11,13 +11,27 @@ class Person(TimeStampedModel):
|
||||
|
||||
user = models.ForeignKey(User, on_delete=models.DO_NOTHING, **BNULL)
|
||||
created_by = models.ForeignKey(
|
||||
User, on_delete=models.DO_NOTHING, **BNULL, related_name="created_people"
|
||||
User,
|
||||
on_delete=models.DO_NOTHING,
|
||||
**BNULL,
|
||||
related_name="created_people",
|
||||
)
|
||||
name = models.CharField(max_length=100, **BNULL)
|
||||
bgstats_id = models.UUIDField(**BNULL)
|
||||
bgg_username = models.CharField(max_length=100, **BNULL)
|
||||
lichess_username = models.CharField(max_length=100, **BNULL)
|
||||
bio = models.TextField(**BNULL)
|
||||
scrobble_count = models.IntegerField(default=0)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def update_scrobble_count(self):
|
||||
from scrobbles.models import Scrobble
|
||||
|
||||
count = Scrobble.objects.filter(
|
||||
user=self.created_by,
|
||||
log__with_people_ids__contains=self.id,
|
||||
).count()
|
||||
self.scrobble_count = count
|
||||
self.save(update_fields=["scrobble_count"])
|
||||
|
||||
28
vrobbler/apps/people/signals.py
Normal file
28
vrobbler/apps/people/signals.py
Normal file
@ -0,0 +1,28 @@
|
||||
from django.db.models.signals import post_save, post_delete
|
||||
from django.dispatch import receiver
|
||||
|
||||
from scrobbles.models import Scrobble
|
||||
|
||||
|
||||
@receiver(post_save, sender=Scrobble)
|
||||
def update_person_scrobble_count_on_save(sender, instance, **kwargs):
|
||||
if instance.log and isinstance(instance.log, dict):
|
||||
person_ids = instance.log.get("with_people_ids", [])
|
||||
for person_id in person_ids:
|
||||
from people.models import Person
|
||||
|
||||
person = Person.objects.filter(id=person_id).first()
|
||||
if person:
|
||||
person.update_scrobble_count()
|
||||
|
||||
|
||||
@receiver(post_delete, sender=Scrobble)
|
||||
def update_person_scrobble_count_on_delete(sender, instance, **kwargs):
|
||||
if instance.log and isinstance(instance.log, dict):
|
||||
person_ids = instance.log.get("with_people_ids", [])
|
||||
for person_id in person_ids:
|
||||
from people.models import Person
|
||||
|
||||
person = Person.objects.filter(id=person_id).first()
|
||||
if person:
|
||||
person.update_scrobble_count()
|
||||
@ -5,7 +5,9 @@ app_name = "people"
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path("people/", views.PersonCreateUpdateView.as_view(), name="person_form"),
|
||||
path(
|
||||
"people/", views.PersonCreateUpdateView.as_view(), name="person_form"
|
||||
),
|
||||
path(
|
||||
"people/<int:pk>/edit/",
|
||||
views.PersonUpdateView.as_view(),
|
||||
|
||||
@ -17,7 +17,9 @@ class PersonCreateUpdateView(generic.CreateView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context_data = super().get_context_data(**kwargs)
|
||||
context_data["people"] = Person.objects.filter(created_by=self.request.user)
|
||||
context_data["people"] = Person.objects.filter(
|
||||
created_by=self.request.user
|
||||
).order_by("-scrobble_count", "name")
|
||||
return context_data
|
||||
|
||||
def form_valid(self, form):
|
||||
@ -33,5 +35,7 @@ class PersonUpdateView(generic.UpdateView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context_data = super().get_context_data(**kwargs)
|
||||
context_data["people"] = Person.objects.filter(created_by=self.request.user)
|
||||
context_data["people"] = Person.objects.filter(
|
||||
created_by=self.request.user
|
||||
).order_by("-scrobble_count", "name")
|
||||
return context_data
|
||||
|
||||
@ -110,6 +110,9 @@
|
||||
{% for person in people %}
|
||||
<li>
|
||||
<span class="person-name">{{ person.name }}</span>
|
||||
{% if person.scrobble_count > 0 %}
|
||||
<small class="text-muted">({{ person.scrobble_count }} scrobbles)</small>
|
||||
{% endif %}
|
||||
<span class="person-links">
|
||||
<a href="{% url 'people:person_edit' person.pk %}">Edit</a>
|
||||
</span>
|
||||
|
||||
Reference in New Issue
Block a user