[scrobbles] Add dynamic forms for LogData classes
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user