diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index ccaaa88be1..9733114872 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -1,18 +1,15 @@ -from django.core.template.decorators import simple_tag, inclusion_tag - -from django.contrib.admin.views.main import MAX_SHOW_ALL_ALLOWED, DEFAULT_RESULTS_PER_PAGE, ALL_VAR, \ - ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR , SEARCH_VAR , IS_POPUP_VAR, EMPTY_CHANGELIST_VALUE, \ - MONTHS -from django.utils.translation import get_date_formats - - -from django.core import meta -from django.utils.text import capfirst -from django.utils.html import strip_tags, escape +from django.contrib.admin.views.main import MAX_SHOW_ALL_ALLOWED, DEFAULT_RESULTS_PER_PAGE, ALL_VAR +from django.contrib.admin.views.main import ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR +from django.contrib.admin.views.main import IS_POPUP_VAR, EMPTY_CHANGELIST_VALUE, MONTHS +from django.core import meta, template from django.core.exceptions import ObjectDoesNotExist -from django.conf.settings import ADMIN_MEDIA_PREFIX -from django.core import template +from django.core.template.decorators import simple_tag, inclusion_tag from django.utils import dateformat +from django.utils.html import strip_tags, escape +from django.utils.text import capfirst +from django.utils.translation import get_date_formats +from django.conf.settings import ADMIN_MEDIA_PREFIX + DOT = '.' #@simple_tag @@ -20,22 +17,22 @@ def paginator_number(cl,i): if i == DOT: return '... ' elif i == cl.page_num: - return '%d ' % (i+1) + return '%d ' % (i+1) else: - return '%d ' % (cl.get_query_string( {PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1) + return '%d ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1) paginator_number = simple_tag(paginator_number) #@inclusion_tag('admin/pagination') def pagination(cl): - paginator, page_num = cl.paginator, cl.page_num - + paginator, page_num = cl.paginator, cl.page_num + pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page if not pagination_required: page_range = [] else: ON_EACH_SIDE = 3 ON_ENDS = 2 - + # If there are 10 or fewer pages, display links to every page. # Otherwise, do some fancy if paginator.pages <= 10: @@ -59,52 +56,51 @@ def pagination(cl): page_range.extend(range(page_num + 1, paginator.pages)) need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page - - return {'cl': cl, - 'pagination_required': pagination_required, - 'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR:''}), - 'page_range': page_range, - 'ALL_VAR': ALL_VAR, - '1': 1 - } + return { + 'cl': cl, + 'pagination_required': pagination_required, + 'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}), + 'page_range': page_range, + 'ALL_VAR': ALL_VAR, + '1': 1, + } pagination = inclusion_tag('admin/pagination')(pagination) - def result_headers(cl): lookup_opts = cl.lookup_opts - + for i, field_name in enumerate(lookup_opts.admin.list_display): - try: - f = lookup_opts.get_field(field_name) - except meta.FieldDoesNotExist: - # For non-field list_display values, check for the function - # attribute "short_description". If that doesn't exist, fall - # back to the method name. And __repr__ is a special-case. - if field_name == '__repr__': - header = lookup_opts.verbose_name - else: - func = getattr(cl.mod.Klass, field_name) # Let AttributeErrors propogate. - try: - header = func.short_description - except AttributeError: - header = func.__name__.replace('_', ' ') - # Non-field list_display values don't get ordering capability. - yield {"text": header} + try: + f = lookup_opts.get_field(field_name) + except meta.FieldDoesNotExist: + # For non-field list_display values, check for the function + # attribute "short_description". If that doesn't exist, fall + # back to the method name. And __repr__ is a special-case. + if field_name == '__repr__': + header = lookup_opts.verbose_name else: - if isinstance(f.rel, meta.ManyToOne) and f.null: - yield {"text": f.verbose_name} - else: - th_classes = [] - new_order_type = 'asc' - if field_name == cl.order_field: - th_classes.append('sorted %sending' % cl.order_type.lower()) - new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()] - - yield {"text" : f.verbose_name, - "sortable": True, - "url" : cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), - "class_attrib" : (th_classes and ' class="%s"' % ' '.join(th_classes) or '') } - + func = getattr(cl.mod.Klass, field_name) # Let AttributeErrors propogate. + try: + header = func.short_description + except AttributeError: + header = func.__name__.replace('_', ' ') + # Non-field list_display values don't get ordering capability. + yield {"text": header} + else: + if isinstance(f.rel, meta.ManyToOne) and f.null: + yield {"text": f.verbose_name} + else: + th_classes = [] + new_order_type = 'asc' + if field_name == cl.order_field: + th_classes.append('sorted %sending' % cl.order_type.lower()) + new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()] + + yield {"text": f.verbose_name, + "sortable": True, + "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), + "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')} + def items_for_result(cl, result): first = True pk = cl.lookup_opts.pk.attname @@ -121,13 +117,13 @@ def items_for_result(cl, result): except AttributeError, ObjectDoesNotExist: result_repr = EMPTY_CHANGELIST_VALUE else: - # Strip HTML tags in the resulting text, except if the - # function has an "allow_tags" attribute set to True. - if not getattr(func, 'allow_tags', False): + # Strip HTML tags in the resulting text, except if the + # function has an "allow_tags" attribute set to True. + if not getattr(func, 'allow_tags', False): result_repr = strip_tags(result_repr) else: field_val = getattr(result, f.attname) - + if isinstance(f.rel, meta.ManyToOne): if field_val is not None: result_repr = getattr(result, 'get_%s' % f.name)() @@ -136,7 +132,7 @@ def items_for_result(cl, result): # Dates and times are special: They're formatted in a certain way. elif isinstance(f, meta.DateField) or isinstance(f, meta.TimeField): if field_val: - (date_format, datetime_format, time_format) = get_date_formats() + (date_format, datetime_format, time_format) = get_date_formats() if isinstance(f, meta.DateTimeField): result_repr = capfirst(dateformat.format(field_val, datetime_format)) elif isinstance(f, meta.TimeField): @@ -176,7 +172,7 @@ def items_for_result(cl, result): (row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %r); return false;"' % result_id or ''), result_repr)) else: yield ('%s' % (row_class, result_repr)) - + def results(cl): for res in cl.result_list: yield list(items_for_result(cl,res)) @@ -184,20 +180,19 @@ def results(cl): #@inclusion_tag("admin/change_list_results") def result_list(cl): res = list(results(cl)) - return {'cl': cl, - 'result_headers': list(result_headers(cl)), - 'results': list(results(cl)), } + return {'cl': cl, + 'result_headers': list(result_headers(cl)), + 'results': list(results(cl))} result_list = inclusion_tag("admin/change_list_results")(result_list) - #@inclusion_tag("admin/date_hierarchy") def date_hierarchy(cl): lookup_opts, params, lookup_params, lookup_mod = \ cl.lookup_opts, cl.params, cl.lookup_params, cl.lookup_mod - + if lookup_opts.admin.date_hierarchy: field_name = lookup_opts.admin.date_hierarchy - + year_field = '%s__year' % field_name month_field = '%s__month' % field_name day_field = '%s__day' % field_name @@ -205,68 +200,76 @@ def date_hierarchy(cl): year_lookup = params.get(year_field) month_lookup = params.get(month_field) day_lookup = params.get(day_field) - - def link(d): + + def link(d): return cl.get_query_string(d, [field_generic]) - + def get_dates(unit, params): return getattr(lookup_mod, 'get_%s_list' % field_name)(unit, **params) - + if year_lookup and month_lookup and day_lookup: month_name = MONTHS[int(month_lookup)] - return { 'show': True, - 'back': - { 'link' : link({year_field: year_lookup, month_field: month_lookup}), - 'title': "%s %s" % ( month_name, year_lookup), - }, - 'choices': [ {'title': "%s %s" % ( month_name, day_lookup)} ] - } + return { + 'show': True, + 'back': { + 'link': link({year_field: year_lookup, month_field: month_lookup}), + 'title': "%s %s" % (month_name, year_lookup) + }, + 'choices': [{'title': "%s %s" % (month_name, day_lookup)}] + } elif year_lookup and month_lookup: date_lookup_params = lookup_params.copy() date_lookup_params.update({year_field: year_lookup, month_field: month_lookup}) days = get_dates('day', date_lookup_params) - return { 'show': True, - 'back': - { 'link' : link({year_field: year_lookup}), - 'title' : year_lookup - }, - 'choices': - [ { 'link' : link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}), - 'title': day.strftime('%B %d') } for day in days ] - } + return { + 'show': True, + 'back': { + 'link': link({year_field: year_lookup}), + 'title': year_lookup + }, + 'choices': [{ + 'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}), + 'title': day.strftime('%B %d') + } for day in days] + } elif year_lookup: date_lookup_params = lookup_params.copy() date_lookup_params.update({year_field: year_lookup}) months = get_dates('month', date_lookup_params) - return { 'show' : True, - 'back': - { 'link' : link({}), - 'title': _('All dates') - }, - 'choices': - [ { 'link': link( {year_field: year_lookup, month_field: month.month}), - 'title': "%s %s" % (month.strftime('%B') , month.year) } for month in months ] - } + return { + 'show' : True, + 'back': { + 'link' : link({}), + 'title': _('All dates') + }, + 'choices': [{ + 'link': link( {year_field: year_lookup, month_field: month.month}), + 'title': "%s %s" % (month.strftime('%B') , month.year) + } for month in months] + } else: years = get_dates('year', lookup_params) - return { 'show': True, - 'choices': - [ { 'link': link( {year_field: year.year}), - 'title': year.year } for year in years ] - } + return { + 'show': True, + 'choices': [{ + 'link': link({year_field: year.year}), + 'title': year.year + } for year in years ] + } date_hierarchy = inclusion_tag('admin/date_hierarchy')(date_hierarchy) #@inclusion_tag('admin/search_form') def search_form(cl): - return { 'cl': cl, - 'show_result_count': cl.result_count != cl.full_result_count and not cl.opts.one_to_one_field, - 'search_var': SEARCH_VAR } + return { + 'cl': cl, + 'show_result_count': cl.result_count != cl.full_result_count and not cl.opts.one_to_one_field, + 'search_var': SEARCH_VAR + } search_form = inclusion_tag('admin/search_form')(search_form) #@inclusion_tag('admin/filter') def filter(cl, spec): - return {'title': spec.title(), - 'choices' : list(spec.choices(cl))} + return {'title': spec.title(), 'choices' : list(spec.choices(cl))} filter = inclusion_tag('admin/filter')(filter) #@inclusion_tag('admin/filters') diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index e60e78aecc..f62fbbc01d 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -45,7 +45,6 @@ def _get_mod_opts(app_label, module_name): raise Http404 # This object is valid but has no admin interface. return mod, opts - def index(request): return render_to_response('admin/index', {'title': _('Site administration')}, context_instance=Context(request)) index = staff_member_required(index) @@ -61,15 +60,14 @@ class ChangeList(object): self.query = request.GET.get(SEARCH_VAR,'') self.get_lookup_params() self.get_results(request) - self.title = (self.is_popup - and _('Select %s') % self.opts.verbose_name + self.title = (self.is_popup + and _('Select %s') % self.opts.verbose_name or _('Select %s to change') % self.opts.verbose_name) self.get_filters(request) self.pk_attname = self.lookup_opts.pk.attname - + def get_filters(self, request): self.filter_specs = [] - if self.lookup_opts.admin.list_filter and not self.opts.one_to_one_field: filter_fields = [self.lookup_opts.get_field(field_name) \ for field_name in self.lookup_opts.admin.list_filter] @@ -77,9 +75,8 @@ class ChangeList(object): spec = FilterSpec.create(f, request, self.params) if spec.has_output(): self.filter_specs.append(spec) - self.has_filters = bool(self.filter_specs) - + def get_query_string(self, new_params={}, remove=[]): p = self.params.copy() for r in remove: @@ -92,13 +89,12 @@ class ChangeList(object): elif v is not None: p[k] = v return '?' + '&'.join(['%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20') - - + def get_modules_and_options(self, app_label, module_name, request): self.mod, self.opts = _get_mod_opts(app_label, module_name) if not request.user.has_perm(app_label + '.' + self.opts.get_change_permission()): raise PermissionDenied - + self.lookup_mod, self.lookup_opts = self.mod, self.opts def get_search_parameters(self, request): @@ -113,7 +109,7 @@ class ChangeList(object): self.params = dict(request.GET.copy()) if self.params.has_key(PAGE_VAR): del self.params[PAGE_VAR] - + def get_results(self, request): lookup_mod, lookup_params, show_all, page_num = \ self.lookup_mod, self.lookup_params, self.show_all, self.page_num @@ -126,7 +122,7 @@ class ChangeList(object): # error). except: raise IncorrectLookupParameters() - + # Get the total number of objects, with no filters applied. real_lookup_params = lookup_params.copy() del real_lookup_params['order_by'] @@ -138,7 +134,7 @@ class ChangeList(object): result_count = paginator.hits can_show_all = result_count <= MAX_SHOW_ALL_ALLOWED multi_page = result_count > DEFAULT_RESULTS_PER_PAGE - + # Get the list of objects to display on this page. if (show_all and can_show_all) or not multi_page: result_list = lookup_mod.get_list(**lookup_params) @@ -147,13 +143,13 @@ class ChangeList(object): result_list = paginator.get_page(page_num) except InvalidPage: result_list = [] - (self.result_count, self.full_result_count, self.result_list, - self.can_show_all, self.multi_page, self.paginator) = (result_count, + (self.result_count, self.full_result_count, self.result_list, + self.can_show_all, self.multi_page, self.paginator) = (result_count, full_result_count, result_list, can_show_all, multi_page, paginator ) - + def url_for_result(self, result): return "%s/" % getattr(result, self.pk_attname) - + def get_ordering(self): lookup_opts, params = self.lookup_opts, self.params # For ordering, first check the "ordering" parameter in the admin options, @@ -161,10 +157,10 @@ class ChangeList(object): # order descending by ID by default. Finally, look for manually-specified # ordering from the query string. ordering = lookup_opts.admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name] - + # Normalize it to new-style ordering. ordering = meta.handle_legacy_orderlist(ordering) - + if ordering[0].startswith('-'): order_field, order_type = ordering[0][1:], 'desc' else: @@ -183,12 +179,12 @@ class ChangeList(object): if params.has_key(ORDER_TYPE_VAR) and params[ORDER_TYPE_VAR] in ('asc', 'desc'): order_type = params[ORDER_TYPE_VAR] self.order_field, self.order_type = order_field, order_type - + def get_lookup_params(self): # Prepare the lookup parameters for the API lookup. (params, order_field, lookup_opts, order_type, opts, query) = \ (self.params, self.order_field, self.lookup_opts, self.order_type, self.opts, self.query) - + lookup_params = params.copy() for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR): if lookup_params.has_key(i): @@ -196,7 +192,7 @@ class ChangeList(object): # If the order-by field is a field with a relationship, order by the value # in the related table. lookup_order_field = order_field - try: + try: f = lookup_opts.get_field(order_field) except meta.FieldDoesNotExist: pass @@ -228,25 +224,25 @@ class ChangeList(object): or_query.append(('%s__icontains' % field_name, bit)) or_queries.append(or_query) lookup_params['_or'] = or_queries - + if opts.one_to_one_field: lookup_params.update(opts.one_to_one_field.rel.limit_choices_to) self.lookup_params = lookup_params - + def change_list(request, app_label, module_name): try: cl = ChangeList(request, app_label, module_name) except IncorrectLookupParameters: return HttpResponseRedirect(request.path) - + c = Context(request, { 'title': cl.title, 'is_popup': cl.is_popup, 'cl' : cl }) c.update( { 'has_add_permission': c['perms'][app_label][cl.opts.get_add_permission()]}), - return render_to_response('admin/change_list', + return render_to_response('admin/change_list', context_instance = c) change_list = staff_member_required(change_list) @@ -270,7 +266,7 @@ def get_javascript_imports(opts,auto_populated_fields, ordered_objects, field_se if not seen_collapse and 'collapse' in field_set.classes: seen_collapse = True js.append('js/admin/CollapsedFieldsets.js' ) - + for field_line in field_set: try: for f in field_line: @@ -284,9 +280,9 @@ def get_javascript_imports(opts,auto_populated_fields, ordered_objects, field_se class AdminBoundField(BoundField): def __init__(self, field, field_mapping, original): - super(AdminBoundField, self).__init__(field,field_mapping,original) + super(AdminBoundField, self).__init__(field,field_mapping,original) - self.element_id = self.form_fields[0].get_id() + self.element_id = self.form_fields[0].get_id() self.has_label_first = not isinstance(self.field, meta.BooleanField) self.raw_id_admin = use_raw_id_admin(field) self.is_date_time = isinstance(field, meta.DateTimeField) @@ -294,33 +290,33 @@ class AdminBoundField(BoundField): self.needs_add_label = field.rel and isinstance(field.rel, meta.ManyToOne) or isinstance(field.rel, meta.ManyToMany) and field.rel.to.admin self.hidden = isinstance(self.field, meta.AutoField) self.first = False - + classes = [] - if(self.raw_id_admin): + if(self.raw_id_admin): classes.append('nowrap') if max([bool(f.errors()) for f in self.form_fields]): classes.append('error') if classes: self.cell_class_attribute = ' class="%s" ' % ' '.join(classes) self._repr_filled = False - + def _fetch_existing_display(self, func_name): class_dict = self.original.__class__.__dict__ func = class_dict.get(func_name) return func(self.original) - + def _fill_existing_display(self): - if self._display_filled: + if self._display_filled: return #HACK if isinstance(self.field.rel, meta.ManyToOne): func_name = 'get_%s' % self.field.name self._display = self._fetch_existing_display(func_name) elif isinstance(self.field.rel, meta.ManyToMany): - func_name = 'get_%s_list' % self.field.name + func_name = 'get_%s_list' % self.field.name self._display = ",".join(self._fetch_existing_display(func_name)) self._display_filled = True - + def existing_display(self): self._fill_existing_display() return self._display @@ -329,8 +325,7 @@ class AdminBoundField(BoundField): return repr(self.__dict__) def html_error_list(self): - return " ".join([form_field.html_error_list() for form_field in self.form_fields if form_field.errors]) - + return " ".join([form_field.html_error_list() for form_field in self.form_fields if form_field.errors]) class AdminBoundFieldLine(BoundFieldLine): def __init__(self, field_line, field_mapping, original): @@ -342,12 +337,12 @@ class AdminBoundFieldLine(BoundFieldLine): class AdminBoundFieldSet(BoundFieldSet): def __init__(self, field_set, field_mapping, original): super(AdminBoundFieldSet, self).__init__(field_set, field_mapping, original, AdminBoundFieldLine) - + class BoundManipulator(object): def __init__(self, opts, manipulator, field_mapping): self.inline_related_objects = opts.get_followed_related_objects(manipulator.follow) self.original = hasattr(manipulator, 'original_object') and manipulator.original_object or None - self.bound_field_sets = [field_set.bind(field_mapping, self.original, AdminBoundFieldSet) + self.bound_field_sets = [field_set.bind(field_mapping, self.original, AdminBoundFieldSet) for field_set in opts.admin.get_field_sets(opts)] self.ordered_objects = opts.get_ordered_objects()[:] @@ -355,34 +350,33 @@ class AdminBoundManipulator(BoundManipulator): def __init__(self, opts, manipulator, field_mapping): super(AdminBoundManipulator, self).__init__(opts, manipulator, field_mapping) field_sets = opts.admin.get_field_sets(opts) - + self.auto_populated_fields = [f for f in opts.fields if f.prepopulate_from] - self.javascript_imports = get_javascript_imports(opts, self.auto_populated_fields, self.ordered_objects, field_sets); - + self.javascript_imports = get_javascript_imports(opts, self.auto_populated_fields, self.ordered_objects, field_sets); + self.coltype = self.ordered_objects and 'colMS' or 'colM' self.has_absolute_url = hasattr(opts.get_model_module().Klass, 'get_absolute_url') self.form_enc_attrib = opts.has_field_type(meta.FileField) and \ 'enctype="multipart/form-data" ' or '' - - self.first_form_field_id = self.bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id(); + + self.first_form_field_id = self.bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id(); self.ordered_object_pk_names = [o.pk.name for o in self.ordered_objects] - + self.save_on_top = opts.admin.save_on_top self.save_as = opts.admin.save_as - + self.content_type_id = opts.get_content_type_id() self.verbose_name_plural = opts.verbose_name_plural self.verbose_name = opts.verbose_name self.object_name = opts.object_name - + def get_ordered_object_pk(self, ordered_obj): for name in self.ordered_object_pk_names: if hasattr(ordered_obj, name): return str(getattr(ordered_obj, name)) return "" - + def render_change_form(opts, manipulator, app_label, context, add=False, change=False, show_delete=False, form_url=''): - extra_context = { 'add': add, 'change': change, @@ -391,14 +385,11 @@ def render_change_form(opts, manipulator, app_label, context, add=False, change= 'form_url' : form_url, 'app_label': app_label, } - context.update(extra_context) - - return render_to_response(["admin/%s/%s/change_form" % (app_label, opts.object_name.lower() ), - "admin/%s/change_form" % app_label , - "admin/change_form"], - context_instance=context) - + return render_to_response(["admin/%s/%s/change_form" % (app_label, opts.object_name.lower() ), + "admin/%s/change_form" % app_label , + "admin/change_form"], context_instance=context) + def log_add_message(user, opts,manipulator,new_object): pk_value = getattr(new_object, opts.pk.attname) log.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), log.ADDITION) @@ -414,7 +405,7 @@ def add_stage(request, app_label, module_name, show_delete=False, form_url='', p new_data.update(request.FILES) errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) - + if not errors and not request.POST.has_key("_preview"): new_object = manipulator.save(new_data) log_add_message(request.user, opts,manipulator,new_object) @@ -439,14 +430,14 @@ def add_stage(request, app_label, module_name, show_delete=False, form_url='', p else: # Add default data. new_data = manipulator.flatten_data() - + # Override the defaults with request.GET, if it exists. new_data.update(request.GET) errors = {} # Populate the FormWrapper. form = formfields.FormWrapper(manipulator, new_data, errors, edit_inline=True) - + c = Context(request, { 'title': _('Add %s') % opts.verbose_name, 'form': form, @@ -455,7 +446,7 @@ def add_stage(request, app_label, module_name, show_delete=False, form_url='', p }) if object_id_override is not None: c['object_id'] = object_id_override - + return render_change_form(opts, manipulator, app_label, c, add=True) add_stage = staff_member_required(add_stage) @@ -473,7 +464,7 @@ def log_change_message(user, opts,manipulator,new_object): if not change_message: change_message = _('No fields changed.') log.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), log.CHANGE, change_message) - + def change_stage(request, app_label, module_name, object_id): mod, opts = _get_mod_opts(app_label, module_name) if not request.user.has_perm(app_label + '.' + opts.get_change_permission()): @@ -491,7 +482,7 @@ def change_stage(request, app_label, module_name, object_id): new_data.update(request.FILES) errors = manipulator.get_validation_errors(new_data) - + manipulator.do_html2python(new_data) if not errors and not request.POST.has_key("_preview"): new_object = manipulator.save(new_data) @@ -516,11 +507,11 @@ def change_stage(request, app_label, module_name, object_id): else: # Populate new_data with a "flattened" version of the current data. new_data = manipulator.flatten_data() - - # TODO: do this in flatten_data... + + # TODO: do this in flatten_data... # If the object has ordered objects on its admin page, get the existing # order and flatten it into a comma-separated list of IDs. - + id_order_list = [] for rel_obj in opts.get_ordered_objects(): id_order_list.extend(getattr(manipulator.original_object, 'get_%s_order' % rel_obj.object_name.lower())()) @@ -532,16 +523,16 @@ def change_stage(request, app_label, module_name, object_id): form = formfields.FormWrapper(manipulator, new_data, errors, edit_inline = True) form.original = manipulator.original_object form.order_objects = [] - + #TODO Should be done in flatten_data / FormWrapper construction for related in opts.get_followed_related_objects(): wrt = related.opts.order_with_respect_to - if wrt and wrt.rel and wrt.rel.to == opts: - func = getattr(manipulator.original_object, 'get_%s_list' % + if wrt and wrt.rel and wrt.rel.to == opts: + func = getattr(manipulator.original_object, 'get_%s_list' % related.get_method_name_part()) orig_list = func() form.order_objects.extend(orig_list) - + c = Context(request, { 'title': _('Change %s') % opts.verbose_name, 'form': form, @@ -551,8 +542,6 @@ def change_stage(request, app_label, module_name, object_id): }) return render_change_form(opts,manipulator, app_label, c, change=True) - - def _nest_help(obj, depth, val): current = obj