from __future__ import annotations from datetime import date from django import forms from .models import Competition, Role, Season, Specialty, Team class PlayerSearchForm(forms.Form): SORT_CHOICES = [ ("name_asc", "Name (A-Z)"), ("name_desc", "Name (Z-A)"), ("age_youngest", "Age (youngest first)"), ("height_desc", "Height (tallest first)"), ("weight_desc", "Weight (heaviest first)"), ("points_desc", "Matching context points (high to low)"), ("assists_desc", "Matching context assists (high to low)"), ("ts_pct_desc", "Matching context TS% (high to low)"), ("blocks_desc", "Matching context blocks (high to low)"), ] name = forms.CharField(required=False, label="Name") sort = forms.ChoiceField(required=False, choices=SORT_CHOICES, initial="name_asc") position = forms.ChoiceField( required=False, choices=[("", "Any")] + [ ("PG", "PG"), ("SG", "SG"), ("SF", "SF"), ("PF", "PF"), ("C", "C"), ], ) role = forms.ModelChoiceField(required=False, queryset=Role.objects.none()) specialty = forms.ModelChoiceField(required=False, queryset=Specialty.objects.none()) min_age = forms.IntegerField(required=False, min_value=0) max_age = forms.IntegerField(required=False, min_value=0) min_height_cm = forms.DecimalField(required=False, max_digits=5, decimal_places=2) max_height_cm = forms.DecimalField(required=False, max_digits=5, decimal_places=2) min_weight_kg = forms.DecimalField(required=False, max_digits=5, decimal_places=2) max_weight_kg = forms.DecimalField(required=False, max_digits=5, decimal_places=2) min_wingspan_cm = forms.DecimalField(required=False, max_digits=5, decimal_places=2) max_wingspan_cm = forms.DecimalField(required=False, max_digits=5, decimal_places=2) competition = forms.ModelChoiceField(required=False, queryset=Competition.objects.none()) season = forms.ModelChoiceField(required=False, queryset=Season.objects.none()) team = forms.ModelChoiceField(required=False, queryset=Team.objects.none()) min_points = forms.DecimalField(required=False, max_digits=6, decimal_places=2) min_assists = forms.DecimalField(required=False, max_digits=6, decimal_places=2) min_steals = forms.DecimalField(required=False, max_digits=6, decimal_places=2) max_turnovers = forms.DecimalField(required=False, max_digits=6, decimal_places=2) min_blocks = forms.DecimalField(required=False, max_digits=6, decimal_places=2) min_efg_pct = forms.DecimalField(required=False, max_digits=5, decimal_places=2) min_ts_pct = forms.DecimalField(required=False, max_digits=5, decimal_places=2) min_plus_minus = forms.DecimalField(required=False, max_digits=7, decimal_places=2) min_offensive_rating = forms.DecimalField(required=False, max_digits=7, decimal_places=2) max_defensive_rating = forms.DecimalField(required=False, max_digits=7, decimal_places=2) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["role"].queryset = Role.objects.order_by("name") self.fields["specialty"].queryset = Specialty.objects.order_by("name") self.fields["competition"].queryset = Competition.objects.order_by("name") self.fields["season"].queryset = Season.objects.order_by("-start_year") self.fields["team"].queryset = Team.objects.order_by("name") @staticmethod def birth_date_upper_bound_for_age(min_age: int) -> date: today = date.today() return today.replace(year=today.year - min_age) @staticmethod def birth_date_lower_bound_for_age(max_age: int) -> date: today = date.today() return today.replace(year=today.year - max_age - 1) class SavedSearchForm(forms.Form): saved_search_name = forms.CharField(required=True, max_length=120, label="Save current search as")