From 0f0f6a79576e55e52cbf724b5b496b6d9936109d Mon Sep 17 00:00:00 2001 From: Joseph Kocherhans Date: Sat, 15 Sep 2007 19:56:59 +0000 Subject: [PATCH] Fixed a bug in ManyToManyRawIdWidget where a list of integers needed to be converted to a comma separated string for display. git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@6321 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/options.py | 2 +- django/contrib/admin/util.py | 20 +++++++++++--------- django/contrib/admin/widgets.py | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 2a38205faa..cd0da2b895 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -627,7 +627,7 @@ class ModelAdmin(BaseModelAdmin): # will also be deleted. deleted_objects = [u'%s: %s' % (force_unicode(capfirst(opts.verbose_name)), object_id, escape(str(obj))), []] perms_needed = sets.Set() - get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1) + get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site) if request.POST: # The user has already confirmed the deletion. if perms_needed: diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py index 29b7668a9a..b1038f711b 100644 --- a/django/contrib/admin/util.py +++ b/django/contrib/admin/util.py @@ -10,13 +10,14 @@ def _nest_help(obj, depth, val): current = current[-1] current.append(val) -def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_depth): +def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_depth, admin_site): "Helper function that recursively populates deleted_objects." nh = _nest_help # Bind to local variable for performance if current_depth > 16: return # Avoid recursing too deep. opts_seen = [] for related in opts.get_all_related_objects(): + has_admin = related.__class__ in admin_site._registry if related.opts in opts_seen: continue opts_seen.append(related.opts) @@ -27,13 +28,13 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ except ObjectDoesNotExist: pass else: - if related.opts.admin: + if has_admin: p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) if not user.has_perm(p): perms_needed.add(related.opts.verbose_name) # We don't care about populating deleted_objects now. continue - if related.field.rel.edit_inline or not related.opts.admin: + if related.field.rel.edit_inline or not has_admin: # Don't display link to edit, because it either has no # admin or is edited inline. nh(deleted_objects, current_depth, [u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), sub_obj), []]) @@ -42,12 +43,12 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ nh(deleted_objects, current_depth, [u'%s: %s' % \ (force_unicode(capfirst(related.opts.verbose_name)), related.opts.app_label, related.opts.object_name.lower(), sub_obj._get_pk_val(), sub_obj), []]) - get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2) + get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2, admin_site) else: has_related_objs = False for sub_obj in getattr(obj, rel_opts_name).all(): has_related_objs = True - if related.field.rel.edit_inline or not related.opts.admin: + if related.field.rel.edit_inline or not has_admin: # Don't display link to edit, because it either has no # admin or is edited inline. nh(deleted_objects, current_depth, [u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), escape(sub_obj)), []]) @@ -55,14 +56,15 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ # Display a link to the admin page. nh(deleted_objects, current_depth, [u'%s: %s' % \ (force_unicode(capfirst(related.opts.verbose_name)), related.opts.app_label, related.opts.object_name.lower(), sub_obj._get_pk_val(), escape(sub_obj)), []]) - get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2) + get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2, admin_site) # If there were related objects, and the user doesn't have # permission to delete them, add the missing perm to perms_needed. - if related.opts.admin and has_related_objs: + if has_admin and has_related_objs: p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) if not user.has_perm(p): perms_needed.add(related.opts.verbose_name) for related in opts.get_all_related_many_to_many_objects(): + has_admin = related.__class__ in admin_site._registry if related.opts in opts_seen: continue opts_seen.append(related.opts) @@ -77,7 +79,7 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ if has_related_objs: for sub_obj in rel_objs.all(): - if related.field.rel.edit_inline or not related.opts.admin: + if related.field.rel.edit_inline or not has_admin: # Don't display link to edit, because it either has no # admin or is edited inline. nh(deleted_objects, current_depth, [_('One or more %(fieldname)s in %(name)s: %(obj)s') % \ @@ -90,7 +92,7 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ (related.opts.app_label, related.opts.module_name, sub_obj._get_pk_val(), escape(sub_obj))), []]) # If there were related objects, and the user doesn't have # permission to change them, add the missing perm to perms_needed. - if related.opts.admin and has_related_objs: + if has_admin and has_related_objs: p = u'%s.%s' % (related.opts.app_label, related.opts.get_change_permission()) if not user.has_perm(p): perms_needed.add(related.opts.verbose_name) diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 99bfdef53d..7ce0d36023 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -98,8 +98,8 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): def render(self, name, value, attrs=None): attrs['class'] = 'vManyToManyRawIdAdminField' - if value: - value = ','.join(value) + if value: + value = ','.join([str(v) for v in value]) else: value = "" return super(ManyToManyRawIdWidget, self).render(name, value, attrs)