Skip to content
Snippets Groups Projects
myfields.py 1.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django import forms
    from django.template.defaultfilters import filesizeformat
    from django.utils.translation import ugettext_lazy as _
    from django.core.exceptions import ValidationError
    
    
    class RestrictedFileField(forms.FileField):
        """
        Same as FileField, but you can specify:
        * content_types - list containing allowed content_types. Example: ['application/pdf', 'image/jpeg']
        * max_upload_size - a number indicating the maximum file size allowed for upload.
            2.5MB - 2621440
            5MB - 5242880
            10MB - 10485760
            20MB - 20971520
            50MB - 5242880
            100MB - 104857600
            250MB - 214958080
            500MB - 429916160
    """
    
        def __init__(self, *args, **kwargs):
            self.content_types = kwargs.pop("content_types")
            self.max_upload_size = kwargs.pop("max_upload_size")
            super().__init__(*args, **kwargs)
    
        def clean(self, data, initial=None):
            file = super().clean(data, initial)
    
            try:
                content_type = file.content_type
                if content_type in self.content_types:
                    if file._size > self.max_upload_size:
                        raise ValidationError(_('Please keep filesize under %s. Current filesize %s') % (
                            filesizeformat(self.max_upload_size), filesizeformat(file._size)))
                else:
                    raise ValidationError(_('Filetype not supported.'))
            except AttributeError:
                pass
    
            return data