Files
hoopscout-v2/app/scouting/forms.py

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")