pretalx-musicrate/pretalx_musicrate/forms.py

87 lines
3.1 KiB
Python

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