Example #1
0
    def handle_add_save(self, action, data):
        """After succesful creation of translation, redirect to the view.
        """
        #url = url.absoluteURL(self.context, self.request)
        #language = get_language_by_name(data["language"])["name"]
        session = Session()
        trusted = removeSecurityProxy(self.context)
        mapper = sa.orm.object_mapper(trusted)
        pk = getattr(trusted, mapper.primary_key[0].name)

        curr_trans_by_name = dict(
            (ct.field_name, ct)
            for ct in get_field_translations(self.context, data["language"]))

        def is_changed(context, field_name, new_field_text):
            if field_name in curr_trans_by_name:
                old_field_text = curr_trans_by_name[field_name].field_text
            else:
                old_field_text = getattr(context, field_name)
            return not old_field_text == new_field_text

        translated_attribute_names = []
        for field_name in data.keys():
            if field_name == "language":
                continue
            if is_changed(self.context, field_name, data[field_name]):
                translated_attribute_names.append(field_name)
                if field_name in curr_trans_by_name:
                    translation = curr_trans_by_name[field_name]
                else:
                    translation = domain.FieldTranslation()
                    translation.object_id = pk
                    translation.object_type = naming.polymorphic_identity(
                        trusted.__class__)
                    translation.field_name = field_name
                    translation.lang = data["language"]
                    session.add(translation)
                translation.field_text = data[field_name]

        if translated_attribute_names:
            session.flush()
            notify(
                TranslationCreatedEvent(self.context, data["language"],
                                        sorted(translated_attribute_names)))

        # !+EVENT_DRIVEN_CACHE_INVALIDATION(mr, mar-2011) no translate event
        # invalidate caches for this domain object type
        #invalidate_caches_for(trusted.__class__.__name__, "translate")

        #if not self._next_url:
        #    self._next_url = ( \
        #        "%s/versions/%s" % (url, stringKey(version)) + \
        #        "?portal_status_message=Translation added")

        self._finished_add = True
Example #2
0
 def handle_add_save(self, action, data):
     """After succesful creation of translation, redirect to the view.
     """
     #url = url.absoluteURL(self.context, self.request)
     #language = get_language_by_name(data["language"])["name"]
     session = Session()
     trusted = removeSecurityProxy(self.context)
     mapper = sa.orm.object_mapper(trusted)
     pk = getattr(trusted, mapper.primary_key[0].name)
     
     curr_trans_by_name = dict( (ct.field_name, ct) 
         for ct in get_field_translations(self.context, data["language"]) )
     
     def is_changed(context, field_name, new_field_text):
         if field_name in curr_trans_by_name:
             old_field_text = curr_trans_by_name[field_name].field_text
         else:
             old_field_text = getattr(context, field_name)
         return not old_field_text == new_field_text
     
     translated_attribute_names = []
     for field_name in data.keys():
         if field_name == "language":
             continue
         if is_changed(self.context, field_name, data[field_name]):
             translated_attribute_names.append(field_name)
             if field_name in curr_trans_by_name:
                 translation = curr_trans_by_name[field_name]
             else:
                 translation = domain.FieldTranslation()
                 translation.object_id = pk
                 translation.object_type = naming.polymorphic_identity(trusted.__class__)
                 translation.field_name = field_name
                 translation.lang = data["language"]
                 session.add(translation)
             translation.field_text = data[field_name]
     
     if translated_attribute_names:
         session.flush()
         notify(TranslationCreatedEvent(self.context, 
                 data["language"], sorted(translated_attribute_names)))
     
     # !+EVENT_DRIVEN_CACHE_INVALIDATION(mr, mar-2011) no translate event
     # invalidate caches for this domain object type
     #invalidate_caches_for(trusted.__class__.__name__, "translate")
     
     #if not self._next_url:
     #    self._next_url = ( \
     #        "%s/versions/%s" % (url, stringKey(version)) + \
     #        "?portal_status_message=Translation added")
     
     self._finished_add = True
Example #3
0
 def translate(self, context, name):
     """Gets translated field values
     """
     lang = get_default_language()
     if not lang:
         return getattr(context, name, "")
     if interfaces.ITranslatable.providedBy(context):
         if context.language != lang:
             translation = get_field_translations(context, lang)
             if translation:
                 translation = filter(lambda tr:tr.field_name==name, 
                     translation)
                 if translation[0].field_text:
                     return translation[0].field_text
     return getattr(context, name)
Example #4
0
 def translate(self, context, name):
     """Gets translated field values
     """
     lang = get_default_language()
     if not lang:
         return getattr(context, name, "")
     if interfaces.ITranslatable.providedBy(context):
         if context.language != lang:
             translation = get_field_translations(context, lang)
             if translation:
                 translation = filter(lambda tr: tr.field_name == name,
                                      translation)
                 if translation[0].field_text:
                     return translation[0].field_text
     return getattr(context, name)
