forms.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from django import forms
  2. from django.utils.translation import ugettext as _
  3. from .models import AttachmentType
  4. def get_searchable_filetypes():
  5. choices = [(0, _("All types"))]
  6. choices += [(a.id, a.name) for a in AttachmentType.objects.order_by('name')]
  7. return choices
  8. class SearchAttachmentsForm(forms.Form):
  9. uploader = forms.CharField(label=_("Uploader name contains"), required=False)
  10. filename = forms.CharField(label=_("Filename contains"), required=False)
  11. filetype = forms.TypedChoiceField(
  12. label=_("File type"),
  13. coerce=int,
  14. choices=get_searchable_filetypes,
  15. empty_value=0,
  16. required=False,
  17. )
  18. is_orphan = forms.ChoiceField(
  19. label=_("State"),
  20. required=False,
  21. choices=[
  22. ('', _("All")),
  23. ('yes', _("Only orphaned")),
  24. ('no', _("Not orphaned")),
  25. ],
  26. )
  27. def filter_queryset(self, criteria, queryset):
  28. if criteria.get('uploader'):
  29. queryset = queryset.filter(uploader_slug__contains=criteria['uploader'].lower())
  30. if criteria.get('filename'):
  31. queryset = queryset.filter(filename__icontains=criteria['filename'])
  32. if criteria.get('filetype'):
  33. queryset = queryset.filter(filetype_id=criteria['filetype'])
  34. if criteria.get('is_orphan') == 'yes':
  35. queryset = queryset.filter(post__isnull=True)
  36. elif criteria.get('is_orphan') == 'no':
  37. queryset = queryset.filter(post__isnull=False)
  38. return queryset
  39. class AttachmentTypeForm(forms.ModelForm):
  40. class Meta:
  41. model = AttachmentType
  42. fields = '__all__'
  43. labels = {
  44. 'name': _("Type name"),
  45. 'extensions': _("File extensions"),
  46. 'mimetypes': _("Mimetypes"),
  47. 'size_limit': _("Maximum allowed uploaded file size"),
  48. 'status': _("Status"),
  49. 'limit_uploads_to': _("Limit uploads to"),
  50. 'limit_downloads_to': _("Limit downloads to"),
  51. }
  52. help_texts = {
  53. 'extensions': _("List of comma separated file extensions associated with this attachment type."),
  54. 'mimetypes': _(
  55. "Optional list of comma separated mime types associated with this attachment type."
  56. ),
  57. 'size_limit': _(
  58. "Maximum allowed uploaded file size for this type, in kb. "
  59. "May be overriden via user permission."
  60. ),
  61. 'status': _("Controls this attachment type availability on your site."),
  62. 'limit_uploads_to': _(
  63. "If you wish to limit option to upload files of this type to users with specific "
  64. "roles, select them on this list. Otherwhise don't select any roles to allow all "
  65. "users with permission to upload attachments to be able to upload attachments of "
  66. "this type."
  67. ),
  68. 'limit_downloads_to': _(
  69. "If you wish to limit option to download files of this type to users with "
  70. "specific roles, select them on this list. Otherwhise don't select any roles to "
  71. "allow all users with permission to download attachments to be able to download "
  72. "attachments of this type."
  73. ),
  74. }
  75. widgets = {
  76. 'limit_uploads_to': forms.CheckboxSelectMultiple,
  77. 'limit_downloads_to': forms.CheckboxSelectMultiple,
  78. }
  79. def clean_extensions(self):
  80. data = self.clean_list(self.cleaned_data['extensions'])
  81. if not data:
  82. raise forms.ValidationError(_("This field is required."))
  83. return data
  84. def clean_mimetypes(self):
  85. return self.clean_list(self.cleaned_data['mimetypes'])
  86. def clean_list(self, value):
  87. if not value:
  88. return None
  89. items = [v.lstrip('.') for v in value.lower().replace(' ', '').split(',')]
  90. return ','.join(set(filter(bool, items)))