from decimal import Decimal from secrets import token_urlsafe from django.db import models from django.utils.translation import gettext_lazy as _ from django_scopes import ScopedManager def generate_token(): return token_urlsafe(32) class MusicrateSettings(models.Model): event = models.OneToOneField( to="event.Event", on_delete=models.CASCADE, related_name="pretalx_musicrate_settings", ) submission_types = models.ManyToManyField( to="submission.SubmissionType", related_name="pretalx_musicrate_settings", help_text=_( "You can limit pretalx-musicrate to some session types. Leave this field empty to rate all session types." ), verbose_name=_("Session Types"), blank=True, ) genre_question = models.OneToOneField( to="submission.Question", on_delete=models.SET_NULL, related_name="pretalx_musicrate_settings_genre", verbose_name=_("Genre Question"), blank=True, null=True, ) origin_question = models.OneToOneField( to="submission.Question", on_delete=models.SET_NULL, related_name="pretalx_musicrate_settings_origin", verbose_name=_("Origin Question"), blank=True, null=True, ) join_token = models.CharField(max_length=43, default=generate_token) advance_threshold = models.DecimalField( max_digits=3, decimal_places=2, default=Decimal("0.6"), help_text=_( "The fraction of jurors that has to submit a rating before the presenter view automatically advances to the next submission." ), verbose_name=_("Advance Threshold"), ) last_submission = models.ForeignKey( "submission.Submission", on_delete=models.SET_NULL, related_name="pretalx_musicrate_settings", null=True, ) link_questions = models.ManyToManyField( to="submission.Question", related_name="pretalx_musicrate_settings_links", verbose_name=_("Link Questions"), blank=True, ) class Juror(models.Model): objects = ScopedManager(event="event") event = models.ForeignKey( "event.Event", on_delete=models.CASCADE, related_name="jurors" ) token = models.CharField(max_length=43, default=generate_token, primary_key=True) last_submission = models.ForeignKey( "submission.Submission", on_delete=models.SET_NULL, related_name="jurors", null=True, ) class Rating(models.Model): RATING_CHOICES = [ ("10", "sehr gut"), ("9", "ziemlich gut"), ("8", "gut"), ("7", "eher gut"), ("6", "ok"), ("5", "naja"), ("4", "eher schlecht"), ("3", "schlecht"), ("2", "ziemlich schlecht"), ("1", "sehr schlecht"), ] rating = models.CharField(max_length=2, choices=RATING_CHOICES, blank=True) submission = models.ForeignKey( "submission.Submission", on_delete=models.CASCADE, related_name="ratings" ) juror = models.ForeignKey(Juror, on_delete=models.CASCADE, related_name="ratings") class Meta: constraints = [ models.UniqueConstraint( fields=("submission", "juror"), name="unique_rating" ), ] class Assignee(models.Model): submission = models.OneToOneField("submission.Submission", on_delete=models.CASCADE) user = models.ForeignKey( "person.User", on_delete=models.CASCADE, related_name="assigned_submissions" ) class Score(models.Model): submission = models.OneToOneField("submission.Submission", on_delete=models.CASCADE) value = models.FloatField()