SmileyChris / easy-thumbnails
- Source
- Commits
- Network (1)
- Issues (2)
- Downloads (0)
- Wiki (1)
- Graphs
-
Branch:
master
Sort by:
Priority
Priority
|
Votes
Votes
|
Last Updated
Last Updated
Loading…
-
Unable to pickle Cloud Files storage object from django_storages
3 comments Created 2 months ago by lincolnloopMy model looks like this:
from easy_thumbnails.fields import ThumbnailerImageField from backends.mosso import CloudFilesStorage, cloudfiles_upload_to cloudfiles_storage = CloudFilesStorage() class CloudFilesImage(models.Model): image = ThumbnailerImageField(storage=cloudfiles_storage, upload_to=cloudfiles_upload_to)Here is the traceback:
Environment: Request Method: POST Request URL: http://127.0.0.1:8000/admin/images/cloudfilesimage/add/ Django Version: 1.1.1 Python Version: 2.5.2 Installed Applications: ['django.contrib.auth', 'django.contrib.admin', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'easy_thumbnails', 'images'] Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware') Traceback: File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/core/handlers/base.py" in get_response 92. response = callback(request, *callback_args, **callback_kwargs) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/contrib/admin/sites.py" in root 490. return self.model_page(request, *url.split('/', 2)) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func 44. response = view_func(request, *args, **kwargs) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/contrib/admin/sites.py" in model_page 509. return admin_obj(request, rest_of_url) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/contrib/admin/options.py" in __call__ 1092. return self.add_view(request) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/db/transaction.py" in _commit_on_success 240. res = func(*args, **kw) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/contrib/admin/options.py" in add_view 734. self.save_model(request, new_object, form, change=False) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/contrib/admin/options.py" in save_model 557. obj.save() File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/db/models/base.py" in save 410. self.save_base(force_insert=force_insert, force_update=force_update) File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/db/models/base.py" in save_base 483. values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)] File "/home/pete/sandbox/cloudfiles/lib/python2.5/site-packages/django/db/models/fields/files.py" in pre_save 252. file.save(file.name, file, save=False) File "/home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/files.py" in save 376. **kwargs) File "/home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/files.py" in save 337. self.get_source_cache(create=True, update=True) File "/home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/files.py" in get_source_cache 290. storage=self.source_storage, name=self.name) File "/home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/models.py" in get_file 23. storage = Storage.objects.get_storage(storage) File "/home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/models.py" in get_storage 11. pickled = pickle.dumps(storage) File "/usr/lib/python2.5/pickle.py" in dumps 1366. Pickler(file, protocol).dump(obj) File "/usr/lib/python2.5/pickle.py" in dump 224. self.save(obj) File "/usr/lib/python2.5/pickle.py" in save 331. self.save_reduce(obj=obj, *rv) File "/usr/lib/python2.5/pickle.py" in save_reduce 419. save(state) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_dict 649. self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.5/pickle.py" in _batch_setitems 663. save(v) File "/usr/lib/python2.5/pickle.py" in save 331. self.save_reduce(obj=obj, *rv) File "/usr/lib/python2.5/pickle.py" in save_reduce 419. save(state) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_dict 649. self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.5/pickle.py" in _batch_setitems 663. save(v) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_inst 725. save(stuff) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_dict 649. self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.5/pickle.py" in _batch_setitems 663. save(v) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_inst 725. save(stuff) File "/usr/lib/python2.5/pickle.py" in save 286. f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.5/pickle.py" in save_dict 649. self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.5/pickle.py" in _batch_setitems 663. save(v) File "/usr/lib/python2.5/pickle.py" in save 306. rv = reduce(self.proto) File "/usr/lib/python2.5/copy_reg.py" in _reduce_ex 76. raise TypeError("a class that defines __slots__ without " Exception Type: TypeError at /admin/images/cloudfilesimage/add/ Exception Value: a class that defines __slots__ without defining __getstate__ cannot be pickled
Comments
-
diff --git a/easy_thumbnails/files.py b/easy_thumbnails/files.py index 763ad13..f362c2c 100644 --- a/easy_thumbnails/files.py +++ b/easy_thumbnails/files.py @@ -334,7 +334,7 @@ class ThumbnailerFieldFile(FieldFile, Thumbnailer): """ super(ThumbnailerFieldFile, self).save(name, content, *args, **kwargs) - self.get_source_cache(self, create=True, update=True) + self.get_source_cache(create=True, update=True) def delete(self, *args, **kwargs): """Comments
SmileyChris
Fri Oct 16 18:37:43 -0700 2009
| link
Fixed in d8799fd
-
In [6]: l.image.generate_thumbnail({'size':(50,50)}) --------------------------------------------------------------------------- Traceback (most recent call last) /home/pete/sandbox/cloudfiles/project/ in () /home/pete/sandbox/cloudfiles/src/easy-thumbnails/easy_thumbnails/files.py in generate_thumbnail(self, thumbnail_options) 176 filename = self.get_thumbnail_name(thumbnail_options) 177 thumbnail = ThumbnailFile(filename, ContentFile(data), --> 178 storage=self.thumbnail_storage) 179 thumbnail.image = thumbnail_image 180 thumbnail._committed = False : 'ThumbnailerImageFieldFile' object has no attribute 'thumbnail_storage'This fixes the issue:
diff --git a/easy_thumbnails/fields.py b/easy_thumbnails/fields.py index d49af50..ee77d2e 100644 --- a/easy_thumbnails/fields.py +++ b/easy_thumbnails/fields.py @@ -16,10 +16,11 @@ class ThumbnailerField(FileField): def __init__(self, *args, **kwargs): # Arguments not explicitly defined so that the normal ImageField # positional arguments can be used. - self.thumbnail_storage = kwargs.pop('thumbnail_storage', None) super(ThumbnailerField, self).__init__(*args, **kwargs) + self.thumbnail_storage = kwargs.pop('thumbnail_storage', self.storage) + def south_field_triple(self): """ Return a suitable description of this field for South.Comments
SmileyChris
Fri Oct 16 18:44:58 -0700 2009
| link
Hrm... think this is due to django's FieldFile not using super() in it's init method... grr.
SmileyChris
Fri Oct 16 19:23:37 -0700 2009
| link
Odd, can't seem to reproduce this in a test: have a look at 2affc77
SmileyChris
Wed Nov 11 13:12:02 -0800 2009
| link
ThumbnailerFieldFile now subclasses Thumbnailer, which sets self.thumbnail_storage





Here are the pip requirements to test. (I'll get you an API key in a PM)
Looks like you changed this at django-storages http://bitbucket.org/smileychris/django-storages/changeset/22b5ce7fd98e/. No issues with that storage object.
This is a problem with the cloudfiles backend in django-storages. I'll propose my branch for a merge sometime soon.