def get_preferred_translation_from_lang(obj, language): if not hasattr(obj, 'translations'): translation_pool.annotate_with_translations(obj) for translation in obj.translations: if translation.language == language: return translation return obj.translations[0]
def get_preferred_translation_from_lang(obj, language): if not hasattr(obj, 'translations'): translation_pool.annotate_with_translations(obj) for translation in obj.translations: if translation.language == language: return translation return obj.translations[0]
def get_preferred_translation_from_request(obj, request): language = getattr(request, 'LANGUAGE_CODE', settings.LANGUAGE_CODE) if not hasattr(obj, 'translations'): translation_pool.annotate_with_translations(obj) for translation in obj.translations: if translation.language == language: return translation return obj.translations[0]
def get_preferred_translation_from_request(obj, request): language = getattr(request, 'LANGUAGE_CODE', settings.LANGUAGE_CODE) if not hasattr(obj, 'translations'): translation_pool.annotate_with_translations(obj) for translation in obj.translations: if translation.language == language: return translation return obj.translations[0]
def render(self, name, value, attrs=None): hidden_input = super(LanguageWidget, self).render(name, value, attrs=attrs) lang_dict = dict(settings.LANGUAGES) current_languages = [] translation_of_obj = self.translation_of_obj if translation_of_obj and translation_of_obj.pk: info = translation_pool.get_info(translation_of_obj.__class__) translation_of_obj = translation_pool.annotate_with_translations(translation_of_obj) for translation in translation_of_obj.translations: current_languages.append(getattr(translation, info.language_field)) buttons = [] for lang in settings.LANGUAGES: current_lang = lang[0] == value language_exists = lang[0] in current_languages button_classes = u'class="button%s"' % ( current_lang and ' simple-translation-current' or language_exists and ' simple-translation-exists' or '', ) disabled = current_lang and ' disabled="disabled"' or '' buttons.append(u''' <input onclick="trigger_lang_button(this,'./?language=%s');" %s name="%s" value="%s" type="button"%s />''' % ( lang[0], button_classes, lang[0], lang[1], disabled ) ) if self.translation_obj.pk and len(current_languages) > 1: lang_descr = _('Delete %s translation') % force_unicode(lang_dict[str(value)]) buttons.append(u'''<p class="deletelink-box simple-translation-delete"><a href="delete-translation/?language=%s" class="deletelink deletetranslation">%s</a></p>''' % (value, lang_descr)) tabs = u"""%s%s%s""" % (self.button_js, hidden_input, u''.join(buttons)) return mark_safe(tabs)
def items(self, obj): items = self.get_queryset(obj)[:10] items = [ get_preferred_translation_from_lang(title, self.language_code) for title in translation_pool.annotate_with_translations(items) ] return items
def render(self, name, value, attrs=None): hidden_input = super(LanguageWidget, self).render(name, value, attrs=attrs) lang_dict = dict(settings.LANGUAGES) current_languages = [] translation_of_obj = self.translation_of_obj if translation_of_obj and translation_of_obj.pk: info = translation_pool.get_info(translation_of_obj.__class__) translation_of_obj = translation_pool.annotate_with_translations( translation_of_obj) for translation in translation_of_obj.translations: current_languages.append( getattr(translation, info.language_field)) buttons = [] for lang in settings.LANGUAGES: current_lang = lang[0] == value language_exists = lang[0] in current_languages button_classes = u'class="button%s"' % ( current_lang and ' simple-translation-current' or language_exists and ' simple-translation-exists' or '', ) disabled = current_lang and ' disabled="disabled"' or '' buttons.append( u''' <input onclick="trigger_lang_button(this,'./?language=%s');" %s name="%s" value="%s" type="button"%s />''' % (lang[0], button_classes, lang[0], lang[1], disabled)) if self.translation_obj.pk and len(current_languages) > 1: lang_descr = _('Delete %s translation') % force_text( lang_dict[str(value)]) buttons.append( u'''<p class="deletelink-box simple-translation-delete"><a href="delete-translation/?language=%s" class="deletelink deletetranslation">%s</a></p>''' % (value, lang_descr)) tabs = u"""%s%s%s""" % (self.button_js, hidden_input, u''.join(buttons)) return mark_safe(tabs)
def annotate_with_translations(object_or_list): return translation_pool.annotate_with_translations(object_or_list)
def languages(self, obj): lnk = '<a href="%s/?language=%s">%s</a>' trans_list = [ (obj.pk, \ getattr(t, self.language_field), getattr(t, self.language_field).upper()) for t in getattr(translation_pool.annotate_with_translations(obj), 'translations') or []] return ' '.join([lnk % t for t in trans_list])
def description(self, obj): return getattr(translation_pool.annotate_with_translations(obj), 'translations', []) \ and unicode(translation_pool.annotate_with_translations(obj).translations[0]) or u'No translations'
def delete_translation(self, request, object_id, extra_context=None): language = get_language_from_request(request) opts = self.model._meta translationopts = self.translated_model._meta app_label = translationopts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) if not len(translation_pool.annotate_with_translations(obj).translations) > 1: raise Http404(_('There only exists one translation for this page')) translationobj = get_object_or_404(self.translated_model, **{self.translation_of_field + '__id': object_id, 'language': language}) using = router.db_for_write(self.model) deleted_objects, perms_needed = get_deleted_objects([translationobj], translationopts, request.user, self.admin_site, using) if request.method == 'POST': if perms_needed: raise PermissionDenied message = _('%(obj_name)s with language %(language)s was deleted') % { 'language': [name for code, name in settings.LANGUAGES if code == language][0], 'obj_name': force_unicode(translationopts.verbose_name)} self.log_change(request, translationobj, message) self.message_user(request, message) translationobj.delete() if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_unicode(translationopts.verbose_name), "object": translationobj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": translationopts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, translationopts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)
def items(self, obj): items = self.get_queryset(obj)[:10] items = [get_preferred_translation_from_lang(title, self.language_code) for title in translation_pool.annotate_with_translations(items)] return items
def __unicode__(self): return getattr(translation_pool.annotate_with_translations(self), 'translations', []) \ and unicode(translation_pool.annotate_with_translations(self).translations[0]) or u'No translations'
def description(self, obj): return getattr(translation_pool.annotate_with_translations(obj), 'translations', []) \ and unicode(translation_pool.annotate_with_translations(obj).translations[0]) or u'No translations'
def languages(self, obj): lnk = '<a href="%s/?language=%s">%s</a>' trans_list = [ (obj.pk, \ getattr(t, self.language_field), getattr(t, self.language_field).upper()) for t in getattr(translation_pool.annotate_with_translations(obj), 'translations') or []] return ' '.join([lnk % t for t in trans_list])
def annotate_with_translations(object_or_list): return translation_pool.annotate_with_translations(object_or_list)
def delete_translation(self, request, object_id, extra_context=None): language = get_language_from_request(request) opts = self.model._meta translationopts = self.translated_model._meta app_label = translationopts.app_label try: obj = self.queryset(request).get(pk=unquote(object_id)) except self.model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_delete_permission(request, obj): raise PermissionDenied if obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)}) if not len(translation_pool.annotate_with_translations(obj).translations) > 1: raise Http404(_('There only exists one translation for this page')) translationobj = get_object_or_404(self.translated_model, **{self.translation_of_field + '__id': object_id, 'language': language}) if django.VERSION[1] > 2: # pragma: no cover # WARNING: Django 1.3 is not officially supported yet! using = router.db_for_read(self.model) kwargs = { 'admin_site': self.admin_site, 'user': request.user, 'using': using } else: kwargs = { 'admin_site': self.admin_site, 'user': request.user, } deleted_objects, perms_needed = get_deleted_objects([translationobj], translationopts, **kwargs)[:2] if request.method == 'POST': if perms_needed: raise PermissionDenied message = _('%(obj_name)s with language %(language)s was deleted') % { 'language': [name for code, name in settings.LANGUAGES if code == language][0], 'obj_name': force_text(translationopts.verbose_name)} self.log_change(request, translationobj, message) self.message_user(request, message) translationobj.delete() if not self.has_change_permission(request, None): return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../") context = { "title": _("Are you sure?"), "object_name": force_text(translationopts.verbose_name), "object": translationobj, "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": translationopts, "root_path": self.admin_site.root_path, "app_label": app_label, } context.update(extra_context or {}) context_instance = RequestContext(request, current_app=self.admin_site.name) return render_to_response(self.delete_confirmation_template or [ "admin/%s/%s/delete_confirmation.html" % (app_label, translationopts.object_name.lower()), "admin/%s/delete_confirmation.html" % app_label, "admin/delete_confirmation.html" ], context, context_instance=context_instance)