123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- from django import forms
- from django.utils.translation import ugettext as _
- from .models import AttachmentType
- def get_searchable_filetypes():
- choices = [(0, _("All types"))]
- choices += [(a.id, a.name) for a in AttachmentType.objects.order_by('name')]
- return choices
- class SearchAttachmentsForm(forms.Form):
- uploader = forms.CharField(label=_("Uploader name contains"), required=False)
- filename = forms.CharField(label=_("Filename contains"), required=False)
- filetype = forms.TypedChoiceField(
- label=_("File type"),
- coerce=int,
- choices=get_searchable_filetypes,
- empty_value=0,
- required=False,
- )
- is_orphan = forms.ChoiceField(
- label=_("State"),
- required=False,
- choices=(('', _("All")), ('yes', _("Only orphaned")), ('no', _("Not orphaned")), ),
- )
- def filter_queryset(self, criteria, queryset):
- if criteria.get('uploader'):
- queryset = queryset.filter(uploader_slug__contains=criteria['uploader'].lower())
- if criteria.get('filename'):
- queryset = queryset.filter(filename__icontains=criteria['filename'])
- if criteria.get('filetype'):
- queryset = queryset.filter(filetype_id=criteria['filetype'])
- if criteria.get('is_orphan') == 'yes':
- queryset = queryset.filter(post__isnull=True)
- elif criteria.get('is_orphan') == 'no':
- queryset = queryset.filter(post__isnull=False)
- return queryset
- class AttachmentTypeForm(forms.ModelForm):
- class Meta:
- model = AttachmentType
- fields = '__all__'
- labels = {
- 'name': _("Type name"),
- 'extensions': _("File extensions"),
- 'mimetypes': _("Mimetypes"),
- 'size_limit': _("Maximum allowed uploaded file size"),
- 'status': _("Status"),
- 'limit_uploads_to': _("Limit uploads to"),
- 'limit_downloads_to': _("Limit downloads to"),
- }
- help_texts = {
- 'extensions':
- _("List of comma separated file extensions associated with this attachment type."),
- 'mimetypes':
- _(
- "Optional list of comma separated mime types associated with this attachment type."
- ),
- 'size_limit':
- _(
- "Maximum allowed uploaded file size for this type, in kb. "
- "May be overriden via user permission."
- ),
- 'status':
- _("Controls this attachment type availability on your site."),
- 'limit_uploads_to':
- _(
- "If you wish to limit option to upload files of this type to users with specific "
- "roles, select them on this list. Otherwhise don't select any roles to allow all "
- "users with permission to upload attachments to be able to upload attachments of "
- "this type."
- ),
- 'limit_downloads_to':
- _(
- "If you wish to limit option to download files of this type to users with "
- "specific roles, select them on this list. Otherwhise don't select any roles to "
- "allow all users with permission to download attachments to be able to download "
- " attachments of this type."
- ),
- }
- widgets = {
- 'limit_uploads_to': forms.CheckboxSelectMultiple,
- 'limit_downloads_to': forms.CheckboxSelectMultiple,
- }
- def clean_extensions(self):
- data = self.clean_list(self.cleaned_data['extensions'])
- if not data:
- raise forms.ValidationError(_("This field is required."))
- return data
- def clean_mimetypes(self):
- return self.clean_list(self.cleaned_data['mimetypes'])
- def clean_list(self, value):
- items = [v.lstrip('.') for v in value.lower().replace(' ', '').split(',')]
- return ','.join(set(filter(bool, items)))
|