[scrobbles] Add dynamic forms for LogData classes

This commit is contained in:
2025-08-17 12:37:06 -04:00
parent 1093aa2376
commit 52494651bf
20 changed files with 352 additions and 28 deletions

View File

@ -3,9 +3,10 @@ from dataclasses import asdict, dataclass
from typing import Optional
from dataclass_wizard import JSONWizard
from django import forms
from django.contrib.auth import get_user_model
from locations.models import GeoLocation
from people.models import Person
from scrobbles.forms import form_from_dataclass
User = get_user_model()
@ -35,6 +36,16 @@ class BaseLogData(JSONDataclass):
description: Optional[str] = None
notes: Optional[list[str]] = None
_excluded_fields = {}
@classmethod
def form(cls):
return form_from_dataclass(cls)
@classmethod
def override_fields(cls) -> dict:
return {}
@dataclass
class LongPlayLogData(JSONDataclass):
@ -55,3 +66,20 @@ class WithPeopleLogData(JSONDataclass):
Person.objects.filter(id=pid).first()
for pid in self.with_people_ids
]
@classmethod
def override_fields(cls) -> dict:
fields = {}
for base in cls.mro()[1:]:
if hasattr(base, "override_fields"):
base_fields = base.override_fields()
fields.update(base_fields)
custom_fields = {
"with_people_ids": forms.ModelMultipleChoiceField(
queryset=Person.objects.all(),
required=False,
widget=forms.SelectMultiple(attrs={"size": 10}),
)
}
fields.update(custom_fields)
return fields