Tidied code, added replace() method to FileField
This commit is contained in:
parent
6bfd6c322b
commit
47bfeec115
@ -46,6 +46,12 @@ are as follows:
|
|||||||
* :class:`~mongoengine.EmbeddedDocumentField`
|
* :class:`~mongoengine.EmbeddedDocumentField`
|
||||||
* :class:`~mongoengine.ReferenceField`
|
* :class:`~mongoengine.ReferenceField`
|
||||||
* :class:`~mongoengine.GenericReferenceField`
|
* :class:`~mongoengine.GenericReferenceField`
|
||||||
|
* :class:`~mongoengine.BooleanField`
|
||||||
|
* :class:`~mongoengine.GeoLocationField`
|
||||||
|
* :class:`~mongoengine.FileField`
|
||||||
|
* :class:`~mongoengine.EmailField`
|
||||||
|
* :class:`~mongoengine.SortedListField`
|
||||||
|
* :class:`~mongoengine.BinaryField`
|
||||||
|
|
||||||
Field arguments
|
Field arguments
|
||||||
---------------
|
---------------
|
||||||
|
@ -24,8 +24,8 @@ class BaseField(object):
|
|||||||
_index_with_types = True
|
_index_with_types = True
|
||||||
|
|
||||||
def __init__(self, db_field=None, name=None, required=False, default=None,
|
def __init__(self, db_field=None, name=None, required=False, default=None,
|
||||||
unique=False, unique_with=None, primary_key=False, validation=None,
|
unique=False, unique_with=None, primary_key=False,
|
||||||
choices=None):
|
validation=None, choices=None):
|
||||||
self.db_field = (db_field or name) if not primary_key else '_id'
|
self.db_field = (db_field or name) if not primary_key else '_id'
|
||||||
if name:
|
if name:
|
||||||
import warnings
|
import warnings
|
||||||
@ -86,13 +86,15 @@ class BaseField(object):
|
|||||||
# check choices
|
# check choices
|
||||||
if self.choices is not None:
|
if self.choices is not None:
|
||||||
if value not in self.choices:
|
if value not in self.choices:
|
||||||
raise ValidationError("Value must be one of %s."%unicode(self.choices))
|
raise ValidationError("Value must be one of %s."
|
||||||
|
% unicode(self.choices))
|
||||||
|
|
||||||
# check validation argument
|
# check validation argument
|
||||||
if self.validation is not None:
|
if self.validation is not None:
|
||||||
if callable(self.validation):
|
if callable(self.validation):
|
||||||
if not self.validation(value):
|
if not self.validation(value):
|
||||||
raise ValidationError('Value does not match custom validation method.')
|
raise ValidationError('Value does not match custom' \
|
||||||
|
'validation method.')
|
||||||
else:
|
else:
|
||||||
raise ValueError('validation argument must be a callable.')
|
raise ValueError('validation argument must be a callable.')
|
||||||
|
|
||||||
|
@ -530,17 +530,21 @@ class GridFSProxy(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.fs = gridfs.GridFS(_get_db()) # Filesystem instance
|
self.fs = gridfs.GridFS(_get_db()) # Filesystem instance
|
||||||
self.newfile = None # Used for partial writes
|
self.newfile = None # Used for partial writes
|
||||||
self.grid_id = None # Store GridFS id for file
|
self.grid_id = None # Store GridFS id for file
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
obj = self.fs.get(self.grid_id)
|
obj = self.get()
|
||||||
if name in dir(obj):
|
if name in dir(obj):
|
||||||
return getattr(obj, name)
|
return getattr(obj, name)
|
||||||
|
|
||||||
def __get__(self, instance, value):
|
def __get__(self, instance, value):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def get(self, id=None):
|
||||||
|
try: return self.fs.get(id or self.grid_id)
|
||||||
|
except: return None # File has been deleted
|
||||||
|
|
||||||
def new_file(self, **kwargs):
|
def new_file(self, **kwargs):
|
||||||
self.newfile = self.fs.new_file(**kwargs)
|
self.newfile = self.fs.new_file(**kwargs)
|
||||||
self.grid_id = self.newfile._id
|
self.grid_id = self.newfile._id
|
||||||
@ -561,11 +565,17 @@ class GridFSProxy(object):
|
|||||||
self.newfile.writelines(lines)
|
self.newfile.writelines(lines)
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
return self.fs.get(self.grid_id).read()
|
try: return self.get().read()
|
||||||
|
except: return None
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
# Delete file from GridFS
|
# Delete file from GridFS, FileField still remains
|
||||||
self.fs.delete(self.grid_id)
|
self.fs.delete(self.grid_id)
|
||||||
|
self.grid_id = None
|
||||||
|
|
||||||
|
def replace(self, file, **kwargs):
|
||||||
|
self.delete()
|
||||||
|
self.put(file, **kwargs)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.newfile:
|
if self.newfile:
|
||||||
@ -601,7 +611,7 @@ class FileField(BaseField):
|
|||||||
|
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
# Use stored value (id) to lookup file in GridFS
|
# Use stored value (id) to lookup file in GridFS
|
||||||
return self.gridfs.fs.get(value)
|
return self.gridfs.get()
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, GridFSProxy)
|
assert isinstance(value, GridFSProxy)
|
||||||
|
@ -649,7 +649,10 @@ class FieldTest(unittest.TestCase):
|
|||||||
self.assertTrue(streamfile == result)
|
self.assertTrue(streamfile == result)
|
||||||
self.assertEquals(result.file.read(), text + more_text)
|
self.assertEquals(result.file.read(), text + more_text)
|
||||||
self.assertEquals(result.file.content_type, content_type)
|
self.assertEquals(result.file.content_type, content_type)
|
||||||
result.file.delete() # Remove file from GridFS
|
result.file.delete()
|
||||||
|
|
||||||
|
# Ensure deleted file returns None
|
||||||
|
self.assertTrue(result.file.read() == None)
|
||||||
|
|
||||||
setfile = SetFile()
|
setfile = SetFile()
|
||||||
setfile.file = text
|
setfile.file = text
|
||||||
@ -658,7 +661,15 @@ class FieldTest(unittest.TestCase):
|
|||||||
result = SetFile.objects.first()
|
result = SetFile.objects.first()
|
||||||
self.assertTrue(setfile == result)
|
self.assertTrue(setfile == result)
|
||||||
self.assertEquals(result.file.read(), text)
|
self.assertEquals(result.file.read(), text)
|
||||||
result.file.delete() # Remove file from GridFS
|
|
||||||
|
# Try replacing file with new one
|
||||||
|
result.file.replace(more_text)
|
||||||
|
result.save()
|
||||||
|
result.validate()
|
||||||
|
result = SetFile.objects.first()
|
||||||
|
self.assertTrue(setfile == result)
|
||||||
|
self.assertEquals(result.file.read(), more_text)
|
||||||
|
result.file.delete()
|
||||||
|
|
||||||
PutFile.drop_collection()
|
PutFile.drop_collection()
|
||||||
StreamFile.drop_collection()
|
StreamFile.drop_collection()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user