Example #5
0
    def setUpWidgets(self, ignore_request=False):
        languages = get_all_languages()
        self.form_fields = filterFields(self.context, self.form_fields)

        # do not display empty form fields
        omit_names = []
        for f in self.form_fields:
            val = getattr(self.context, f.__name__)
            if val is None:
                omit_names.append(f.__name__)
        self.form_fields = self.form_fields.omit(*omit_names)
        context = self.context
        if ITranslatable.providedBy(self.context):
            lang = get_default_language()
            try:
                translation = get_field_translations(self.context, lang)
            except:
                translation = []
            if (
                not translation
                and getattr(self.context, "language", None)
                and getattr(self.context, "language", None) != lang
            ):
                supported_lang = languages.get(lang)
                if supported_lang:
                    langname = supported_lang.get("native", None)
                    if langname == None:
                        langname = supported_lang.get("name")
                    self.status = translate(
                        _(u"This content is not yet translated into" + " $language", mapping={"language": langname}),
                        domain="bungeni",
                        context=self.request,
                    )
            context = copy(removeSecurityProxy(self.context))
            for field_translation in translation:
                setattr(context, field_translation.field_name, field_translation.field_text)
        self.widgets = form.setUpEditWidgets(
            self.form_fields,
            "",
            context,
            self.request,
            adapters=self.adapters,
            for_display=True,
            ignore_request=ignore_request,
        )
 def translation_status(self):
     if ITranslatable.providedBy(self.context) and len(capi.pivot_languages):
         untranslated = list(capi.pivot_languages)
         if self.context.language in untranslated:
             untranslated.remove(self.context.language)
         for pivot_lang in untranslated:
             if translation.get_field_translations(self.context, pivot_lang):
                 untranslated.remove(pivot_lang)
         if len(untranslated):
             i18n_langs = []
             locale = locales.getLocale(get_default_language().split("-")[0], None)
             for lang in untranslated:
                 if locale and locale.displayNames and locale.displayNames.languages:
                     i18n_langs.append(locale.displayNames.languages.get(lang, lang))
                     continue
                 i18n_langs.append(lang)
             return ", ".join(i18n_langs)
         return translate(_("translated"), context=get_request())
     return translate("n/a", context=get_request())
Example #7
0
    def setUpWidgets(self, ignore_request=False):
        languages = get_all_languages()
        self.form_fields = filterFields(self.context, self.form_fields)

        #do not display empty form fields
        omit_names = []
        for f in self.form_fields:
            val = getattr(self.context, f.__name__)
            if val is None:
                omit_names.append(f.__name__)
        self.form_fields = self.form_fields.omit(*omit_names)
        context = self.context
        if ITranslatable.providedBy(self.context):
            lang = get_default_language()
            try:
                translation = get_field_translations(self.context, lang)
            except:
                translation = []
            if (not translation and getattr(self.context, "language", None)
                    and getattr(self.context, "language", None) != lang):
                supported_lang = languages.get(lang)
                if supported_lang:
                    langname = supported_lang.get("native", None)
                    if langname == None:
                        langname = supported_lang.get("name")
                    self.status = translate(
                        _(u"This content is not yet translated into" +\
                            " $language",
                            mapping={"language": langname}),
                        domain="bungeni",
                        context=self.request
                    )
            context = copy(removeSecurityProxy(self.context))
            for field_translation in translation:
                setattr(context, field_translation.field_name,
                        field_translation.field_text)
        self.widgets = form.setUpEditWidgets(self.form_fields,
                                             "",
                                             context,
                                             self.request,
                                             adapters=self.adapters,
                                             for_display=True,
                                             ignore_request=ignore_request)
Example #8
0
 def getMessages(self):
     """display a message indicating that a doc needs translation to pivot"""
     messages = []
     if capi.pivot_languages:
         is_translated = False
         context_lang = self.context.language
         for lang in capi.pivot_languages:
             if lang == context_lang:
                 is_translated = True
                 break
             trans = translation.get_field_translations(self.context, lang)
             if trans:
                 is_translated = True
                 break
         if not is_translated:
             messages.append(
                 {"level": "warning", "header": _("Pivot Translation"), 
                     "text": u"This document has no pivot translation."}
             )
     return messages
 def translation_status(self):
     if ITranslatable.providedBy(self.context) and len(capi.pivot_languages):
         untranslated = list(capi.pivot_languages)
         if self.context.language in untranslated:
             untranslated.remove(self.context.language)
         for pivot_lang in untranslated:
             if translation.get_field_translations(self.context, pivot_lang):
                 untranslated.remove(pivot_lang)
         if len(untranslated):
             i18n_langs = []
             locale = locales.getLocale(get_default_language().split("-")[0], None)
             for lang in untranslated:
                 if (locale and 
                         locale.displayNames and 
                         locale.displayNames.languages
                     ):
                     i18n_langs.append(
                         locale.displayNames.languages.get(lang, lang))
                     continue
                 i18n_langs.append(lang)
             return ", ".join(i18n_langs)
         return translate(_("translated"), context=get_request())
     return translate("n/a", context=get_request())
