85 lines
3.9 KiB
Python
85 lines
3.9 KiB
Python
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")
|