Changeset 982
- Timestamp:
- 10/20/05 14:07:15 (3 years ago)
- Files:
-
- django/branches/new-admin/django/bin/validate.py (modified) (1 diff)
- django/branches/new-admin/django/contrib/admin/templates/admin/change_form.html (modified) (1 diff)
- django/branches/new-admin/django/contrib/admin/views/main.py (modified) (8 diffs)
- django/branches/new-admin/django/core/formfields.py (modified) (4 diffs)
- django/branches/new-admin/django/core/management.py (modified) (2 diffs)
- django/branches/new-admin/django/core/meta/fields.py (modified) (9 diffs)
- django/branches/new-admin/django/core/meta/__init__.py (modified) (9 diffs)
- django/branches/new-admin/django/core/template/loader.py (modified) (2 diffs)
- django/branches/new-admin/django/core/template/loaders/app_directories.py (modified) (1 diff)
- django/branches/new-admin/django/models/__init__.py (modified) (1 diff)
- django/branches/new-admin/tests/runtests.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/new-admin/django/bin/validate.py
r3 r982 14 14 for f in opts.fields: 15 15 if isinstance(f, meta.ManyToManyField): 16 assert isinstance(f.rel, meta.ManyToMany), "ManyToManyField %s should have 'rel' set to a ManyToMany instance." % f.name 16 assert isinstance(f.rel, meta.ManyToMany), \ 17 "ManyToManyField %s should have 'rel' set to a ManyToMany instance." % f.name 17 18 # Inline related objects. 18 for rel_opts, rel_field in opts.get_inline_related_objects(): 19 assert len([f for f in rel_opts.fields if f.core]) > 0, "At least one field in %s should have core=True, because it's being edited inline by %s." % (rel_opts.object_name, opts.object_name) 19 for related in opts.get_followed_related_objects(): 20 assert len([f for f in related.opts.fields if f.core]) > 0, \ 21 "At least one field in %s should have core=True, because it's being edited inline by %s." % \ 22 (related.opts.object_name, opts.object_name) 20 23 # All related objects. 21 24 related_apps_seen = [] 22 for rel_opts, rel_field in opts.get_all_related_objects(): 23 if rel_opts in related_apps_seen: 24 assert rel_field.rel.related_name is not None, "Relationship in field %s.%s needs to set 'related_name' because more than one %s object is referenced in %s." % (rel_opts.object_name, rel_field.name, opts.object_name, rel_opts.object_name) 25 related_apps_seen.append(rel_opts) 25 for related in opts.get_all_related_objects(): 26 if related.opts in related_apps_seen: 27 assert related.field.rel.related_name is not None, \ 28 "Relationship in field %s.%s needs to set 'related_name' because more than one" \ 29 " %s object is referenced in %s." % \ 30 (related.opts.object_name, related.field.name, opts.object_name, rel_opts.object_name) 31 related_apps_seen.append(related.opts) 26 32 # Etc. 27 33 if opts.admin is not None: 28 assert opts.admin.ordering or opts.ordering, "%s needs to set 'ordering' on either its 'admin' or its model, because it has 'admin' set." % opts.object_name 34 assert opts.admin.ordering or opts.ordering, \ 35 "%s needs to set 'ordering' on either its 'admin' or its model," \ 36 "because it has 'admin' set." % \ 37 opts.object_name 29 38 30 39 if __name__ == "__main__": django/branches/new-admin/django/contrib/admin/templates/admin/change_form.html
r966 r982 22 22 <form {{ form_enc_attrib }} action='{{ form_url }}' method="post"> 23 23 24 25 24 {% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %} 26 25 {% if save_on_top %}{% submit_row %}{% endif %} 27 26 {% if form.error_dict %}<p class="errornote">Please correct the error{{ form.error_dict.items|pluralize }} below.</p>{% endif %} 28 27 {% for bound_field_set in bound_field_sets %} 29 <fieldset class="module aligned {{ bound_field_set.classes }}"> 30 28 <fieldset class="module aligned {{ bound_field_set.classes }}"> 31 29 {% if bound_field_set.name %}<h2>{{bound_field_set.name }}</h2>{% endif %} 32 30 {% for bound_field_line in bound_field_set %} django/branches/new-admin/django/contrib/admin/views/main.py
r981 r982 519 519 return t 520 520 521 def get_javascript_imports(opts,auto_populated_fields, ordered_objects, admin_field_objs):521 def get_javascript_imports(opts,auto_populated_fields, ordered_objects, field_sets): 522 522 # Put in any necessary JavaScript imports. 523 523 js = ['js/core.js', 'js/admin/RelatedObjectLookups.js'] … … 531 531 js.extend(opts.admin.js) 532 532 seen_collapse = False 533 for _, options in admin_field_objs:534 if not seen_collapse and 'collapse' in options.get('classes', ''):533 for field_set in field_sets: 534 if not seen_collapse and 'collapse' in field_set.classes: 535 535 seen_collapse = True 536 536 js.append('js/admin/CollapsedFieldsets.js' ) 537 537 try: 538 for field_li st in options['fields']:539 for f in field_li st:538 for field_line in field_set: 539 for f in field_line: 540 540 if f.rel and isinstance(f, meta.ManyToManyField) and f.rel.filter_interface: 541 541 js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js']) … … 609 609 610 610 def fill_extra_context(opts, app_label, context, add=False, change=False, show_delete=False, form_url=''): 611 admin_field_objs = opts.admin.get_field_objs(opts)612 613 611 ordered_objects = opts.get_ordered_objects()[:] 614 612 auto_populated_fields = [f for f in opts.fields if f.prepopulate_from] 615 616 javascript_imports = get_javascript_imports(opts, auto_populated_fields, ordered_objects, admin_field_objs); 617 618 if ordered_objects: 619 coltype = 'colMS' 620 else: 621 coltype = 'colM' 622 613 coltype = ordered_objects and 'colMS' or 'colM' 614 623 615 has_absolute_url = hasattr(opts.get_model_module().Klass, 'get_absolute_url') 624 625 616 form_enc_attrib = opts.has_field_type(meta.FileField) and 'enctype="multipart/form-data" ' or '' 626 627 617 form = context['form'] 628 618 original = context['original'] … … 631 621 bound_field_sets = [field_set.bind(form, original, AdminBoundFieldSet) 632 622 for field_set in field_sets] 633 634 first_form_field = bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0]; 635 636 inline_related_objects = opts.get_inline_related_objects_wrapped() 637 623 624 javascript_imports = get_javascript_imports(opts, auto_populated_fields, ordered_objects, field_sets); 625 first_form_field = bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0]; 626 inline_related_objects = opts.get_followed_related_objects() 638 627 ordered_object_names = ' '.join(['object.%s' % o.pk.name for o in ordered_objects]) 639 628 … … 740 729 raise Http404 741 730 742 inline_related_objects = opts.get_inline_related_objects()743 731 if request.POST: 744 732 new_data = request.POST.copy() … … 807 795 form.order_objects = [] 808 796 809 for rel_opts, rel_field in inline_related_objects: 810 if rel_opts.order_with_respect_to and rel_opts.order_with_respect_to.rel and rel_opts.order_with_respect_to.rel.to == opts: 811 orig_list = getattr(manipulator.original_object, 'get_%s_list' % opts.get_rel_object_method_name(rel_opts, rel_field))() 797 for related in opts.get_followed_related_objects(): 798 wrt = related.opts.order_with_respect_to 799 if wrt and wrt.rel and wrt.rel.to == opts: 800 func = getattr(manipulator.original_object, 'get_%s_list' % 801 opts.get_rel_object_method_name(rel_opts, rel_field)) 802 orig_list = func() 812 803 form.order_objects.extend(orig_list) 813 804 814 805 c = Context(request, { 815 806 'title': 'Change %s' % opts.verbose_name, … … 837 828 return # Avoid recursing too deep. 838 829 objects_seen = [] 839 for rel _opts, rel_field in opts.get_all_related_objects():840 if rel _opts in objects_seen:830 for related in opts.get_all_related_objects(): 831 if related.opts in objects_seen: 841 832 continue 842 833 objects_seen.append(rel_opts) 843 rel_opts_name = opts.get_rel_object_method_name(rel _opts, rel_field)844 if isinstance(rel _field.rel, meta.OneToOne):834 rel_opts_name = opts.get_rel_object_method_name(related.opts, related.field) 835 if isinstance(related.field.rel, meta.OneToOne): 845 836 try: 846 837 sub_obj = getattr(obj, 'get_%s' % rel_opts_name)() … … 849 840 else: 850 841 if rel_opts.admin: 851 p = '%s.%s' % (rel _opts.app_label, rel_opts.get_delete_permission())842 p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) 852 843 if not user.has_perm(p): 853 perms_needed.add(rel _opts.verbose_name)844 perms_needed.add(related.opts.verbose_name) 854 845 # We don't care about populating deleted_objects now. 855 846 continue 856 if rel _field.rel.edit_inline or not rel_opts.admin:847 if related.field.rel.edit_inline or not related.opts.admin: 857 848 # Don't display link to edit, because it either has no 858 849 # admin or is edited inline. 859 nh(deleted_objects, current_depth, ['%s: %r' % (capfirst(rel _opts.verbose_name), sub_obj), []])850 nh(deleted_objects, current_depth, ['%s: %r' % (capfirst(related.opts.verbose_name), sub_obj), []]) 860 851 else: 861 852 # Display a link to the admin page. 862 853 nh(deleted_objects, current_depth, ['%s: <a href="../../../../%s/%s/%s/">%r</a>' % \ 863 (capfirst(rel _opts.verbose_name), rel_opts.app_label, rel_opts.module_name,864 getattr(sub_obj, rel _opts.pk.column), sub_obj), []])865 _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, rel _opts, current_depth+2)854 (capfirst(related.opts.verbose_name), related.opts.app_label, related.opts.module_name, 855 getattr(sub_obj, related.opts.pk.column), sub_obj), []]) 856 _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2) 866 857 else: 867 858 has_related_objs = False 868 859 for sub_obj in getattr(obj, 'get_%s_list' % rel_opts_name)(): 869 860 has_related_objs = True 870 if rel _field.rel.edit_inline or not rel_opts.admin:861 if related.field.rel.edit_inline or not related.opts.admin: 871 862 # Don't display link to edit, because it either has no 872 863 # admin or is edited inline. 873 nh(deleted_objects, current_depth, ['%s: %s' % (capfirst(rel _opts.verbose_name), strip_tags(repr(sub_obj))), []])864 nh(deleted_objects, current_depth, ['%s: %s' % (capfirst(related.opts.verbose_name), strip_tags(repr(sub_obj))), []]) 874 865 else: 875 866 # Display a link to the admin page. 876 867 nh(deleted_objects, current_depth, ['%s: <a href="../../../../%s/%s/%s/">%s</a>' % \ 877 (capfirst(rel _opts.verbose_name), rel_opts.app_label, rel_opts.module_name, sub_obj.id, strip_tags(repr(sub_obj))), []])878 _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, rel _opts, current_depth+2)868 (capfirst(related.opts.verbose_name), related.opts.app_label, related.opts.module_name, sub_obj.id, strip_tags(repr(sub_obj))), []]) 869 _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2) 879 870 # If there were related objects, and the user doesn't have 880 871 # permission to delete them, add the missing perm to perms_needed. 881 if rel _opts.admin and has_related_objs:882 p = '%s.%s' % (rel _opts.app_label, rel_opts.get_delete_permission())872 if related.opts.admin and has_related_objs: 873 p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) 883 874 if not user.has_perm(p): 884 875 perms_needed.add(rel_opts.verbose_name) django/branches/new-admin/django/core/formfields.py
r981 r982 89 89 expected to deal with invalid input. 90 90 """ 91 """ 92 for field in self.fields: 93 """ 94 95 for field in self.fields: 96 field.convert_post_data(new_data) 91 for field in self.fields: 92 field.convert_post_data(new_data) 97 93 98 94 class FormWrapper: … … 102 98 prepopulated data and validation error messages to the formfield objects. 103 99 """ 104 def __init__(self, manipulator, data, error_dict, edit_inline = False):100 def __init__(self, manipulator, data, error_dict, edit_inline = True): 105 101 self.manipulator, self.data = manipulator, data 106 102 self.error_dict = error_dict 107 103 self._inline_collections = None 108 104 self.edit_inline = edit_inline 109 105 110 106 def __repr__(self): 111 107 return repr(self.__dict__) … … 247 243 collection[field_name] = FormFieldWrapper(field, data, errors) 248 244 wrapper.append(FormFieldCollection(collection)) 249 self._collections = wrapper 245 self._collections = wrapper 250 246 251 247 class FormField: … … 294 290 if data is None: 295 291 data = '' 296 return data292 return data 297 293 298 294 def convert_post_data(self, new_data): django/branches/new-admin/django/core/management.py
r981 r982 302 302 cursor.execute("INSERT INTO %s (domain, name) VALUES ('mysite.com', 'My Django site')" % core.Site._meta.db_table) 303 303 except Exception, e: 304 sys.stderr.write("Error: The database couldn't be initialized.\n%s\n" % e) 304 sys.stderr.write("Error: The database couldn't be initialized.\n%s\n" % e) 305 305 try: 306 306 db.db.rollback() 307 307 except UnboundLocalError: 308 308 pass 309 sys.exit(1)309 raise 310 310 else: 311 311 db.db.commit() … … 583 583 584 584 # Check core=True, if needed. 585 for rel _opts, rel_field in opts.get_inline_related_objects():585 for related in opts.get_followed_related_objects(): 586 586 try: 587 for f in rel _opts.fields:587 for f in related.opts.fields: 588 588 if f.core: 589 589 raise StopIteration 590 e.add(rel _opts, "At least one field in %s should have core=True, because it's being edited inline by %s.%s." % (rel_opts.object_name, opts.module_name, opts.object_name))590 e.add(related.opts, "At least one field in %s should have core=True, because it's being edited inline by %s.%s." % (related.opts.object_name, opts.module_name, opts.object_name)) 591 591 except StopIteration: 592 592 pass django/branches/new-admin/django/core/meta/fields.py
r981 r982 49 49 raise validators.ValidationError, "%s with this %s already exists." % (capfirst(opts.verbose_name), f.verbose_name) 50 50 51 class BoundField(object): 52 def __init__(self, field, field_mapping, original): 53 self.field = field 54 self.original = original 55 self.form_fields = self.resolve_form_fields(field_mapping) 56 57 def resolve_form_fields(self, field_mapping): 58 return [field_mapping[name] for name in self.field.get_manipulator_field_names('')] 59 60 def as_field_list(self): 61 return [self.field] 62 63 def original_value(self): 64 if self.original: 65 return self.original.__dict__[self.field.column] 66 67 def __repr__(self): 68 return "BoundField:(%s, %s)" %( self.field.name, self.form_fields) 69 51 70 class Field(object): 52 71 53 72 # Designates whether empty strings fundamentally are allowed at the 54 73 # database level. … … 284 303 Returns a dictionary mapping the field's manipulator field names to its 285 304 "flattened" string values for the admin view. Obj is the instance to extract the 286 values from. 305 values from. 287 306 """ 288 307 return { self.get_db_column(): self._get_val_from_obj(obj)} … … 293 312 else: 294 313 return self.editable 314 315 def bind(self, fieldmapping, original, bound_field_class=BoundField): 316 return bound_field_class(self, fieldmapping, original) 295 317 296 318 class AutoField(Field): … … 659 681 660 682 def flatten_data(self, follow, obj = None): 661 if not obj: 683 if not obj: 662 684 # In required many-to-one fields with only one available choice, 663 685 # select that one available choice. Note: We have to check that … … 730 752 new_data[self.name] = [choices_list[0][0]] 731 753 return new_data 732 733 754 734 755 class OneToOneField(IntegerField): … … 797 818 self.raw_id_admin = raw_id_admin 798 819 799 800 class BoundField(object):801 def __init__(self, field, field_mapping, original):802 self.field = field803 self.form_fields = self.resolve_form_fields(field_mapping)804 self.original = original805 806 def resolve_form_fields(self, field_mapping):807 return [field_mapping[name] for name in self.field.get_manipulator_field_names('')]808 809 def as_field_list(self):810 return [self.field]811 812 def original_value(self):813 return self.original.__dict__[self.field.name]814 815 def __repr__(self):816 return "BoundField:(%s, %s)" %( self.field.name, self.form_fields)817 818 820 class BoundFieldLine(object): 819 821 def __init__(self, field_line, field_mapping, original, bound_field_class=BoundField): 820 self.bound_fields = [bound_field_class(field, field_mapping, original) for field in field_line] 822 self.bound_fields = [field.bind(field_mapping, original, bound_field_class) 823 for field in field_line] 821 824 822 825 def __iter__(self): … … 882 885 return len(self.field_lines) 883 886 884 885 887 class Admin: 886 888 def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, … … 894 896 self.search_fields = search_fields or [] 895 897 self.save_on_top = save_on_top 896 897 def get_field_objs(self, opts):898 """899 Returns self.fields, except with fields as Field objects instead of900 field names. If self.fields is None, defaults to putting every901 non-AutoField field with editable=True in a single fieldset.902 903 returns a list of lists of name, dict904 the dict has attribs 'fields' and maybe 'classes'.905 fields is a list of subclasses of Field.906 """907 if self.fields is None:908 field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),)909 else:910 field_struct = self.fields911 new_fieldset_list = []912 for fieldset in field_struct:913 new_fieldset = [fieldset[0], {}]914 new_fieldset[1].update(fieldset[1])915 admin_fields = []916 for field_name_or_list in fieldset[1]['fields']:917 if isinstance(field_name_or_list, basestring):918 admin_fields.append([opts.get_field(field_name_or_list)])919 else:920 admin_fields.append([opts.get_field(field_name) for field_name in field_name_or_list])921 new_fieldset[1]['fields'] = admin_fields922 new_fieldset_list.append(new_fieldset)923 return new_fieldset_list924 898 925 899 def get_field_sets(self, opts): … … 931 905 field_struct = self.fields 932 906 933 934 907 new_fieldset_list = [] 935 908 for fieldset in field_struct: 936 909 name = fieldset[0] 937 910 fs_options = fieldset[1] 938 classes = fs_options.get('classes', None)911 classes = fs_options.get('classes', () ) 939 912 line_specs = fs_options['fields'] 940 913 new_fieldset_list.append(FieldSet(name, classes, opts.get_field, line_specs) ) django/branches/new-admin/django/core/meta/__init__.py
r981 r982 251 251 return fields 252 252 253 class BoundRelatedObject(object): 254 pass 253 255 254 256 class Options: … … 402 404 for f in klass._meta.fields: 403 405 if f.rel and self == f.rel.to: 404 rel_objs.append( (klass._meta, f))406 rel_objs.append(RelatedObject(self, klass._meta, f)) 405 407 if self.has_related_links: 406 408 # Manually add RelatedLink objects, which are a special case. … … 416 418 'content_type__python_module_name__exact': self.module_name, 417 419 }) 418 rel_objs.append( (relatedlinks.RelatedLink._meta, link_field))420 rel_objs.append(RelatedObject(self, relatedlinks.RelatedLink._meta, link_field)) 419 421 self._all_related_objects = rel_objs 420 422 return rel_objs 421 422 def get_inline_related_objects(self):423 return [(a, b) for a, b in self.get_all_related_objects() if b.rel.edit_inline]424 425 def get_inline_related_objects_wrapped(self):426 return [RelatedObject(self, opts, field) for opts, field in self.get_all_related_objects() if field.rel.edit_inline]427 428 def get_all_related_objects_wrapped(self):429 return [RelatedObject(self, opts, field) for opts, field in self.get_all_related_objects()]430 423 431 424 def get_followed_related_objects(self, follow=None): 432 425 if follow == None: 433 426 follow = self.get_follow() 434 return [f for f in self.get_all_related_objects _wrapped() if follow.get(f.name, None) ]427 return [f for f in self.get_all_related_objects() if follow.get(f.name, None) ] 435 428 436 429 def get_data_holders(self, follow=None): 437 430 if follow == None : 438 431 follow = self.get_follow() 439 return [f for f in self.fields + self.many_to_many + self.get_all_related_objects _wrapped() if follow.get(f.name, None) ]432 return [f for f in self.fields + self.many_to_many + self.get_all_related_objects() if follow.get(f.name, None) ] 440 433 441 434 def get_follow(self, override=None): 442 435 follow = {} 443 for f in self.fields + self.many_to_many + self.get_all_related_objects _wrapped():436 for f in self.fields + self.many_to_many + self.get_all_related_objects(): 444 437 if override and override.has_key(f.name): 445 438 child_override = override[f.name] … … 477 470 return self._ordered_objects 478 471 479 def has_field_type(self, field_type ):472 def has_field_type(self, field_type, follow): 480 473 """ 481 474 Returns True if this object's admin form has at least one of the given … … 492 485 raise StopIteration 493 486 # Failing that, check related fields. 494 for rel _obj, rel_field in self.get_inline_related_objects():495 for f in rel _obj.fields:487 for related in self.get_followed_related_objects(follow): 488 for f in related.opts.fields: 496 489 if isinstance(f, field_type): 497 490 raise StopIteration … … 854 847 # Replace all relationships to the old class with 855 848 # relationships to the new one. 856 for rel _opts, rel_field in model._meta.get_all_related_objects():857 rel _field.rel.to = opts849 for related in model._meta.get_all_related_objects(): 850 related.field.rel.to = opts 858 851 for rel_opts, rel_field in model._meta.get_all_related_many_to_many_objects(): 859 852 rel_field.rel.to = opts … … 955 948 self._pre_delete() 956 949 cursor = db.db.cursor() 957 for rel _opts, rel_field in opts.get_all_related_objects():958 rel_opts_name = opts.get_rel_object_method_name(rel _opts, rel_field)959 if isinstance(rel _field.rel, OneToOne):950 for related in opts.get_all_related_objects(): 951 rel_opts_name = opts.get_rel_object_method_name(related.opts, related.field) 952 if isinstance(related.field.rel, OneToOne): 960 953 try: 961 954 sub_obj = getattr(self, 'get_%s' % rel_opts_name)() … … 1584 1577 1585 1578 # Add fields for related objects. 1586 for f in opts.get_all_related_objects _wrapped():1579 for f in opts.get_all_related_objects(): 1587 1580 if self.follow.get(f.name, False): 1588 1581 fol = self.follow[f.name] … … 1639 1632 expanded_data = DotExpandedDict(new_data.data) 1640 1633 # Save many-to-one objects. Example: Add the Choice objects for a Poll. 1641 for related in opts.get_all_related_objects _wrapped():1634 for related in opts.get_all_related_objects(): 1642 1635 # Create obj_list, which is a DotExpandedDict such as this: 1643 1636 # [('0', {'id': ['940'], 'choice': ['This is the first choice']}), django/branches/new-admin/django/core/template/loader.py
r981 r982 31 31 mod = __import__(module, globals(), locals(), [attr]) 32 32 except ImportError, e: 33 raise e 33 34 raise ImproperlyConfigured, 'Error importing template source loader %s: "%s"' % (module, e) 34 35 try: … … 43 44 44 45 class LoaderOrigin(Origin): 45 def __init__(self, name, loader, name, dirs):46 def __init__(self, display_name, loader, name, dirs): 46 47 def reload(): 47 48 return loader(name, dirs)[0] 48 super(LoaderOrigin, self).__init__( name)49 super(LoaderOrigin, self).__init__(display_name) 49 50 self._reload = reload 50 51 django/branches/new-admin/django/core/template/loaders/app_directories.py
r913 r982 8 8 app_template_dirs = [] 9 9 for app in INSTALLED_APPS: 10 i = app.rfind('.') 11 m, a = app[:i], app[i+1:] 12 mod = getattr(__import__(m, '', '', [a]), a) 13 template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates') 14 if os.path.isdir(template_dir): 15 app_template_dirs.append(template_dir) 16 10 try: 11 i = app.rfind('.') 12 m, a = app[:i], app[i+1:] 13 mod = getattr(__import__(m, '', '', [a]), a) 14 template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates') 15 if os.path.isdir(template_dir): 16 app_template_dirs.append(template_dir) 17 except Exception, e: 18 print "exception loading" 19 print e 20 raise e 21 17 22 # It won't change, so convert it to a tuple to save memory. 18 23 app_template_dirs = tuple(app_template_dirs) django/branches/new-admin/django/models/__init__.py
r639 r982 20 20 # Add "get_thingie", "get_thingie_count" and "get_thingie_list" methods 21 21 # for all related objects. 22 for rel _obj, rel_field in klass._meta.get_all_related_objects():22 for related in klass._meta.get_all_related_objects(): 23 23 # Determine whether this related object is in another app. 24 24 # If it's in another app, the method names will have the app 25 25 # label prepended, and the add_BLAH() method will not be 26 26 # generated. 27 rel_mod = rel _obj.get_model_module()28 rel_obj_name = klass._meta.get_rel_object_method_name(rel _obj, rel_field)29 if isinstance(rel _field.rel, meta.OneToOne):27 rel_mod = related.opts.get_model_module() 28 rel_obj_name = klass._meta.get_rel_object_method_name(related.opts, related.field) 29 if isinstance(related.field.rel, meta.OneToOne): 30 30 # Add "get_thingie" methods for one-to-one related objects. 31 31 # EXAMPLE: Place.get_restaurants_restaurant() 32 func = curry(meta.method_get_related, 'get_object', rel_mod, rel _field)33 func.__doc__ = "Returns the associated `%s.%s` object." % (rel _obj.app_label, rel_obj.module_name)32 func = curry(meta.method_get_related, 'get_object', rel_mod, related.field) 33 func.__doc__ = "Returns the associated `%s.%s` object." % (related.opts.app_label, related.opts.module_name) 34 34 setattr(klass, 'get_%s' % rel_obj_name, func) 35 elif isinstance(rel _field.rel, meta.ManyToOne):35 elif isinstance(related.field.rel, meta.ManyToOne): 36 36 # Add "get_thingie" methods for many-to-one related objects. 37 37 # EXAMPLE: Poll.get_choice() 38 func = curry(meta.method_get_related, 'get_object', rel_mod, rel_field) 39 func.__doc__ = "Returns the associated `%s.%s` object matching the given criteria." % (rel_obj.app_label, rel_obj.module_name) 38 func = curry(meta.method_get_related, 'get_object', rel_mod, related.field) 39 func.__doc__ = "Returns the associated `%s.%s` object matching the given criteria." % \ 40 (related.opts.app_label, related.opts.module_name) 40 41 setattr(klass, 'get_%s' % rel_obj_name, func) 41 42 # Add "get_thingie_count" methods for many-to-one related objects. 42 43 # EXAMPLE: Poll.get_choice_count() 43 func = curry(meta.method_get_related, 'get_count', rel_mod, rel_field) 44 func.__doc__ = "Returns the number of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) 44 func = curry(meta.method_get_related, 'get_count', rel_mod, related.field) 45 func.__doc__ = "Returns the number of associated `%s.%s` objects." % \ 46 (related.opts.app_label, related.opts.module_name) 45 47 setattr(klass, 'get_%s_count' % rel_obj_name, func) 46 48 # Add "get_thingie_list" methods for many-to-one related objects. 47 49 # EXAMPLE: Poll.get_choice_list() 48 func = curry(meta.method_get_related, 'get_list', rel_mod, rel_field) 49 func.__doc__ = "Returns a list of associated `%s.%s` objects." % (rel_obj.app_label, rel_obj.module_name) 50 func = curry(meta.method_get_related, 'get_list', rel_mod, related.field) 51 func.__doc__ = "Returns a list of associated `%s.%s` objects." % \ 52 (related.opts.app_label, related.opts.module_name) 50 53 setattr(klass, 'get_%s_list' % rel_obj_name, func) 51 54 # Add "add_thingie" methods for many-to-one related objects, 52 55 # but only for related objects that are in the same app. 53 56 # EXAMPLE: Poll.add_choice() 54 if rel _obj.app_label == klass._meta.app_label:55 func = curry(meta.method_add_related, rel _obj, rel_mod, rel_field)57 if related.opts.app_label == klass._meta.app_label: 58 func = curry(meta.method_add_related, related.opts, rel_mod, related.field) 56 59 func.alters_data = True 57 60 setattr(klass, 'add_%s' % rel_obj_name, func) 58 61 del func 59 del rel_obj_name, rel_mod, rel _obj, rel_field # clean up62 del rel_obj_name, rel_mod, related # clean up 60 63 61 64 # Do the same for all related many-to-many objects. django/branches/new-admin/tests/runtests.py
r819 r982 101 101 try: 102 102 cursor.execute("CREATE DATABASE %s" % TEST_DATABASE_NAME) 103 print "created" 103 104 except Exception, e: 104 105 self.output(0, "There was an error creating the test database:%s " % str(e))
