Changeset 1713
- Timestamp:
- 12/16/05 20:10:33 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/magic-removal/django/db/models/base.py
r1712 r1713 175 175 def _prepare(cls): 176 176 # 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 only191 # if the image field doesn't have width and height cache192 # 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))213 177 214 178 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) 217 181 218 182 RelatedField.do_pending_lookups(cls) … … 364 328 365 329 366 def _ _get_FIELD_display(self, field):330 def _get_FIELD_display(self, field): 367 331 value = getattr(self, field.attname) 368 332 return dict(field.choices).get(value, value) 369 333 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): 371 335 op = is_next and '>' or '<' 372 336 kwargs.setdefault('where', []).append('(%s %s %%s OR (%s = %%s AND %s.%s %s %%s))' % \ … … 379 343 return self.__class__._default_manager.get_object(**kwargs) 380 344 381 def _ _get_next_or_previous_in_order(self, is_next):345 def _get_next_or_previous_in_order(self, is_next): 382 346 cachename = "__%s_order_cache" % is_next 383 347 if not hasattr(self, cachename): … … 394 358 return getattr(self, cachename) 395 359 396 def _ _get_FIELD_filename(self, field):360 def _get_FIELD_filename(self, field): 397 361 return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)) 398 362 399 def _ _get_FIELD_url(self, field):363 def _get_FIELD_url(self, field): 400 364 if getattr(self, field.attname): # value is not blank 401 365 import urlparse … … 403 367 return '' 404 368 405 def _ _get_FIELD_size(self, field):369 def _get_FIELD_size(self, field): 406 370 return os.path.getsize(self.__get_FIELD_filename(field)) 407 371 408 def _ _save_FIELD_file(self, field, filename, raw_contents):372 def _save_FIELD_file(self, field, filename, raw_contents): 409 373 directory = field.get_directory_name() 410 374 try: # Create the date-based directory if it doesn't exist. … … 444 408 self.save() 445 409 446 _ _save_FIELD_file.alters_data = True447 448 def _ _get_FIELD_width(self, field):410 _save_FIELD_file.alters_data = True 411 412 def _get_FIELD_width(self, field): 449 413 return self.__get_image_dimensions(field)[0] 450 414 451 def _ _get_FIELD_height(self, field):415 def _get_FIELD_height(self, field): 452 416 return self.__get_image_dimensions(field)[1] 453 417 454 def _ _get_image_dimensions(self, field):418 def _get_image_dimensions(self, field): 455 419 cachename = "__%s_dimensions_cache" % field.name 456 420 if not hasattr(self, cachename): … … 460 424 return getattr(self, cachename) 461 425 462 def _ _get_foreign_key_object(self, field_with_rel):426 def _get_foreign_key_object(self, field_with_rel): 463 427 cache_var = field_with_rel.get_cache_name() 464 428 if not hasattr(self, cache_var): … … 475 439 return getattr(self, cache_var) 476 440 477 def _ _get_many_to_many_objects(self, field_with_rel):441 def _get_many_to_many_objects(self, field_with_rel): 478 442 cache_var = '_%s_cache' % field_with_rel.name 479 443 if not hasattr(self, cache_var): … … 491 455 return getattr(self, cache_var) 492 456 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)] 495 459 ids_to_add, ids_to_delete = dict([(i, 1) for i in id_list]), [] 496 460 for current_id in current_ids: … … 526 490 return True 527 491 528 _ _set_many_to_many_objects.alters_data = True492 _set_many_to_many_objects.alters_data = True 529 493 530 494 def _get_related(self, method_name, rel_class, rel_field, **kwargs): django/branches/magic-removal/django/db/models/fields/__init__.py
r1702 r1713 121 121 return cmp(self.creation_counter, other.creation_counter) 122 122 123 def contribute_to_class(self, cls, name):123 def set_attributes_from_name(self, name): 124 124 self.name = name 125 125 self.attname, self.column = self.get_attname_column() 126 126 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) 127 130 cls._meta.add_field(self) 131 if self.choices: 132 setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self)) 128 133 129 134 def set_name(self, name): … … 375 380 return datetime.datetime.now() 376 381 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)) 377 390 378 391 # Needed because of horrible auto_now[_add] behaviour wrt. editable … … 484 497 return field_list 485 498 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 486 506 def get_manipulator_field_objs(self): 487 507 return [formfields.FileUploadField, formfields.HiddenField] … … 531 551 def get_manipulator_field_objs(self): 532 552 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)) 533 563 534 564 def save_file(self, new_data, new_object, original_object, change, rel): django/branches/magic-removal/django/db/models/fields/related.py
r1704 r1713 58 58 return '%s__%s__exact' % (self.name, self.rel.get_related_field().name) 59 59 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)) 60 65 61 66 class ForeignKey(SharedMethods,Field): … … 258 263 return new_data 259 264 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 260 275 def contribute_to_related_class(self, cls, related): 261 276 rel_obj_name = related.get_method_name_part()
