134 lines
3.5 KiB
Python
134 lines
3.5 KiB
Python
from django.db import models
|
|
from django.core.validators import FileExtensionValidator
|
|
|
|
class BenchcoachModel(models.Model):
|
|
pass
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class Team(BenchcoachModel):
|
|
name = models.CharField(max_length=50)
|
|
image = models.FileField(
|
|
upload_to="images/",
|
|
validators=[FileExtensionValidator(["jpg", "png", "svg"])],
|
|
null=True,
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.name}"
|
|
|
|
|
|
class Venue(BenchcoachModel):
|
|
name = models.CharField(max_length=50)
|
|
|
|
def __str__(self):
|
|
return f"{self.name}"
|
|
|
|
|
|
class Event(BenchcoachModel):
|
|
start = models.DateTimeField(null=True)
|
|
venue = models.ForeignKey(Venue, null=True, on_delete=models.CASCADE)
|
|
home_team = models.ForeignKey(
|
|
Team, null=True, on_delete=models.CASCADE, related_name="home_team"
|
|
)
|
|
away_team = models.ForeignKey(
|
|
Team, null=True, on_delete=models.CASCADE, related_name="away_team"
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.start:%Y-%m-%d %H:%M}"
|
|
|
|
|
|
class Season(BenchcoachModel):
|
|
name = models.CharField(max_length=50)
|
|
|
|
|
|
class Player(BenchcoachModel):
|
|
first_name = models.CharField(max_length=200)
|
|
last_name = models.CharField(max_length=200)
|
|
jersey_number = models.IntegerField(null=True)
|
|
team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE)
|
|
|
|
def __str__(self):
|
|
return f"{self.last_name}, {self.first_name}"
|
|
|
|
class Meta:
|
|
unique_together = (
|
|
"first_name",
|
|
"last_name",
|
|
)
|
|
|
|
|
|
class StatLine(BenchcoachModel):
|
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
|
batting_avg = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
|
onbase_pct = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
|
slugging_pct = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
|
|
|
def __str__(self):
|
|
return f"{self.slash_line}"
|
|
|
|
@property
|
|
def slash_line(self):
|
|
return "/".join(
|
|
[
|
|
f"{self.batting_avg:.3f}".lstrip("0"),
|
|
f"{self.onbase_pct:.3f}".lstrip("0"),
|
|
f"{self.slugging_pct:.3f}".replace("0.", "."),
|
|
]
|
|
)
|
|
|
|
|
|
class Positioning(BenchcoachModel):
|
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
|
positions = [
|
|
("EH", "EH"),
|
|
("P", "P"),
|
|
("C", "C"),
|
|
("1B", "1B"),
|
|
("2B", "2B"),
|
|
("3B", "3B"),
|
|
("SS", "SS"),
|
|
("LF", "LF"),
|
|
("CF", "CF"),
|
|
("RF", "RF"),
|
|
("DH", "DH"),
|
|
]
|
|
position = models.CharField(
|
|
choices=positions, default=None, max_length=2, null=True, blank=True
|
|
)
|
|
order = models.PositiveSmallIntegerField(default=None, null=True, blank=True)
|
|
|
|
class Meta:
|
|
unique_together = (
|
|
"player",
|
|
"event",
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.player}; {self.event};"
|
|
|
|
|
|
class Availability(BenchcoachModel):
|
|
YES = 2
|
|
MAYBE = 1
|
|
NO = 0
|
|
UNKNOWN = -1
|
|
|
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
|
choices = [(YES, "Yes"), (NO, "No"), (MAYBE, "Maybe"), (UNKNOWN, "Unknown")]
|
|
available = models.IntegerField(choices=choices, default=UNKNOWN)
|
|
|
|
def __str__(self):
|
|
return f"{self.event}; {self.player}; {self.available}"
|
|
|
|
class Meta:
|
|
unique_together = (
|
|
"event",
|
|
"player",
|
|
)
|
|
verbose_name_plural = "availabilities"
|