from django import forms from django.urls import reverse from common.utils import safe_getattr from games.models import Device, Game, Platform, Purchase, Session custom_date_widget = forms.DateInput(attrs={"type": "date"}) custom_datetime_widget = forms.DateTimeInput( attrs={"type": "datetime-local"}, format="%Y-%m-%d %H:%M" ) autofocus_input_widget = forms.TextInput(attrs={"autofocus": "autofocus"}) class SessionForm(forms.ModelForm): game = forms.ModelChoiceField( queryset=Game.objects.order_by("sort_name"), widget=forms.Select(attrs={"autofocus": "autofocus"}), ) device = forms.ModelChoiceField(queryset=Device.objects.order_by("name")) class Meta: widgets = { "timestamp_start": custom_datetime_widget, "timestamp_end": custom_datetime_widget, } model = Session fields = [ "game", "timestamp_start", "timestamp_end", "duration_manual", "emulated", "device", "note", ] class GameChoiceField(forms.ModelMultipleChoiceField): def label_from_instance(self, obj) -> str: return f"{obj.sort_name} ({obj.platform}, {obj.year_released})" class IncludePlatformSelect(forms.SelectMultiple): def create_option(self, name, value, *args, **kwargs): option = super().create_option(name, value, *args, **kwargs) if platform_id := safe_getattr(value, "instance.platform.id"): option["attrs"]["data-platform"] = platform_id return option class PurchaseForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Automatically update related_purchase