Fixed #10897 -- Modified use of ngettext to ungettext in admin change messages. Thanks to zuber for the report and patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10677 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
9d28568cb4
commit
31c833f113
|
@ -18,7 +18,7 @@ from django.utils.safestring import mark_safe
|
|||
from django.utils.functional import curry
|
||||
from django.utils.text import capfirst, get_text_list
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import ngettext, ugettext_lazy
|
||||
from django.utils.translation import ungettext, ugettext_lazy
|
||||
from django.utils.encoding import force_unicode
|
||||
try:
|
||||
set
|
||||
|
@ -108,10 +108,10 @@ class BaseModelAdmin(object):
|
|||
|
||||
# If we've got overrides for the formfield defined, use 'em. **kwargs
|
||||
# passed to formfield_for_dbfield override the defaults.
|
||||
for klass in db_field.__class__.mro():
|
||||
if klass in self.formfield_overrides:
|
||||
kwargs = dict(self.formfield_overrides[klass], **kwargs)
|
||||
return db_field.formfield(**kwargs)
|
||||
for klass in db_field.__class__.mro():
|
||||
if klass in self.formfield_overrides:
|
||||
kwargs = dict(self.formfield_overrides[klass], **kwargs)
|
||||
return db_field.formfield(**kwargs)
|
||||
|
||||
# For any other type of field, just call its formfield() method.
|
||||
return db_field.formfield(**kwargs)
|
||||
|
@ -439,26 +439,26 @@ class ModelAdmin(BaseModelAdmin):
|
|||
# want *any* actions enabled on this page.
|
||||
if self.actions is None:
|
||||
return []
|
||||
|
||||
|
||||
actions = []
|
||||
|
||||
|
||||
# Gather actions from the admin site first
|
||||
for (name, func) in self.admin_site.actions:
|
||||
description = getattr(func, 'short_description', name.replace('_', ' '))
|
||||
actions.append((func, name, description))
|
||||
|
||||
# Then gather them from the model admin and all parent classes,
|
||||
|
||||
# Then gather them from the model admin and all parent classes,
|
||||
# starting with self and working back up.
|
||||
for klass in self.__class__.mro()[::-1]:
|
||||
class_actions = getattr(klass, 'actions', [])
|
||||
# Avoid trying to iterate over None
|
||||
if not class_actions:
|
||||
continue
|
||||
continue
|
||||
actions.extend([self.get_action(action) for action in class_actions])
|
||||
|
||||
|
||||
# get_action might have returned None, so filter any of those out.
|
||||
actions = filter(None, actions)
|
||||
|
||||
|
||||
# Convert the actions into a SortedDict keyed by name
|
||||
# and sorted by description.
|
||||
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower()))
|
||||
|
@ -466,7 +466,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||
(name, (func, name, desc))
|
||||
for func, name, desc in actions
|
||||
])
|
||||
|
||||
|
||||
return actions
|
||||
|
||||
def get_action_choices(self, request, default_choices=BLANK_CHOICE_DASH):
|
||||
|
@ -490,20 +490,20 @@ class ModelAdmin(BaseModelAdmin):
|
|||
if callable(action):
|
||||
func = action
|
||||
action = action.__name__
|
||||
|
||||
|
||||
# Next, look for a method. Grab it off self.__class__ to get an unbound
|
||||
# method instead of a bound one; this ensures that the calling
|
||||
# conventions are the same for functions and methods.
|
||||
elif hasattr(self.__class__, action):
|
||||
func = getattr(self.__class__, action)
|
||||
|
||||
|
||||
# Finally, look for a named method on the admin site
|
||||
else:
|
||||
try:
|
||||
func = self.admin_site.get_action(action)
|
||||
except KeyError:
|
||||
return None
|
||||
|
||||
|
||||
if hasattr(func, 'short_description'):
|
||||
description = func.short_description
|
||||
else:
|
||||
|
@ -666,7 +666,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||
data = request.POST.copy()
|
||||
data.pop(helpers.ACTION_CHECKBOX_NAME, None)
|
||||
data.pop("index", None)
|
||||
|
||||
|
||||
# Use the action whose button was pushed
|
||||
try:
|
||||
data.update({'action': data.getlist('action')[action_index]})
|
||||
|
@ -675,7 +675,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||
# POST data, so by deleting action it'll fail the validation check
|
||||
# below. So no need to do anything here
|
||||
pass
|
||||
|
||||
|
||||
action_form = self.action_form(data, auto_id=None)
|
||||
action_form.fields['action'].choices = self.get_action_choices(request)
|
||||
|
||||
|
@ -879,10 +879,10 @@ class ModelAdmin(BaseModelAdmin):
|
|||
app_label = opts.app_label
|
||||
if not self.has_change_permission(request, None):
|
||||
raise PermissionDenied
|
||||
|
||||
|
||||
# Check actions to see if any are available on this changelist
|
||||
actions = self.get_actions(request)
|
||||
|
||||
|
||||
# Remove action checkboxes if there aren't any actions available.
|
||||
list_display = list(self.list_display)
|
||||
if not actions:
|
||||
|
@ -890,7 +890,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||
list_display.remove('action_checkbox')
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
try:
|
||||
cl = ChangeList(request, self.model, list_display, self.list_display_links, self.list_filter,
|
||||
self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self)
|
||||
|
@ -903,7 +903,7 @@ class ModelAdmin(BaseModelAdmin):
|
|||
if ERROR_FLAG in request.GET.keys():
|
||||
return render_to_response('admin/invalid_setup.html', {'title': _('Database error')})
|
||||
return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
|
||||
|
||||
|
||||
# If the request was POSTed, this might be a bulk action or a bulk edit.
|
||||
# Try to look up an action first, but if this isn't an action the POST
|
||||
# will fall through to the bulk edit check, below.
|
||||
|
@ -937,11 +937,11 @@ class ModelAdmin(BaseModelAdmin):
|
|||
name = force_unicode(opts.verbose_name)
|
||||
else:
|
||||
name = force_unicode(opts.verbose_name_plural)
|
||||
msg = ngettext("%(count)s %(name)s was changed successfully.",
|
||||
"%(count)s %(name)s were changed successfully.",
|
||||
changecount) % {'count': changecount,
|
||||
'name': name,
|
||||
'obj': force_unicode(obj)}
|
||||
msg = ungettext("%(count)s %(name)s was changed successfully.",
|
||||
"%(count)s %(name)s were changed successfully.",
|
||||
changecount) % {'count': changecount,
|
||||
'name': name,
|
||||
'obj': force_unicode(obj)}
|
||||
self.message_user(request, msg)
|
||||
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
|
|
Loading…
Reference in New Issue