from django.db import models from django.utils.translation import gettext_lazy as _ class Tournament(models.Model): """ Stellt ein komplettes Turnier dar. Hier werden alle Runden und Spieler registriert. """ name = models.CharField(_('Turniername'), max_length=200) date = models.DateField(_('Datum')) description = models.TextField(_('Beschreibung'), blank=True, default='') created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['-date'] def __str__(self): return f"{self.name} ({self.date})" class Registration(models.Model): """ Verknüpfungstabelle zwischen einem Tournament und den daran teilnehmenden Playern. Ermöglicht es, dass ein Spieler an mehreren Turnieren teilnehmen kann. """ tournament = models.ForeignKey( Tournament, on_delete=models.CASCADE, related_name='registrations' ) player = models.ForeignKey( 'Player', # String-Referenz vermeiden Import-Konflikte (Circular Dependency) on_delete=models.CASCADE ) class Meta: unique_together = ('tournament', 'player') verbose_name = 'Anmeldung' verbose_name_plural = 'Anmeldungen' class Round(models.Model): """ Eine einzelne Runde im Turnier. Jede Runde gehört eindeutig zu einem Tournament. """ tournament = models.ForeignKey( Tournament, on_delete=models.CASCADE, related_name='rounds' ) round_number = models.PositiveIntegerField(_('Rundennummer')) class Meta: unique_together = ('tournament', 'round_number') ordering = ['round_number'] def __str__(self): return f"{self.tournament.name} - Runde {self.round_number}" class Match(models.Model): """ Einzelnes Spiel (Paarung) innerhalb einer Runde. Hier wird festgehalten, wer als Weiß und Schwarz spielt und das Ergebnis. """ class ResultStatus(models.TextChoices): PENDING = 'pending', _('Ausstehend') WHITE_WIN = 'white_win', _('Weiß gewinnt') BLACK_WIN = 'black_win', _('Schwarz gewinnt') DRAW = 'draw', _('Unentschieden') round_detail = models.ForeignKey( Round, on_delete=models.CASCADE, related_name='matches' ) player_white = models.ForeignKey( 'Player', on_delete=models.PROTECT, # Spiel darf nicht gelöscht werden wenn Spieler existiert (Datensicherung) related_name='matches_as_white', verbose_name=_('Weißer Spieler') ) player_black = models.ForeignKey( 'Player', on_delete=models.PROTECT, related_name='matches_as_black', verbose_name=_('Schwarzer Spieler') ) result = models.CharField( max_length=10, choices=ResultStatus.choices, default=ResultStatus.PENDING ) class Meta: # Verhindert technisch doppelte Einträge (gleiche Paarung in gleicher Runde) unique_together = ('round_detail', 'player_white', 'player_black') def __str__(self): return f"{self.player_white} vs {self.player_black} ({self.round_detail})"