begin implementation of teamsnap syncing

This commit is contained in:
2021-12-17 12:59:01 -06:00
parent 643565d14a
commit e9f91126e5
15 changed files with 805 additions and 115 deletions

View File

@@ -7,104 +7,114 @@ import players.models
import events.models
class TeamsnapBaseModel(models.Model):
teamsnap_id = models.CharField(max_length=10, unique=True)
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.teamsnap_id})"
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):
bencoach_team = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE)
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 view_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/view/{self.teamsnap_id}"
def url(self, endpoint='view'):
return f"https://go.teamsnap.com/{self.managed_by_team.id}/{self.type}/{endpoint}/{self.id}"
@property
def edit_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/edit/{self.teamsnap_id}"
class Opponent(TeamsnapManagedObjectModel):
type = 'opponent'
benchcoach_object = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE)
class Location(TeamsnapBaseModel):
class Location(TeamsnapManagedObjectModel):
benchcoach_object = models.ForeignKey(venues.models.Venue, null=True, on_delete=models.CASCADE)
@property
def view_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/location/view/{self.teamsnap_id}"
@property
def edit_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/location/edit/{self.teamsnap_id}"
class Member(TeamsnapBaseModel):
name = None
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)
team = models.ForeignKey(Team, 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.teamsnap_id})"
return f"{self.last_name}, {self.first_name} ({self.id})"
@property
def view_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/player/{self.teamsnap_id}"
def name(self):
return f"{self.first_name} {self.last_name}"
@property
def edit_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/edit/{self.teamsnap_id}"
class Event(TeamsnapBaseModel):
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)
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(Team, null=True, on_delete=models.CASCADE, related_name="opponent")
team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE)
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()
@property
def view_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/view_game/{self.teamsnap_id}"
@property
def edit_url(self):
return f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/edit_game/{self.teamsnap_id}"
def __str__(self):
return f"{self.formatted_title} ({self.teamsnap_id})"
return f"{self.formatted_title} ({self.id})"
class Availability(TeamsnapBaseModel):
class Availability(TeamsnapManagedObjectModel):
YES = 1
NO = 0
MAYBE = 2
UNKNOWN = None
status_codes = [
(1, 'Yes'),
(0, 'No'),
(2, 'Maybe'),
(None, 'Unknown')
(YES, 'Yes'),
(NO, 'No'),
(MAYBE, 'Maybe'),
(UNKNOWN, 'Unknown')
]
name = None
team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE)
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.teamsnap_id})"
return f"{self.member} - {self.event} ({self.id})"
class Meta:
verbose_name_plural = "availabilities"
class LineupEntry(TeamsnapBaseModel):
class LineupEntry(TeamsnapManagedObjectModel):
name = None
teamsnap_id = models.CharField(max_length=10, unique=True, null=True, blank=True)
member = models.ForeignKey(Member, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
positions = [
@@ -124,11 +134,4 @@ class LineupEntry(TeamsnapBaseModel):
sequence = models.PositiveSmallIntegerField(default=0, null=True, blank=True)
class Meta:
unique_together = ('member', 'event',)
class User(TeamsnapBaseModel):
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)
unique_together = ('member', 'event',)