12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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
|