def is_valid(self, value, params):
if isinstance(value, basestring):
self.message = _('The {{key}} must be between {min} and {max} characters.').format(
min=self.min_value,
max=self.max_value
)
return self.min_value <= len(value) <= self.max_value
elif isinstance(value, File):
self.message = _('The {{key}} must be between {min} and {max} bytes.').format(
min=self.min_value,
max=self.max_value
)
return self.min_value <= value.size <= self.max_value
else:
self.message = _('The {{key}} must be between {min} and {max}.').format(
min=self.min_value,
max=self.max_value
)
return self.min_value <= value <= self.max_value
python类File()的实例源码
def add_view(self, request, form_url='', extra_context=None):
# Prepopulate new configuration entries with the value of the current config, if given:
if 'source' in request.GET:
get = request.GET.copy()
source_id = int(get.pop('source')[0])
source = get_object_or_404(self.model, pk=source_id)
source_dict = models.model_to_dict(source)
for field_name, field_value in source_dict.items():
# read files into request.FILES, if:
# * user hasn't ticked the "clear" checkbox
# * user hasn't uploaded a new file
if field_value and isinstance(field_value, File):
clear_checkbox_name = '{0}-clear'.format(field_name)
if request.POST.get(clear_checkbox_name) != 'on':
request.FILES.setdefault(field_name, field_value)
get[field_name] = field_value
request.GET = get
# Call our grandparent's add_view, skipping the parent code
# because the parent code has a different way to prepopulate new configuration entries
# with the value of the latest config, which doesn't make sense for keyed models.
# pylint: disable=bad-super-call
return super(ConfigurationModelAdmin, self).add_view(request, form_url, extra_context)
def add_view(self, request, form_url='', extra_context=None):
# Prepopulate new configuration entries with the value of the current config, if given:
if 'source' in request.GET:
get = request.GET.copy()
source_id = int(get.pop('source')[0])
source = get_object_or_404(self.model, pk=source_id)
source_dict = models.model_to_dict(source)
for field_name, field_value in source_dict.items():
# read files into request.FILES, if:
# * user hasn't ticked the "clear" checkbox
# * user hasn't uploaded a new file
if field_value and isinstance(field_value, File):
clear_checkbox_name = '{0}-clear'.format(field_name)
if request.POST.get(clear_checkbox_name) != 'on':
request.FILES.setdefault(field_name, field_value)
get[field_name] = field_value
request.GET = get
# Call our grandparent's add_view, skipping the parent code
# because the parent code has a different way to prepopulate new configuration entries
# with the value of the latest config, which doesn't make sense for keyed models.
# pylint: disable=bad-super-call
return super(ConfigurationModelAdmin, self).add_view(request, form_url, extra_context)
def _extarct_only_robot(xmlfile):
"""remove from file not robot's elements
robot elements are: 'suite' 'statistics' 'errors'
"""
original_doc = ET.parse(xmlfile)
root = original_doc.getroot()
devices = root.find("devices")
if devices is not None:
root.remove(devices)
source = StringIO(ET.tostring(root))
ets = ETSource(source)
execution_result = ExecutionResultBuilder(ets).build(Result())
patched_file = File(BytesIO(force_bytes(source.getvalue())), name=xmlfile.name)
return (execution_result, patched_file)
def authenticate(self, facebook_id, extra_fields=None):
url_profile = 'https://graph.facebook.com/{user_id}/picture'.format(
user_id=facebook_id,
)
params = {
'type': 'large',
'width': '500',
'height': '500',
}
# ????? ???? ??
temp_file = NamedTemporaryFile(delete=False)
# ??? ???? URL? get??, stream? True??
r = requests.get(url_profile, params, stream=True)
# ???? URL?? ?? ???? ???
_, file_ext = os.path.splitext(r.url)
file_ext = re.sub(r'(\.[^?]+).*', r'\1', file_ext)
# ???? ?? ID.??? ? file_name? ??
file_name = '{}{}'.format(
facebook_id,
file_ext
)
# stream?? ??? response?? 1024bytes??? ???? ?? ????? ??
for chunk in r.iter_content(1024):
temp_file.write(chunk)
# facebook_id? username? MyUser? ?????
# defaults?? ???? ??
defaults = {
'first_name': extra_fields.get('first_name', ''),
'last_name': extra_fields.get('last_name', ''),
'email': extra_fields.get('email', ''),
}
user, user_created = MyUser.objects.get_or_create(
defaults=defaults,
username=facebook_id
)
# ImageField? save???? ???? Django?? ???? File??? ??
user.img_profile.save(file_name, File(temp_file))
return user
factory_faker.py 文件源码
项目:django-elasticsearch-dsl-drf
作者: barseghyanartur
项目源码
文件源码
阅读 17
收藏 0
点赞 0
评论 0
def django_file(cls, extension=None):
"""Generates a random file.
Example:
>>> from factory import DjangoModelFactory
>>>
>>> class ProductFactory(DjangoModelFactory):
>>> "Product factory."
>>>
>>> # ...
>>>
>>> image_file = Faker('django_file', extension='image')
>>> video_file = Faker('django_file', extension='video')
>>> text_file = Faker('django_file', extension='text')
>>>
>>> # ...
:param extension: File extension.
:type extension: str
:return: File object.
"""
fake = FakerFaker()
django_file = get_temporary_file(fake.file_name(extension=extension))
return File(django_file)
def test_file(self):
"""
Test for file upload decorator.
"""
@FILE('f', type='file')
def view(request, f):
self.assertIsInstance(f, File)
test_file = io.StringIO()
self.post(view, data={'f': test_file})
def is_valid(self, value, params):
if isinstance(value, basestring):
self.message = _('The {{key}} must be at least {min} characters.').format(min=self.min_value)
return len(value) >= self.min_value
elif isinstance(value, File):
self.message = _('The {{key}} must be at least {min} bytes.'.format(min=self.min_value))
return value.size >= self.min_value
else:
self.message = _('The {{key}} must be at least {min}.').format(min=self.min_value)
return value >= self.min_value
def is_valid(self, value, params):
if isinstance(value, basestring):
self.message = _('The {{key}} may not be greater than {max} characters.').format(max=self.max_value)
return len(value) <= self.max_value
elif isinstance(value, File):
self.message = _('The {{key}} must not be at greater {max} bytes.'.format(max=self.max_value))
return value.size <= self.max_value
else:
self.message = _('The {{key}} may not be greater than {max}.').format(max=self.max_value)
return value <= self.max_value
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def __hash__(self):
return hash(self.name)
# The standard File contains most of the necessary properties, but
# FieldFiles can be instantiated without a name, so that needs to
# be checked for here.
def get_prep_value(self, value):
"Returns field's value prepared for saving into a database."
value = super(FileField, self).get_prep_value(value)
# Need to convert File objects provided via a form to unicode for database insertion
if value is None:
return None
return six.text_type(value)
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def __init__(self, request, stream, filename=None, *args, **kwargs):
if isinstance(stream, str):
stream = open(stream, 'rb')
super().__init__(streaming_content=stream, *args, **kwargs)
# filename
if filename is None:
if hasattr(stream, 'name'):
filename = os.path.basename(stream.name)
else:
filename = 'file'
# size
if isinstance(stream, File):
self['Content-Length'] = stream.size
elif hasattr(stream, 'name'):
self['Content-Length'] = os.path.getsize(stream.name)
type_name, encoding = mimetypes.guess_type(filename)
if type_name is None:
type_name = 'application/octet-stream'
self['Content-Type'] = type_name
if encoding is not None:
self['Content-Encoding'] = encoding
# To inspect details for the below code, see http://greenbytes.de/tech/tc2231/
if 'HTTP_USER_AGENT' in request.META and 'MSIE' in request.META['HTTP_USER_AGENT']:
# IE does not support internationalized filename at all.
# It can only recognize internationalized URL, so we do the trick via routing rules.
filename_header = ''
else:
# For others like Firefox, we follow RFC2231 (encoding extension in HTTP headers).
filename_header = 'filename*=UTF-8\'\'%s' % quote(filename)
self['Content-Disposition'] = 'attachment; ' + filename_header
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def test_media_file_hash(self):
name = "screenshot.png"
media_file = os.path.join(
self.this_directory, 'fixtures', 'transportation', name)
m = MetaData.objects.create(
data_type='media', xform=self.xform, data_value=name,
data_file=File(open(media_file), name),
data_file_type='image/png')
f = open(media_file)
media_hash = 'md5:%s' % hashlib.md5(f.read()).hexdigest()
f.close()
meta_hash = m.hash
self.assertEqual(meta_hash, media_hash)
self.assertEqual(m.file_hash, media_hash)
def setUp(self):
super(self.__class__, self).setUp()
self._publish_transportation_form_and_submit_instance()
self.media_file = "1335783522563.jpg"
media_file = os.path.join(
self.this_directory, 'fixtures',
'transportation', 'instances', self.surveys[0], self.media_file)
self.instance = Instance.objects.all()[0]
self.attachment = Attachment.objects.create(
instance=self.instance,
media_file=File(open(media_file), media_file))
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def write(self, content):
if 'w' not in self._mode:
raise AttributeError("File was opened for read-only access.")
self.file = StringIO(content)
self._is_dirty = True
def write(self, content):
if 'w' not in self._mode:
raise AttributeError("File was opened for read-only access.")
self.file.write(force_bytes(content))
self._is_dirty = True
self._is_read = True
def _save(self, name, content):
cleaned_name = self._clean_name(name)
name = self._normalize_name(cleaned_name)
if hasattr(content, 'open'):
# Since Django 1.6, content should be a instance
# of `django.core.files.File`
content.open()
res = self._put_file(name, content)
content.close()
return '/%s'%res
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def _set_name(self, name):
# Sanitize the file name so that it can't be dangerous.
if name is not None:
# Just use the basename of the file -- anything else is dangerous.
name = os.path.basename(name)
# File names longer than 255 characters can cause problems on older OSes.
if len(name) > 255:
name, ext = os.path.splitext(name)
ext = ext[:255]
name = name[:255 - len(ext)] + ext
self._name = name
def __hash__(self):
return hash(self.name)
# The standard File contains most of the necessary properties, but
# FieldFiles can be instantiated without a name, so that needs to
# be checked for here.