mirror of
https://github.com/django/django.git
synced 2025-07-04 17:59:13 +00:00
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
This commit is contained in:
parent
aff1c2aa96
commit
0f0f6a7957
@ -627,7 +627,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||||||
# will also be deleted.
|
# will also be deleted.
|
||||||
deleted_objects = [u'%s: <a href="../../%s/">%s</a>' % (force_unicode(capfirst(opts.verbose_name)), object_id, escape(str(obj))), []]
|
deleted_objects = [u'%s: <a href="../../%s/">%s</a>' % (force_unicode(capfirst(opts.verbose_name)), object_id, escape(str(obj))), []]
|
||||||
perms_needed = sets.Set()
|
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 request.POST: # The user has already confirmed the deletion.
|
||||||
if perms_needed:
|
if perms_needed:
|
||||||
|
@ -10,13 +10,14 @@ def _nest_help(obj, depth, val):
|
|||||||
current = current[-1]
|
current = current[-1]
|
||||||
current.append(val)
|
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."
|
"Helper function that recursively populates deleted_objects."
|
||||||
nh = _nest_help # Bind to local variable for performance
|
nh = _nest_help # Bind to local variable for performance
|
||||||
if current_depth > 16:
|
if current_depth > 16:
|
||||||
return # Avoid recursing too deep.
|
return # Avoid recursing too deep.
|
||||||
opts_seen = []
|
opts_seen = []
|
||||||
for related in opts.get_all_related_objects():
|
for related in opts.get_all_related_objects():
|
||||||
|
has_admin = related.__class__ in admin_site._registry
|
||||||
if related.opts in opts_seen:
|
if related.opts in opts_seen:
|
||||||
continue
|
continue
|
||||||
opts_seen.append(related.opts)
|
opts_seen.append(related.opts)
|
||||||
@ -27,13 +28,13 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_
|
|||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if related.opts.admin:
|
if has_admin:
|
||||||
p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
|
p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
|
||||||
if not user.has_perm(p):
|
if not user.has_perm(p):
|
||||||
perms_needed.add(related.opts.verbose_name)
|
perms_needed.add(related.opts.verbose_name)
|
||||||
# We don't care about populating deleted_objects now.
|
# We don't care about populating deleted_objects now.
|
||||||
continue
|
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
|
# Don't display link to edit, because it either has no
|
||||||
# admin or is edited inline.
|
# admin or is edited inline.
|
||||||
nh(deleted_objects, current_depth, [u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), sub_obj), []])
|
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: <a href="../../../../%s/%s/%s/">%s</a>' % \
|
nh(deleted_objects, current_depth, [u'%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
|
||||||
(force_unicode(capfirst(related.opts.verbose_name)), related.opts.app_label, related.opts.object_name.lower(),
|
(force_unicode(capfirst(related.opts.verbose_name)), related.opts.app_label, related.opts.object_name.lower(),
|
||||||
sub_obj._get_pk_val(), sub_obj), []])
|
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:
|
else:
|
||||||
has_related_objs = False
|
has_related_objs = False
|
||||||
for sub_obj in getattr(obj, rel_opts_name).all():
|
for sub_obj in getattr(obj, rel_opts_name).all():
|
||||||
has_related_objs = True
|
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
|
# Don't display link to edit, because it either has no
|
||||||
# admin or is edited inline.
|
# admin or is edited inline.
|
||||||
nh(deleted_objects, current_depth, [u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), escape(sub_obj)), []])
|
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.
|
# Display a link to the admin page.
|
||||||
nh(deleted_objects, current_depth, [u'%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
|
nh(deleted_objects, current_depth, [u'%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
|
||||||
(force_unicode(capfirst(related.opts.verbose_name)), related.opts.app_label, related.opts.object_name.lower(), sub_obj._get_pk_val(), escape(sub_obj)), []])
|
(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
|
# If there were related objects, and the user doesn't have
|
||||||
# permission to delete them, add the missing perm to perms_needed.
|
# 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())
|
p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
|
||||||
if not user.has_perm(p):
|
if not user.has_perm(p):
|
||||||
perms_needed.add(related.opts.verbose_name)
|
perms_needed.add(related.opts.verbose_name)
|
||||||
for related in opts.get_all_related_many_to_many_objects():
|
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:
|
if related.opts in opts_seen:
|
||||||
continue
|
continue
|
||||||
opts_seen.append(related.opts)
|
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:
|
if has_related_objs:
|
||||||
for sub_obj in rel_objs.all():
|
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
|
# Don't display link to edit, because it either has no
|
||||||
# admin or is edited inline.
|
# admin or is edited inline.
|
||||||
nh(deleted_objects, current_depth, [_('One or more %(fieldname)s in %(name)s: %(obj)s') % \
|
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))), []])
|
(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
|
# If there were related objects, and the user doesn't have
|
||||||
# permission to change them, add the missing perm to perms_needed.
|
# 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())
|
p = u'%s.%s' % (related.opts.app_label, related.opts.get_change_permission())
|
||||||
if not user.has_perm(p):
|
if not user.has_perm(p):
|
||||||
perms_needed.add(related.opts.verbose_name)
|
perms_needed.add(related.opts.verbose_name)
|
||||||
|
@ -99,7 +99,7 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
|
|||||||
def render(self, name, value, attrs=None):
|
def render(self, name, value, attrs=None):
|
||||||
attrs['class'] = 'vManyToManyRawIdAdminField'
|
attrs['class'] = 'vManyToManyRawIdAdminField'
|
||||||
if value:
|
if value:
|
||||||
value = ','.join(value)
|
value = ','.join([str(v) for v in value])
|
||||||
else:
|
else:
|
||||||
value = ""
|
value = ""
|
||||||
return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
|
return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user