Django

Code

Changeset 982

Show
Ignore:
Timestamp:
10/20/05 14:07:15 (3 years ago)
Author:
rjwittams
Message:

Rationalised related object methods

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/new-admin/django/bin/validate.py

    r3 r982  
    1414    for f in opts.fields: 
    1515        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 
    1718    # 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) 
    2023    # All related objects. 
    2124    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) 
    2632    # Etc. 
    2733    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 
    2938 
    3039if __name__ == "__main__": 
  • django/branches/new-admin/django/contrib/admin/templates/admin/change_form.html

    r966 r982  
    2222<form {{ form_enc_attrib }} action='{{ form_url }}' method="post"> 
    2323 
    24  
    2524{% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %} 
    2625{% if save_on_top %}{% submit_row %}{% endif %} 
    2726{% if form.error_dict %}<p class="errornote">Please correct the error{{ form.error_dict.items|pluralize }} below.</p>{% endif %} 
    2827{% 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 }}">  
    3129    {% if bound_field_set.name %}<h2>{{bound_field_set.name }}</h2>{% endif %} 
    3230    {% for bound_field_line in bound_field_set %} 
  • django/branches/new-admin/django/contrib/admin/views/main.py

    r981 r982  
    519519    return t 
    520520 
    521 def get_javascript_imports(opts,auto_populated_fields, ordered_objects, admin_field_objs): 
     521def get_javascript_imports(opts,auto_populated_fields, ordered_objects, field_sets): 
    522522# Put in any necessary JavaScript imports. 
    523523    js = ['js/core.js', 'js/admin/RelatedObjectLookups.js'] 
     
    531531        js.extend(opts.admin.js) 
    532532    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
    535535            seen_collapse = True 
    536536            js.append('js/admin/CollapsedFieldsets.js' ) 
    537537        try: 
    538             for field_list in options['fields']
    539                 for f in field_list
     538            for field_line in field_set
     539                for f in field_line
    540540                    if f.rel and isinstance(f, meta.ManyToManyField) and f.rel.filter_interface: 
    541541                        js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js']) 
     
    609609         
    610610def 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      
    613611    ordered_objects = opts.get_ordered_objects()[:] 
    614612    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         
    623615    has_absolute_url = hasattr(opts.get_model_module().Klass, 'get_absolute_url') 
    624      
    625616    form_enc_attrib = opts.has_field_type(meta.FileField) and 'enctype="multipart/form-data" ' or '' 
    626  
    627617    form = context['form'] 
    628618    original = context['original'] 
     
    631621    bound_field_sets = [field_set.bind(form, original, AdminBoundFieldSet)  
    632622                        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() 
    638627    ordered_object_names =   ' '.join(['object.%s' % o.pk.name for o in ordered_objects]) 
    639628    
     
    740729        raise Http404 
    741730 
    742     inline_related_objects = opts.get_inline_related_objects() 
    743731    if request.POST: 
    744732        new_data = request.POST.copy() 
     
    807795    form.order_objects = [] 
    808796     
    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() 
    812803            form.order_objects.extend(orig_list) 
    813  
     804             
    814805    c = Context(request, { 
    815806        'title': 'Change %s' % opts.verbose_name, 
     
    837828        return # Avoid recursing too deep. 
    838829    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: 
    841832            continue 
    842833        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): 
    845836            try: 
    846837                sub_obj = getattr(obj, 'get_%s' % rel_opts_name)() 
     
    849840            else: 
    850841                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()) 
    852843                    if not user.has_perm(p): 
    853                         perms_needed.add(rel_opts.verbose_name) 
     844                        perms_needed.add(related.opts.verbose_name) 
    854845                        # We don't care about populating deleted_objects now. 
    855846                        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: 
    857848                    # Don't display link to edit, because it either has no 
    858849                    # 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), []]) 
    860851                else: 
    861852                    # Display a link to the admin page. 
    862853                    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) 
    866857        else: 
    867858            has_related_objs = False 
    868859            for sub_obj in getattr(obj, 'get_%s_list' % rel_opts_name)(): 
    869860                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: 
    871862                    # Don't display link to edit, because it either has no 
    872863                    # 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))), []]) 
    874865                else: 
    875866                    # Display a link to the admin page. 
    876867                    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) 
    879870            # If there were related objects, and the user doesn't have 
    880871            # 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()) 
    883874                if not user.has_perm(p): 
    884875                    perms_needed.add(rel_opts.verbose_name) 
  • django/branches/new-admin/django/core/formfields.py

    r981 r982  
    8989        expected to deal with invalid input. 
    9090        """ 
    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) 
    9793 
    9894class FormWrapper: 
     
    10298    prepopulated data and validation error messages to the formfield objects. 
    10399    """ 
    104     def __init__(self, manipulator, data, error_dict, edit_inline = False): 
     100    def __init__(self, manipulator, data, error_dict, edit_inline = True): 
    105101        self.manipulator, self.data = manipulator, data 
    106102        self.error_dict = error_dict 
    107103        self._inline_collections = None 
    108104        self.edit_inline = edit_inline 
    109  
     105     
    110106    def __repr__(self): 
    111107        return repr(self.__dict__) 
     
    247243                            collection[field_name] = FormFieldWrapper(field, data, errors) 
    248244                wrapper.append(FormFieldCollection(collection)) 
    249             self._collections = wrapper  
     245            self._collections = wrapper 
    250246 
    251247class FormField: 
     
    294290        if data is None: 
    295291            data = '' 
    296            return data 
     292        return data 
    297293 
    298294    def convert_post_data(self, new_data): 
  • django/branches/new-admin/django/core/management.py

    r981 r982  
    302302        cursor.execute("INSERT INTO %s (domain, name) VALUES ('mysite.com', 'My Django site')" % core.Site._meta.db_table) 
    303303    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)  
    305305        try: 
    306306            db.db.rollback() 
    307307        except UnboundLocalError: 
    308308            pass 
    309         sys.exit(1) 
     309        raise 
    310310    else: 
    311311        db.db.commit() 
     
    583583 
    584584            # 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(): 
    586586                try: 
    587                     for f in rel_opts.fields: 
     587                    for f in related.opts.fields: 
    588588                        if f.core: 
    589589                            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)) 
    591591                except StopIteration: 
    592592                    pass 
  • django/branches/new-admin/django/core/meta/fields.py

    r981 r982  
    4949    raise validators.ValidationError, "%s with this %s already exists." % (capfirst(opts.verbose_name), f.verbose_name) 
    5050 
     51class 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 
    5170class Field(object): 
    52  
     71     
    5372    # Designates whether empty strings fundamentally are allowed at the 
    5473    # database level. 
     
    284303        Returns a dictionary mapping the field's manipulator field names to its 
    285304        "flattened" string values for the admin view. Obj is the instance to extract the  
    286         values from.  
     305        values from. 
    287306        """ 
    288307        return { self.get_db_column(): self._get_val_from_obj(obj)} 
     
    293312        else: 
    294313            return self.editable 
     314         
     315    def bind(self, fieldmapping, original, bound_field_class=BoundField): 
     316        return bound_field_class(self, fieldmapping, original) 
    295317  
    296318class AutoField(Field): 
     
    659681 
    660682    def flatten_data(self, follow, obj = None): 
    661         if not obj:  
     683        if not obj: 
    662684            # In required many-to-one fields with only one available choice, 
    663685            # select that one available choice. Note: We have to check that 
     
    730752                   new_data[self.name] = [choices_list[0][0]] 
    731753        return new_data 
    732  
    733754 
    734755class OneToOneField(IntegerField): 
     
    797818        self.raw_id_admin = raw_id_admin 
    798819 
    799  
    800 class BoundField(object): 
    801     def __init__(self, field, field_mapping, original): 
    802         self.field = field 
    803         self.form_fields = self.resolve_form_fields(field_mapping) 
    804         self.original = original 
    805  
    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  
    818820class BoundFieldLine(object): 
    819821    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] 
    821824     
    822825    def __iter__(self): 
     
    882885        return len(self.field_lines) 
    883886 
    884  
    885887class Admin: 
    886888    def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, 
     
    894896        self.search_fields = search_fields or [] 
    895897        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 of 
    900         field names. If self.fields is None, defaults to putting every 
    901         non-AutoField field with editable=True in a single fieldset. 
    902          
    903         returns a list of lists of name, dict  
    904         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.fields 
    911         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_fields 
    922             new_fieldset_list.append(new_fieldset) 
    923         return new_fieldset_list 
    924898     
    925899    def get_field_sets(self, opts): 
     
    931905            field_struct = self.fields 
    932906             
    933          
    934907        new_fieldset_list = [] 
    935908        for fieldset in field_struct: 
    936909            name = fieldset[0] 
    937910            fs_options = fieldset[1] 
    938             classes =  fs_options.get('classes', None
     911            classes =  fs_options.get('classes', ()
    939912            line_specs = fs_options['fields'] 
    940913            new_fieldset_list.append(FieldSet(name, classes, opts.get_field, line_specs) ) 
  • django/branches/new-admin/django/core/meta/__init__.py

    r981 r982  
    251251        return fields 
    252252 
     253class BoundRelatedObject(object): 
     254    pass 
    253255 
    254256class Options: 
     
    402404                    for f in klass._meta.fields: 
    403405                        if f.rel and self == f.rel.to: 
    404                             rel_objs.append((klass._meta, f)) 
     406                            rel_objs.append(RelatedObject(self, klass._meta, f)) 
    405407            if self.has_related_links: 
    406408                # Manually add RelatedLink objects, which are a special case. 
     
    416418                        'content_type__python_module_name__exact': self.module_name, 
    417419                    }) 
    418                 rel_objs.append((relatedlinks.RelatedLink._meta, link_field)) 
     420                rel_objs.append(RelatedObject(self, relatedlinks.RelatedLink._meta, link_field)) 
    419421            self._all_related_objects = rel_objs 
    420422            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()] 
    430423 
    431424    def get_followed_related_objects(self, follow=None): 
    432425        if follow == None: 
    433426            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) ] 
    435428 
    436429    def get_data_holders(self, follow=None): 
    437430        if follow == None : 
    438431            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) ] 
    440433 
    441434    def get_follow(self, override=None): 
    442435        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(): 
    444437            if override and override.has_key(f.name): 
    445438                child_override = override[f.name]  
     
    477470        return self._ordered_objects 
    478471 
    479     def has_field_type(self, field_type): 
     472    def has_field_type(self, field_type, follow): 
    480473        """ 
    481474        Returns True if this object's admin form has at least one of the given 
     
    492485                        raise StopIteration 
    493486                # 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: 
    496489                        if isinstance(f, field_type): 
    497490                            raise StopIteration 
     
    854847                    # Replace all relationships to the old class with 
    855848                    # relationships to the new one. 
    856                     for rel_opts, rel_field in model._meta.get_all_related_objects(): 
    857                         rel_field.rel.to = opts 
     849                    for related in model._meta.get_all_related_objects(): 
     850                        related.field.rel.to = opts 
    858851                    for rel_opts, rel_field in model._meta.get_all_related_many_to_many_objects(): 
    859852                        rel_field.rel.to = opts 
     
    955948        self._pre_delete() 
    956949    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): 
    960953            try: 
    961954                sub_obj = getattr(self, 'get_%s' % rel_opts_name)() 
     
    15841577 
    15851578    # Add fields for related objects. 
    1586     for f in opts.get_all_related_objects_wrapped(): 
     1579    for f in opts.get_all_related_objects(): 
    15871580        if self.follow.get(f.name, False): 
    15881581            fol = self.follow[f.name] 
     
    16391632    expanded_data = DotExpandedDict(new_data.data) 
    16401633    # 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(): 
    16421635        # Create obj_list, which is a DotExpandedDict such as this: 
    16431636        # [('0', {'id': ['940'], 'choice': ['This is the first choice']}), 
  • django/branches/new-admin/django/core/template/loader.py

    r981 r982  
    3131        mod = __import__(module, globals(), locals(), [attr]) 
    3232    except ImportError, e: 
     33        raise e 
    3334        raise ImproperlyConfigured, 'Error importing template source loader %s: "%s"' % (module, e) 
    3435    try: 
     
    4344 
    4445class LoaderOrigin(Origin): 
    45     def __init__(self, name, loader, name, dirs): 
     46    def __init__(self, display_name, loader, name, dirs): 
    4647        def reload(): 
    4748                return loader(name, dirs)[0] 
    48         super(LoaderOrigin, self).__init__(name) 
     49        super(LoaderOrigin, self).__init__(display_name) 
    4950        self._reload = reload 
    5051     
  • django/branches/new-admin/django/core/template/loaders/app_directories.py

    r913 r982  
    88app_template_dirs = [] 
    99for 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         
    1722# It won't change, so convert it to a tuple to save memory. 
    1823app_template_dirs = tuple(app_template_dirs) 
  • django/branches/new-admin/django/models/__init__.py

    r639 r982  
    2020        # Add "get_thingie", "get_thingie_count" and "get_thingie_list" methods 
    2121        # 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(): 
    2323            # Determine whether this related object is in another app. 
    2424            # If it's in another app, the method names will have the app 
    2525            # label prepended, and the add_BLAH() method will not be 
    2626            # 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): 
    3030                # Add "get_thingie" methods for one-to-one related objects. 
    3131                # 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) 
    3434                setattr(klass, 'get_%s' % rel_obj_name, func) 
    35             elif isinstance(rel_field.rel, meta.ManyToOne): 
     35            elif isinstance(related.field.rel, meta.ManyToOne): 
    3636                # Add "get_thingie" methods for many-to-one related objects. 
    3737                # 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) 
    4041                setattr(klass, 'get_%s' % rel_obj_name, func) 
    4142                # Add "get_thingie_count" methods for many-to-one related objects. 
    4243                # 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) 
    4547                setattr(klass, 'get_%s_count' % rel_obj_name, func) 
    4648                # Add "get_thingie_list" methods for many-to-one related objects. 
    4749                # 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) 
    5053                setattr(klass, 'get_%s_list' % rel_obj_name, func) 
    5154                # Add "add_thingie" methods for many-to-one related objects, 
    5255                # but only for related objects that are in the same app. 
    5356                # 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) 
    5659                    func.alters_data = True 
    5760                    setattr(klass, 'add_%s' % rel_obj_name, func) 
    5861                del func 
    59             del rel_obj_name, rel_mod, rel_obj, rel_field # clean up 
     62            del rel_obj_name, rel_mod, related # clean up 
    6063 
    6164        # Do the same for all related many-to-many objects. 
  • django/branches/new-admin/tests/runtests.py

    r819 r982  
    101101            try: 
    102102                cursor.execute("CREATE DATABASE %s" % TEST_DATABASE_NAME) 
     103                print "created" 
    103104            except Exception, e: 
    104105                self.output(0, "There was an error creating the test database:%s " % str(e))