from django import forms from django.utils.translation import gettext_lazy as _ from django_scopes.forms import SafeModelChoiceField, SafeModelMultipleChoiceField from i18nfield.forms import I18nModelForm from pretalx.person.models import User from pretalx.submission.forms import SubmissionFilterForm from .models import Assignee, MusicrateSettings, Rating class MusicrateSettingsForm(I18nModelForm): def __init__(self, *args, event=None, **kwargs): self.instance, _ = MusicrateSettings.objects.get_or_create(event=event) super().__init__(*args, **kwargs, instance=self.instance, locales=event.locales) if not event.submission_types.count(): self.fields.pop("submission_types") else: self.fields["submission_types"].queryset = event.submission_types.all() self.fields["genre_question"].queryset = ( event.questions.exclude(pk=self.instance.origin_question.pk) if self.instance.origin_question else event.questions.all() ) self.fields["origin_question"].queryset = ( event.questions.exclude(pk=self.instance.genre_question.pk) if self.instance.genre_question else event.questions.all() ) self.fields["link_questions"].queryset = event.questions.all() class Meta: model = MusicrateSettings fields = ( "submission_types", "genre_question", "origin_question", "link_questions", "advance_threshold", ) field_classes = { "submission_types": SafeModelMultipleChoiceField, "genre_question": SafeModelChoiceField, "origin_question": SafeModelChoiceField, "link_questions": SafeModelMultipleChoiceField, } class RatingForm(forms.ModelForm): rating = forms.ChoiceField( choices=Rating.RATING_CHOICES, required=False, widget=forms.RadioSelect ) class Meta: model = Rating fields = ("rating",) class AssigneeForm(forms.ModelForm): def __init__(self, *args, submission=None, **kwargs): try: self.instance = Assignee.objects.get(submission=submission) except Assignee.DoesNotExist: self.instance = Assignee(submission=submission) super().__init__(*args, instance=self.instance, **kwargs) self.fields["user"].queryset = User.objects.none().union( *( t.members.all() for t in submission.event.teams.filter(can_change_submissions=True) ) ) class Meta: model = Assignee fields = ("user",) widgets = {"user": forms.Select(attrs={"class": "select2"})} class EnhancedSubmissionFilterForm(SubmissionFilterForm): require_all_tags = forms.BooleanField(required=False, label=_("require all")) def filter_queryset(self, qs): qs = super().filter_queryset(qs) if self.cleaned_data.get("require_all_tags"): for tag in self.cleaned_data.get("tags"): qs = qs.filter(tags__in=[tag]) return qs