[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)
|
user = models.ForeignKey(User, on_delete=models.DO_NOTHING, **BNULL)
|
||||||
created_by = models.ForeignKey(
|
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)
|
name = models.CharField(max_length=100, **BNULL)
|
||||||
bgstats_id = models.UUIDField(**BNULL)
|
bgstats_id = models.UUIDField(**BNULL)
|
||||||
bgg_username = models.CharField(max_length=100, **BNULL)
|
bgg_username = models.CharField(max_length=100, **BNULL)
|
||||||
lichess_username = models.CharField(max_length=100, **BNULL)
|
lichess_username = models.CharField(max_length=100, **BNULL)
|
||||||
bio = models.TextField(**BNULL)
|
bio = models.TextField(**BNULL)
|
||||||
|
scrobble_count = models.IntegerField(default=0)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
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 = [
|
urlpatterns = [
|
||||||
path("people/", views.PersonCreateUpdateView.as_view(), name="person_form"),
|
path(
|
||||||
|
"people/", views.PersonCreateUpdateView.as_view(), name="person_form"
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"people/<int:pk>/edit/",
|
"people/<int:pk>/edit/",
|
||||||
views.PersonUpdateView.as_view(),
|
views.PersonUpdateView.as_view(),
|
||||||
|
|||||||
@ -17,7 +17,9 @@ class PersonCreateUpdateView(generic.CreateView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context_data = super().get_context_data(**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
|
return context_data
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
@ -33,5 +35,7 @@ class PersonUpdateView(generic.UpdateView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context_data = super().get_context_data(**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
|
return context_data
|
||||||
|
|||||||
@ -110,6 +110,9 @@
|
|||||||
{% for person in people %}
|
{% for person in people %}
|
||||||
<li>
|
<li>
|
||||||
<span class="person-name">{{ person.name }}</span>
|
<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">
|
<span class="person-links">
|
||||||
<a href="{% url 'people:person_edit' person.pk %}">Edit</a>
|
<a href="{% url 'people:person_edit' person.pk %}">Edit</a>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user