diff --git a/pretalx_musicrate/__init__.py b/pretalx_musicrate/__init__.py index 7d81849..d386132 100644 --- a/pretalx_musicrate/__init__.py +++ b/pretalx_musicrate/__init__.py @@ -1 +1 @@ -__version__ = "2025.4.1" +__version__ = "2025.5.0.dev0" diff --git a/pretalx_musicrate/management/commands/computescores.py b/pretalx_musicrate/management/commands/computescores.py index 0f057de..aaa5ef2 100644 --- a/pretalx_musicrate/management/commands/computescores.py +++ b/pretalx_musicrate/management/commands/computescores.py @@ -31,8 +31,10 @@ class Command(BaseCommand): with scope(event=event): submissions = {} - for juror in event.jurors.prefetch_related("ratings__submission").order_by( - "token" + for juror in ( + event.jurors.prefetch_related("ratings__submission") + .filter(frozen=False) + .order_by("token") ): ratings = list( juror.ratings.exclude(rating="").order_by("submission__created") diff --git a/pretalx_musicrate/migrations/0010_juror_frozen.py b/pretalx_musicrate/migrations/0010_juror_frozen.py new file mode 100644 index 0000000..415b878 --- /dev/null +++ b/pretalx_musicrate/migrations/0010_juror_frozen.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.5 on 2025-02-23 13:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretalx_musicrate", "0009_score"), + ] + + operations = [ + migrations.AddField( + model_name="juror", + name="frozen", + field=models.BooleanField(default=False), + ), + ] diff --git a/pretalx_musicrate/models.py b/pretalx_musicrate/models.py index d71d0b4..a045982 100644 --- a/pretalx_musicrate/models.py +++ b/pretalx_musicrate/models.py @@ -78,6 +78,7 @@ class Juror(models.Model): related_name="jurors", null=True, ) + frozen = models.BooleanField(default=False) class Rating(models.Model): diff --git a/pretalx_musicrate/views.py b/pretalx_musicrate/views.py index 0a3d9ea..6c471ad 100644 --- a/pretalx_musicrate/views.py +++ b/pretalx_musicrate/views.py @@ -54,7 +54,7 @@ class JoinView(TemplateView): def validate_token(self, token): try: - self.juror = Juror.objects.get(token=token) + self.juror = Juror.objects.get(token=token, frozen=False) return True except Juror.DoesNotExist: self.juror = None @@ -256,7 +256,7 @@ class RatingView(FormView, SubmissionMixin): @cached_property def juror(self): return get_object_or_404( - Juror, token=self.request.resolver_match.kwargs["token"] + Juror, token=self.request.resolver_match.kwargs["token"], frozen=False ) @context @@ -384,8 +384,8 @@ class MayAdvanceView(EventPermissionRequired, SubmissionMixin, View): permission_required = "orga.view_submissions" def get(self, request, *args, **kwargs): - num_ratings = self.submission.ratings.count() - num_jurors = self.request.event.jurors.count() + num_ratings = self.submission.ratings.filter(juror__frozen=False).count() + num_jurors = self.request.event.jurors.filter(frozen=False).count() return JsonResponse( { "mayAdvance": num_ratings @@ -417,7 +417,7 @@ class ExportView(EventPermissionRequired, View): writer = csv.writer(response) genre_question = request.event.pretalx_musicrate_settings.genre_question origin_question = request.event.pretalx_musicrate_settings.origin_question - jurors = request.event.jurors.order_by("token") + jurors = request.event.jurors.filter(frozen=False).order_by("token") for submission in ( request.event.submissions.prefetch_related("answers") .select_related("submission_type")