Django

Code

Changeset 1713

Show
Ignore:
Timestamp:
12/16/05 20:10:33 (3 years ago)
Author:
rjwittams
Message:

Moved magic method addition to fields

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/db/models/base.py

    r1712 r1713  
    175175    def _prepare(cls): 
    176176        # Creates some methods once self._meta has been populated. 
    177         for f in cls._meta.fields: 
    178             if f.choices: 
    179                 setattr(cls, 'get_%s_display' % f.name, curry(cls.__get_FIELD_display, field=f)) 
    180             if isinstance(f, DateField): 
    181                 if not f.null: 
    182                     setattr(cls, 'get_next_by_%s' % f.name, curry(cls.__get_next_or_previous_by_FIELD, field=f, is_next=True)) 
    183                     setattr(cls, 'get_previous_by_%s' % f.name, curry(cls.__get_next_or_previous_by_FIELD, field=f, is_next=False)) 
    184             elif isinstance(f, FileField): 
    185                 setattr(cls, 'get_%s_filename' % f.name, curry(cls.__get_FIELD_filename, field=f)) 
    186                 setattr(cls, 'get_%s_url' % f.name, curry(cls.__get_FIELD_url, field=f)) 
    187                 setattr(cls, 'get_%s_size' % f.name, curry(cls.__get_FIELD_size, field=f)) 
    188                 setattr(cls, 'save_%s_file' % f.name, curry(cls.__save_FIELD_file, field=f)) 
    189                 if isinstance(f, ImageField): 
    190                     # Add get_BLAH_width and get_BLAH_height methods, but only 
    191                     # if the image field doesn't have width and height cache 
    192                     # fields. 
    193                     if not f.width_field: 
    194                         setattr(cls, 'get_%s_width' % f.name, curry(cls.__get_FIELD_width, field=f)) 
    195                     if not f.height_field: 
    196                         setattr(cls, 'get_%s_height' % f.name, curry(cls.__get_FIELD_height, field=f)) 
    197  
    198  
    199             # Add methods for many-to-one related objects. 
    200             # EXAMPLES: Choice.get_poll(), Story.get_dateline() 
    201             if isinstance(f.rel, ManyToOne): 
    202                 setattr(cls, 'get_%s' % f.name, curry(cls.__get_foreign_key_object, field_with_rel=f)) 
    203  
    204         # Create the default class methods. 
    205         for f in cls._meta.many_to_many: 
    206             # Add "get_thingie" methods for many-to-many related objects. 
    207             # EXAMPLES: Poll.get_site_list(), Story.get_byline_list() 
    208             setattr(cls, 'get_%s_list' % f.rel.singular, curry(cls.__get_many_to_many_objects, field_with_rel=f)) 
    209  
    210             # Add "set_thingie" methods for many-to-many related objects. 
    211             # EXAMPLES: Poll.set_sites(), Story.set_bylines() 
    212             setattr(cls, 'set_%s' % f.name, curry(cls.__set_many_to_many_objects, field_with_rel=f)) 
    213177 
    214178        if cls._meta.order_with_respect_to: 
    215             cls.get_next_in_order = curry(cls.__get_next_or_previous_in_order, is_next=True) 
    216             cls.get_previous_in_order = curry(cls.__get_next_or_previous_in_order, is_next=False) 
     179            cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True) 
     180            cls.get_previous_in_order = curry(cls._get_next_or_previous_in_order, is_next=False) 
    217181 
    218182        RelatedField.do_pending_lookups(cls) 
     
    364328 
    365329 
    366     def __get_FIELD_display(self, field): 
     330    def _get_FIELD_display(self, field): 
    367331        value = getattr(self, field.attname) 
    368332        return dict(field.choices).get(value, value) 
    369333 
    370     def __get_next_or_previous_by_FIELD(self, field, is_next, **kwargs): 
     334    def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs): 
    371335        op = is_next and '>' or '<' 
    372336        kwargs.setdefault('where', []).append('(%s %s %%s OR (%s = %%s AND %s.%s %s %%s))' % \ 
     
    379343        return self.__class__._default_manager.get_object(**kwargs) 
    380344 
    381     def __get_next_or_previous_in_order(self, is_next): 
     345    def _get_next_or_previous_in_order(self, is_next): 
    382346        cachename = "__%s_order_cache" % is_next 
    383347        if not hasattr(self, cachename): 
     
    394358        return getattr(self, cachename) 
    395359 
    396     def __get_FIELD_filename(self, field): 
     360    def _get_FIELD_filename(self, field): 
    397361        return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)) 
    398362 
    399     def __get_FIELD_url(self, field): 
     363    def _get_FIELD_url(self, field): 
    400364        if getattr(self, field.attname): # value is not blank 
    401365            import urlparse 
     
    403367        return '' 
    404368 
    405     def __get_FIELD_size(self, field): 
     369    def _get_FIELD_size(self, field): 
    406370        return os.path.getsize(self.__get_FIELD_filename(field)) 
    407371 
    408     def __save_FIELD_file(self, field, filename, raw_contents): 
     372    def _save_FIELD_file(self, field, filename, raw_contents): 
    409373        directory = field.get_directory_name() 
    410374        try: # Create the date-based directory if it doesn't exist. 
     
    444408        self.save() 
    445409 
    446     __save_FIELD_file.alters_data = True 
    447  
    448     def __get_FIELD_width(self, field): 
     410    _save_FIELD_file.alters_data = True 
     411 
     412    def _get_FIELD_width(self, field): 
    449413        return self.__get_image_dimensions(field)[0] 
    450414 
    451     def __get_FIELD_height(self, field): 
     415    def _get_FIELD_height(self, field): 
    452416        return self.__get_image_dimensions(field)[1] 
    453417 
    454     def __get_image_dimensions(self, field): 
     418    def _get_image_dimensions(self, field): 
    455419        cachename = "__%s_dimensions_cache" % field.name 
    456420        if not hasattr(self, cachename): 
     
    460424        return getattr(self, cachename) 
    461425 
    462     def __get_foreign_key_object(self, field_with_rel): 
     426    def _get_foreign_key_object(self, field_with_rel): 
    463427        cache_var = field_with_rel.get_cache_name() 
    464428        if not hasattr(self, cache_var): 
     
    475439        return getattr(self, cache_var) 
    476440 
    477     def __get_many_to_many_objects(self, field_with_rel): 
     441    def _get_many_to_many_objects(self, field_with_rel): 
    478442        cache_var = '_%s_cache' % field_with_rel.name 
    479443        if not hasattr(self, cache_var): 
     
    491455        return getattr(self, cache_var) 
    492456 
    493     def __set_many_to_many_objects(self, id_list, field_with_rel): 
    494         current_ids = [obj.id for obj in self.__get_many_to_many_objects(field_with_rel)] 
     457    def _set_many_to_many_objects(self, id_list, field_with_rel): 
     458        current_ids = [obj.id for obj in self._get_many_to_many_objects(field_with_rel)] 
    495459        ids_to_add, ids_to_delete = dict([(i, 1) for i in id_list]), [] 
    496460        for current_id in current_ids: 
     
    526490        return True 
    527491 
    528     __set_many_to_many_objects.alters_data = True 
     492    _set_many_to_many_objects.alters_data = True 
    529493 
    530494    def _get_related(self, method_name, rel_class, rel_field, **kwargs): 
  • django/branches/magic-removal/django/db/models/fields/__init__.py

    r1702 r1713  
    121121        return cmp(self.creation_counter, other.creation_counter) 
    122122 
    123     def contribute_to_class(self, cls, name): 
     123    def set_attributes_from_name(self, name): 
    124124        self.name = name 
    125125        self.attname, self.column = self.get_attname_column() 
    126126        self.verbose_name = self.verbose_name or (name and name.replace('_', ' ')) 
     127 
     128    def contribute_to_class(self, cls, name): 
     129        self.set_attributes_from_name(name) 
    127130        cls._meta.add_field(self) 
     131        if self.choices: 
     132            setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self)) 
    128133 
    129134    def set_name(self, name): 
     
    375380            return datetime.datetime.now() 
    376381        return value 
     382 
     383    def contribute_to_class(self,cls, name ): 
     384        super(DateField,self).contribute_to_class(cls, name) 
     385        if not self.null: 
     386            setattr(cls, 'get_next_by_%s' % self.name,  
     387                     curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True)) 
     388            setattr(cls, 'get_previous_by_%s' % self.name,  
     389                     curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))  
    377390 
    378391    # Needed because of horrible auto_now[_add] behaviour wrt. editable 
     
    484497        return field_list 
    485498 
     499    def contribute_to_class(self, cls, name): 
     500        super(FileField, self).contribute_to_class(cls, name) 
     501        setattr(cls, 'get_%s_filename' % self.name, curry(cls._get_FIELD_filename, field=self)) 
     502        setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self)) 
     503        setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self)) 
     504        setattr(cls, 'save_%s_file' % self.name, curry(cls._save_FIELD_file, field=self)) 
     505 
    486506    def get_manipulator_field_objs(self): 
    487507        return [formfields.FileUploadField, formfields.HiddenField] 
     
    531551    def get_manipulator_field_objs(self): 
    532552        return [formfields.ImageUploadField, formfields.HiddenField] 
     553 
     554    def contribute_to_class(self, cls, name): 
     555        super(FileField, self).contribute_to_class(cls, name) 
     556        # Add get_BLAH_width and get_BLAH_height methods, but only 
     557        # if the image field doesn't have width and height cache 
     558        # fields. 
     559        if not self.width_field: 
     560            setattr(cls, 'get_%s_width' % self.name, curry(cls._get_FIELD_width, field=self)) 
     561        if not self.height_field: 
     562            setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self)) 
    533563 
    534564    def save_file(self, new_data, new_object, original_object, change, rel): 
  • django/branches/magic-removal/django/db/models/fields/related.py

    r1704 r1713  
    5858        return '%s__%s__exact' % (self.name, self.rel.get_related_field().name) 
    5959 
     60    def contribute_to_class(self, cls, name): 
     61        super(SharedMethods, self).contribute_to_class(cls, name) 
     62        # Add methods for many-to-one related objects. 
     63        # EXAMPLES: Choice.get_poll(), Story.get_dateline() 
     64        setattr(cls, 'get_%s' % self.name, curry(cls._get_foreign_key_object, field_with_rel=self)) 
    6065 
    6166class ForeignKey(SharedMethods,Field): 
     
    258263        return new_data 
    259264 
     265    def contribute_to_class(self, cls, name): 
     266        super(ManyToManyField, self).contribute_to_class(cls, name) 
     267        # Add "get_thingie" methods for many-to-many related objects. 
     268        # EXAMPLES: Poll.get_site_list(), Story.get_byline_list() 
     269        setattr(cls, 'get_%s_list' % self.rel.singular, curry(cls._get_many_to_many_objects, field_with_rel=self)) 
     270 
     271        # Add "set_thingie" methods for many-to-many related objects. 
     272        # EXAMPLES: Poll.set_sites(), Story.set_bylines() 
     273        setattr(cls, 'set_%s' % self.name, curry(cls._set_many_to_many_objects, field_with_rel=self)) 
     274 
    260275    def contribute_to_related_class(self, cls, related): 
    261276        rel_obj_name = related.get_method_name_part()