137 lines
4.8 KiB
Python
137 lines
4.8 KiB
Python
from django.db import models
|
|
|
|
import lineups.models
|
|
import teams.models
|
|
import venues.models
|
|
import players.models
|
|
import events.models
|
|
|
|
class TeamsnapBaseModel(models.Model):
|
|
type = None
|
|
id = models.CharField(max_length=50, unique=True, primary_key=True)
|
|
name = models.CharField(max_length=50, null=True)
|
|
created_at = models.DateTimeField(null=True)
|
|
updated_at = models.DateTimeField(null=True)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
def __str__(self):
|
|
return f"TeamSnap {self.__class__.__name__} Object ({self.id})"
|
|
|
|
@property
|
|
def api_url(self):
|
|
return "https://api.teamsnap.com/v3/{type}/{id}".format(type=self.type, id=self.id)
|
|
|
|
class Team(TeamsnapBaseModel):
|
|
type = 'team'
|
|
managed_by_team = None
|
|
benchcoach_object = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE,related_name="teamsnapteam")
|
|
|
|
class User(TeamsnapBaseModel):
|
|
type = 'user'
|
|
name = None
|
|
first_name = models.CharField(max_length=50, null=True)
|
|
last_name = models.CharField(max_length = 50, null=True)
|
|
email = models.EmailField(null=True)
|
|
managed_teams = models.ManyToManyField(Team)
|
|
|
|
class TeamsnapManagedObjectModel(TeamsnapBaseModel):
|
|
managed_by_team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
@property
|
|
def url(self, endpoint='view'):
|
|
return f"https://go.teamsnap.com/{self.managed_by_team.id}/{self.type}/{endpoint}/{self.id}"
|
|
|
|
class Opponent(TeamsnapManagedObjectModel):
|
|
type = 'opponent'
|
|
benchcoach_object = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE)
|
|
|
|
class Location(TeamsnapManagedObjectModel):
|
|
benchcoach_object = models.ForeignKey(venues.models.Venue, null=True, on_delete=models.CASCADE)
|
|
|
|
class Member(TeamsnapManagedObjectModel):
|
|
# url format is
|
|
# f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/player/{self.teamsnap_id}"
|
|
# f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/edit/{self.teamsnap_id}"
|
|
type = 'member'
|
|
benchcoach_object = models.ForeignKey(players.models.Player, null=True, on_delete=models.CASCADE)
|
|
first_name = models.CharField(max_length = 50, null=True)
|
|
last_name = models.CharField(max_length = 50, null=True)
|
|
jersey_number = models.IntegerField(null=True)
|
|
is_non_player = models.BooleanField()
|
|
|
|
def __str__(self):
|
|
return f"{self.last_name}, {self.first_name} ({self.id})"
|
|
|
|
@property
|
|
def name(self):
|
|
return f"{self.first_name} {self.last_name}"
|
|
|
|
class Event(TeamsnapManagedObjectModel):
|
|
# url is
|
|
# f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/view_game/{self.teamsnap_id}"
|
|
# f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/edit_game/{self.teamsnap_id}"
|
|
type = 'event'
|
|
name = None
|
|
benchcoach_object = models.ForeignKey(events.models.Event, null=True, on_delete=models.CASCADE, related_name ='teamsnap_event')
|
|
label = models.CharField(max_length = 50, null=True)
|
|
start_date = models.DateTimeField(null=True)
|
|
opponent = models.ForeignKey(Opponent, null=True, on_delete=models.CASCADE, related_name="opponent")
|
|
location = models.ForeignKey(Location, null=True, on_delete=models.CASCADE)
|
|
formatted_title = models.CharField(max_length = 50, null=True)
|
|
points_for_opponent = models.PositiveSmallIntegerField(null=True)
|
|
points_for_team = models.PositiveSmallIntegerField(null=True)
|
|
is_game = models.BooleanField()
|
|
|
|
def __str__(self):
|
|
return f"{self.formatted_title} ({self.id})"
|
|
|
|
class Availability(TeamsnapManagedObjectModel):
|
|
YES = 1
|
|
NO = 0
|
|
MAYBE = 2
|
|
UNKNOWN = None
|
|
status_codes = [
|
|
(YES, 'Yes'),
|
|
(NO, 'No'),
|
|
(MAYBE, 'Maybe'),
|
|
(UNKNOWN, 'Unknown')
|
|
]
|
|
name = None
|
|
event = models.ForeignKey(Event, null=True, on_delete=models.CASCADE)
|
|
member = models.ForeignKey(Member, null=True, on_delete=models.CASCADE)
|
|
benchcoach_object = models.ForeignKey(lineups.models.Availability, null=True, on_delete=models.CASCADE)
|
|
status_code = models.SmallIntegerField(null=True, choices=status_codes, default=None)
|
|
|
|
def __str__(self):
|
|
return f"{self.member} - {self.event} ({self.id})"
|
|
|
|
class Meta:
|
|
verbose_name_plural = "availabilities"
|
|
|
|
class LineupEntry(TeamsnapManagedObjectModel):
|
|
name = None
|
|
member = models.ForeignKey(Member, on_delete=models.CASCADE)
|
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
|
positions = [
|
|
(11, 'EH'),
|
|
(1, 'P'),
|
|
(2, 'C'),
|
|
(3, '1B'),
|
|
(4, '2B'),
|
|
(5, '3B'),
|
|
(6, 'SS'),
|
|
(7, 'LF'),
|
|
(8, 'CF'),
|
|
(9, 'RF'),
|
|
(10,'DH')
|
|
]
|
|
label = models.PositiveSmallIntegerField(choices=positions, default=None, null=True, blank=True)
|
|
sequence = models.PositiveSmallIntegerField(default=0, null=True, blank=True)
|
|
|
|
class Meta:
|
|
unique_together = ('member', 'event',) |