Skip to content

Commit

Permalink
Add support for ModelAdmin.get_object()'s third argument, introduced …
Browse files Browse the repository at this point in the history
…in Django 1.8.
  • Loading branch information
spectras committed Dec 23, 2015
1 parent 01ee36a commit 496aa83
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
2 changes: 2 additions & 0 deletions docs/public/release_notes.rst
Expand Up @@ -16,6 +16,8 @@ New features:
- Translated model's :meth:`~django.db.models.Model.save` method now accepts translated field
names in ``update_fields``. Also, if only translated fields, or only untranslated fields
are specified in ``update_fields``, the extra query will be skipped.
- Support for third parameter on ``ModelAdmin``'s
:meth:`~django.contrib.admin.options.ModelAdmin.get_object` method was added.
- Experimental support for using :ref:`language('all') <language-public>` together with
:meth:`~django.db.models.query.QuerySet.select_related` is being introduced. Please
check the generated queries if you use it. Feedback is appreciated.
Expand Down
27 changes: 21 additions & 6 deletions hvad/admin.py
Expand Up @@ -9,7 +9,7 @@
from django.contrib.admin.util import (flatten_fieldsets, unquote,
get_deleted_objects)
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.exceptions import PermissionDenied, ValidationError
from django.core.urlresolvers import reverse
from django.db import router, transaction
from django.forms.models import model_to_dict
Expand All @@ -28,7 +28,7 @@
from hvad.compat import urlencode, urlparse
from hvad.forms import TranslatableModelForm, translatable_inlineformset_factory, translatable_modelform_factory
from hvad.utils import load_translation
from hvad.manager import FALLBACK_LANGUAGES
from hvad.manager import FALLBACK_LANGUAGES, TranslationQueryset

def get_language_name(language_code):
return dict(settings.LANGUAGES).get(language_code, language_code)
Expand Down Expand Up @@ -298,9 +298,24 @@ def deletion_not_allowed(self, request, obj, language_code):
def delete_model_translation(self, request, obj):
obj.delete()

def get_object(self, request, object_id, *args):
obj = super(TranslatableAdmin, self).get_object(request, object_id, *args)
if obj is None: # object was not in queryset, bail out
def get_object(self, request, object_id, from_field=None):
queryset = self.get_queryset(request)
if isinstance(queryset, TranslationQueryset): # will always be true once Django 1.9 is required
model = queryset.shared_model
if from_field is None:
field = model._meta.pk
else:
try:
field = model._meta.get_field(from_field)
except FieldDoesNotExist:
field = model._meta.translations_model._meta.get_field(from_field)
else:
model = queryset.model
field = model._meta.pk if from_field is None else model._meta.get_field(from_field)
try:
object_id = field.to_python(object_id)
obj = queryset.get(**{field.name: object_id})
except (model.DoesNotExist, ValidationError, ValueError):
return None

# object was in queryset - need to make sure we got the right translation
Expand All @@ -327,7 +342,7 @@ def get_queryset(self, request):
languages.append(lang)
qs = self.model._default_manager.untranslated().use_fallbacks(*languages)
# TODO: this should be handled by some parameter to the ChangeList.
ordering = getattr(self, 'ordering', None) or () # otherwise we might try to *None, which is bad ;)
ordering = getattr(self, 'ordering', None) or ()
if ordering:
qs = qs.order_by(*ordering)
return qs
Expand Down

0 comments on commit 496aa83

Please sign in to comment.