Example #10
0
    def setUpWidgets(self, ignore_request=False):
        self.set_untranslatable_fields_for_display()

        #get the translation if available
        language = self.request.get("language")

        translation = get_field_translations(self.context, language)
        if translation:
            self.is_translation = True
        else:
            self.is_translation = False
        context = copy(removeSecurityProxy(self.context))
        for field_translation in translation:
            setattr(context, field_translation.field_name,
                    field_translation.field_text)
        self.widgets = formlib.form.setUpEditWidgets(
            self.form_fields, self.prefix, context, self.request,
            adapters=self.adapters, ignore_request=ignore_request)

        if language is not None:
            widget = self.widgets["language"]
            try:
                self.language = language
                widget.vocabulary = CurrentLanguageVocabulary().__call__(self)
                widget.vocabulary.getTermByToken(language)
            except LookupError:
                raise BadRequest("No such language token: '%s'" % language)

            # if the term exists in the vocabulary, set the value on
            # the widget
            widget.setRenderedValue(language)
        # for translations, add a ``render_original`` method to each
        # widget, which will render the display widget bound to the
        # original (HEAD) document
        # render pivot language as source if there is a translation
        head = self.context
        if capi.pivot_languages:
            for plang in capi.pivot_languages:
                trans = get_field_translations(head, plang)
                if trans:
                    head = copy(removeSecurityProxy(head))
                    for field_translation in trans:
                        setattr(head, field_translation.field_name,
                                field_translation.field_text)
                    break
        form_fields = ui.setUpFields(self.context.__class__, "view")
        for widget in self.widgets:
            form_field = form_fields.get(widget.context.__name__)
            if form_field is None:
                form_field = formlib.form.Field(widget.context)

            # bind field to head document
            field = form_field.field.bind(head)

            # create custom widget or instantiate widget using
            # component lookup
            if form_field.custom_widget is not None:
                display_widget = form_field.custom_widget(
                    field, self.request)
            else:
                display_widget = component.getMultiAdapter(
                    (field, self.request), IDisplayWidget)

            display_widget.setRenderedValue(field.get(head))

            # attach widget as ``render_original``
            widget.render_original = display_widget
Example #11
0
    def setUpWidgets(self, ignore_request=False):
        self.set_untranslatable_fields_for_display()

        #get the translation if available
        language = self.request.get("language")

        translation = get_field_translations(self.context, language)
        if translation:
            self.is_translation = True
        else:
            self.is_translation = False
        context = copy(removeSecurityProxy(self.context))
        for field_translation in translation:
            setattr(context, field_translation.field_name,
                    field_translation.field_text)
        self.widgets = formlib.form.setUpEditWidgets(
            self.form_fields,
            self.prefix,
            context,
            self.request,
            adapters=self.adapters,
            ignore_request=ignore_request)

        if language is not None:
            widget = self.widgets["language"]
            try:
                self.language = language
                widget.vocabulary = CurrentLanguageVocabulary().__call__(self)
                widget.vocabulary.getTermByToken(language)
            except LookupError:
                raise BadRequest("No such language token: '%s'" % language)

            # if the term exists in the vocabulary, set the value on
            # the widget
            widget.setRenderedValue(language)
        # for translations, add a ``render_original`` method to each
        # widget, which will render the display widget bound to the
        # original (HEAD) document
        # render pivot language as source if there is a translation
        head = self.context
        if capi.pivot_languages:
            for plang in capi.pivot_languages:
                trans = get_field_translations(head, plang)
                if trans:
                    head = copy(removeSecurityProxy(head))
                    for field_translation in trans:
                        setattr(head, field_translation.field_name,
                                field_translation.field_text)
                    break
        form_fields = ui.setUpFields(self.context.__class__, "view")
        for widget in self.widgets:
            form_field = form_fields.get(widget.context.__name__)
            if form_field is None:
                form_field = formlib.form.Field(widget.context)

            # bind field to head document
            field = form_field.field.bind(head)

            # create custom widget or instantiate widget using
            # component lookup
            if form_field.custom_widget is not None:
                display_widget = form_field.custom_widget(field, self.request)
            else:
                display_widget = component.getMultiAdapter(
                    (field, self.request), IDisplayWidget)

            display_widget.setRenderedValue(field.get(head))

            # attach widget as ``render_original``
            widget.render_original = display_widget