from django import forms from django.db.models import Q from django.utils.translation import gettext_lazy as _ from .models import Agreement from .utils import set_agreement_as_active class AgreementForm(forms.ModelForm): type = forms.ChoiceField(label=_("Type"), choices=Agreement.TYPE_CHOICES) title = forms.CharField( label=_("Title"), help_text=_("Optional, leave empty for agreement to be named after its type."), required=False, ) is_active = forms.BooleanField( label=_("Set as active for its type"), help_text=_( "If other agreement is already active for this type, it will be unset " "and replaced with this one. " "Misago will ask users who didn't accept this agreement to do so " "before allowing them to continue using the site's features." ), required=False, ) link = forms.URLField( label=_("Link"), help_text=_( "If your agreement is located on other page, enter here a link to it." ), required=False, ) text = forms.CharField( label=_("Text"), help_text=_("You can use Markdown syntax for rich text elements."), widget=forms.Textarea, required=False, ) class Meta: model = Agreement fields = ["type", "title", "link", "text", "is_active"] def clean(self): data = super().clean() if not data.get("link") and not data.get("text"): raise forms.ValidationError(_("Please fill in agreement link or text.")) return data def save(self): agreement = super().save() if agreement.is_active: set_agreement_as_active(agreement) Agreement.objects.invalidate_cache() return agreement class SearchAgreementsForm(forms.Form): type = forms.MultipleChoiceField( label=_("Type"), required=False, choices=Agreement.TYPE_CHOICES ) content = forms.CharField(label=_("Content"), required=False) def filter_queryset(self, search_criteria, queryset): criteria = search_criteria if criteria.get("type") is not None: queryset = queryset.filter(type__in=criteria["type"]) if criteria.get("content"): search_title = Q(title__icontains=criteria["content"]) search_text = Q(text__icontains=criteria["content"]) queryset = queryset.filter(search_title | search_text) return queryset