Django

Code

Changeset 4609

Show
Ignore:
Timestamp:
02/26/07 11:17:11 (2 years ago)
Author:
jacob
Message:

Objects with FileFields? no longer get save() called multiple times from the AutomaticManipulator?! This fixes #639, #572, and likely others I don't know of.

This may be slightly backwards-incompatible: if you've been relying on the multiple-save behavior (why?), then you'll no longer see that happen.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/base.py

    r4607 r4609  
    357357        return os.path.getsize(self._get_FIELD_filename(field)) 
    358358 
    359     def _save_FIELD_file(self, field, filename, raw_contents): 
     359    def _save_FIELD_file(self, field, filename, raw_contents, save=True): 
    360360        directory = field.get_directory_name() 
    361361        try: # Create the date-based directory if it doesn't exist. 
     
    392392                setattr(self, field.height_field, height) 
    393393 
    394         # Save the object, because it has changed. 
    395         self.save() 
     394        # Save the object because it has changed unless save is False 
     395        if save: 
     396            self.save() 
    396397 
    397398    _save_FIELD_file.alters_data = True 
  • django/trunk/django/db/models/fields/__init__.py

    r4592 r4609  
    636636        setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self)) 
    637637        setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self)) 
    638         setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents: instance._save_FIELD_file(self, filename, raw_contents)) 
     638        setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents, save=True: instance._save_FIELD_file(self, filename, raw_contents, save)) 
    639639        dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls) 
    640640 
     
    654654        return [name_prefix + self.name + '_file', name_prefix + self.name] 
    655655 
    656     def save_file(self, new_data, new_object, original_object, change, rel): 
     656    def save_file(self, new_data, new_object, original_object, change, rel, save=True): 
    657657        upload_field_name = self.get_manipulator_field_names('')[0] 
    658658        if new_data.get(upload_field_name, False): 
    659659            func = getattr(new_object, 'save_%s_file' % self.name) 
    660660            if rel: 
    661                 func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"]
     661                func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"], save
    662662            else: 
    663                 func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"]
     663                func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"], save
    664664 
    665665    def get_directory_name(self): 
     
    705705            setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self)) 
    706706 
    707     def save_file(self, new_data, new_object, original_object, change, rel): 
    708         FileField.save_file(self, new_data, new_object, original_object, change, rel
     707    def save_file(self, new_data, new_object, original_object, change, rel, save=True): 
     708        FileField.save_file(self, new_data, new_object, original_object, change, rel, save
    709709        # If the image has height and/or width field(s) and they haven't 
    710710        # changed, set the width and/or height field(s) back to their original 
    711711        # values. 
    712         if change and (self.width_field or self.height_field)
     712        if change and (self.width_field or self.height_field) and save
    713713            if self.width_field: 
    714714                setattr(new_object, self.width_field, getattr(original_object, self.width_field)) 
  • django/trunk/django/db/models/manipulators.py

    r4486 r4609  
    9797            params[self.opts.pk.attname] = self.obj_key 
    9898 
    99         # First, save the basic object itself. 
     99        # First, create the basic object itself. 
    100100        new_object = self.model(**params) 
    101         new_object.save() 
    102  
    103         # Now that the object's been saved, save any uploaded files. 
     101 
     102        # Now that the object's been created, save any uploaded files. 
    104103        for f in self.opts.fields: 
    105104            if isinstance(f, FileField): 
    106                 f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False) 
     105                f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False, save=False) 
     106 
     107        # Now save the object 
     108        new_object.save() 
    107109 
    108110        # Calculate which primary fields have changed.