| | 371 | # We must refactor the attributes around a little. All Field class instances will be given |
| | 372 | # names (as needed) and moved to the fields list. |
| | 373 | |
| | 374 | attrs["fields"] = attrs.has_key("fields") and list(attrs["fields"]) or [] |
| | 375 | |
| | 376 | def handle_ForeignKey(obj): |
| | 377 | if isinstance(obj, Model): |
| | 378 | attrs["fields"].append(ForeignKey(obj)) |
| | 379 | elif type(obj) in (list, tuple): |
| | 380 | if isinstance(obj[0], ModelBase) and type(obj[1]) == dict: |
| | 381 | attrs["fields"].append(ForeignKey(obj[0], **obj[1])) |
| | 382 | else: |
| | 383 | for i in obj: handle_ForeignKey(i) |
| | 384 | else: |
| | 385 | raise ValueError("Cannot make ForeignKey from "+str(obj)) |
| | 386 | |
| | 387 | def handle_field(obj, name): |
| | 388 | if isinstance(obj, Field): #Check if this is a field |
| | 389 | if isinstance(obj,(ForeignKey, ManyToManyField, OneToOneField)): |
| | 390 | obj.rel.name = name |
| | 391 | else: |
| | 392 | obj.set_name(name) |
| | 393 | attrs["fields"].append(obj) |
| | 394 | return True |
| | 395 | elif name == "ForeignKey": |
| | 396 | handle_ForeignKey(obj) |
| | 397 | return True |
| | 398 | return False |
| | 399 | |
| | 400 | # loop through the attributes, and take out the fields. |
| | 401 | for key in attrs.keys()[:]: |
| | 402 | if handle_field(attrs[key], key): |
| | 403 | del attrs[key] # If the attr was added to fields, we want to delete it. |
| | 404 | |
| | 405 | if attrs.has_key("Field"): |
| | 406 | for name in dir(attrs["Field"]): |
| | 407 | handle_field(getattr(attrs["Field"],name),name) |
| | 408 | del attrs["Field"] |
| | 409 | |
| | 410 | if attrs.has_key("Meta"): |
| | 411 | for name in dir(attrs["Meta"]): |
| | 412 | if name.startswith("__"): continue |
| | 413 | if name in ("fields",): |
| | 414 | attrs[name] += getattr(attrs["Meta"],name) |
| | 415 | else: |
| | 416 | attrs[name] = getattr(attrs["Meta"],name) |
| | 417 | del attrs["Meta"] |
| | 418 | |
| | 419 | # Sort the fields, so that they appear in the correct order. |
| | 420 | attrs["fields"].sort(lambda x,y: x.creation_counter - y.creation_counter) |
| | 421 | |
| 1555 | 1610 | maxlength=None, unique=False, blank=False, null=False, db_index=None, |
| 1556 | 1611 | core=False, rel=None, default=NOT_PROVIDED, editable=True, |
| 1557 | 1612 | prepopulate_from=None, unique_for_date=None, unique_for_month=None, |
| 1558 | 1613 | unique_for_year=None, validator_list=None, choices=None, radio_admin=None, |
| 1559 | 1614 | help_text=''): |
| 1560 | 1615 | self.name = name |
| | 1642 | # Increace the creation counter, and save our local copy. |
| | 1643 | self.creation_counter = Field.creation_counter |
| | 1644 | Field.creation_counter += 1 |
| | 1645 | |
| | 1646 | def set_name(self, name ): |
| | 1647 | """ |
| | 1648 | Sets the name, and generates the verbose_name from it if needed. |
| | 1649 | This function is here for when the name needs to be set later, (such as if it needs to be obtained from |
| | 1650 | a the attribute name that stores the Field instance.) |
| | 1651 | """ |
| | 1652 | if not self.original_verbose_name: |
| | 1653 | # If the verbose name was originally not specified, we will assume that |
| | 1654 | # the user intends for the first argument passed to __init__ to be the verbose_name. |
| | 1655 | self.verbose_name = self.name |
| | 1656 | |
| | 1657 | self.name = name |
| | 1658 | self.verbose_name = self.verbose_name or name and name.replace('_', ' ') |
| | 1659 | |