forms.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django import forms
  2. from django.db.models import Q
  3. from django.utils.translation import ugettext_lazy as _
  4. from .models import Agreement
  5. from .utils import set_agreement_as_active
  6. class AgreementForm(forms.ModelForm):
  7. type = forms.ChoiceField(label=_("Type"), choices=Agreement.TYPE_CHOICES)
  8. title = forms.CharField(
  9. label=_("Title"),
  10. help_text=_("Optional, leave empty for agreement to be named after its type."),
  11. required=False,
  12. )
  13. is_active = forms.BooleanField(
  14. label=_("Set as active for its type"),
  15. help_text=_(
  16. "If other agreement is already active for this type, it will be unset and replaced "
  17. "with this one. "
  18. "Misago will ask users who didn't accept this agreement to do so before allowing them "
  19. "to continue using the site's features."
  20. ),
  21. required=False,
  22. )
  23. link = forms.URLField(
  24. label=_("Link"),
  25. help_text=_("If your agreement is located on other page, enter here a link to it."),
  26. required=False,
  27. )
  28. text = forms.CharField(
  29. label=_("Text"),
  30. help_text=_("You can use Markdown syntax for rich text elements."),
  31. widget=forms.Textarea,
  32. required=False,
  33. )
  34. class Meta:
  35. model = Agreement
  36. fields = ['type', 'title', 'link', 'text', 'is_active']
  37. def clean(self):
  38. data = super(AgreementForm, self).clean()
  39. if not data.get('link') and not data.get('text'):
  40. raise forms.ValidationError(_("Please fill in agreement link or text."))
  41. return data
  42. def save(self):
  43. agreement = super(AgreementForm, self).save()
  44. if agreement.is_active:
  45. set_agreement_as_active(agreement)
  46. Agreement.objects.invalidate_cache()
  47. return agreement
  48. class SearchAgreementsForm(forms.Form):
  49. type = forms.MultipleChoiceField(
  50. label=_("Type"),
  51. required=False,
  52. choices=Agreement.TYPE_CHOICES,
  53. )
  54. content = forms.CharField(
  55. label=_("Content"),
  56. required=False,
  57. )
  58. def filter_queryset(self, search_criteria, queryset):
  59. criteria = search_criteria
  60. if criteria.get('type') is not None:
  61. queryset = queryset.filter(type__in=criteria['type'])
  62. if criteria.get('content'):
  63. search_title = Q(title__icontains=criteria['content'])
  64. search_text = Q(text__icontains=criteria['content'])
  65. queryset = queryset.filter(search_title | search_text)
  66. return queryset