consolidated objects into one benchcoach app

created benchcoachproject app to contain all the settings and stuff
some other changes that got grouped with this commit is the adding the ApiObject to the TeamSnap object model
This commit is contained in:
2021-12-21 17:14:52 -06:00
parent e9f91126e5
commit 95697ef4fe
174 changed files with 5351 additions and 16551 deletions

View File

@@ -1,18 +1,128 @@
from django.db import models
from teamsnap.models import User as TeamsnapUser, Team as TeamsnapTeam
from django.contrib.auth.models import User
from django.core.validators import FileExtensionValidator
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT / user_<id>/<filename>
return 'benchcoach/static/user_files/user_{0}/{1}'.format(instance.user.id, filename)
class Team(models.Model):
name = models.CharField(max_length=50)
image = models.FileField(
upload_to="images/",
validators=[FileExtensionValidator(["jpg", "png", "svg"])],
null=True,
)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
teamsnap_access_token = models.CharField(null=True, max_length=50)
teamsnap_user = models.ForeignKey(TeamsnapUser, on_delete=models.CASCADE, null=True, blank=True)
avatar = models.ImageField(upload_to="avatar", null=True, blank=True)
def __str__(self):
return f"{self.name}"
class TeamsnapSettings(models.Model):
user = models.OneToOneField(Profile, on_delete=models.CASCADE)
managed_team = models.ForeignKey(TeamsnapTeam, on_delete=models.CASCADE)
class Venue(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return f"{self.name}"
class Event(models.Model):
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(models.Model):
name = models.CharField(max_length=50)
class Player(models.Model):
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(models.Model):
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(models.Model):
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(models.Model):
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"