Esempio n. 1
0
def test_get_wagtailtrans_setting_override():
    with override_settings(
        WAGTAILTRANS_SYNC_TREE=False,
        WAGTAILTRANS_LANGUAGES_PER_SITE=True
    ):
        assert not conf.get_wagtailtrans_setting('SYNC_TREE')
        assert conf.get_wagtailtrans_setting('LANGUAGES_PER_SITE')
Esempio n. 2
0
def synchronize_trees(sender, instance, **kwargs):
    """synchronize the translation trees when
    a TranslatablePage is created.

    :param sender: Sender model
    :param instance: TranslatablePage instance
    :param kwargs: kwargs e.g. created

    """
    try:
        site = instance.get_site()
    except ObjectDoesNotExist:
        return

    if get_wagtailtrans_setting('LANGUAGES_PER_SITE'):
        site_default = site.sitelanguages.default_language
        is_default_language = instance.language == site_default
        other_languages = site.sitelanguages.other_languages.all()
    else:
        is_default_language = instance.language.is_default
        other_languages = Language.objects.filter(is_default=False)

    if not kwargs.get('created') or not getattr(instance, 'language', False) or not is_default_language:
        return

    for lang in other_languages:
        instance.create_translation(language=lang, copy_fields=True)
Esempio n. 3
0
    def page_translations_menu_items(page, page_perms, is_parent=False):
        priority = 1
        exclude_lang = []

        if hasattr(page, 'language') and page.language:
            exclude_lang += [page.language.code]

        if get_wagtailtrans_setting('STRICT_TRANSLATE_PERMISSIONS'):
            user_groups = page_perms.user.groups.values_list('name', flat=True)
            if not is_privileged_user(user_groups):
                exclude_lang += [
                    lang
                    for lang in Language.objects.live().values_list('code',
                                                                    flat=True)
                    if lang not in allowed_language_codes(user_groups)
                ]

        other_languages = set(Language.objects.live().exclude(
            code__in=exclude_lang).order_by('position'))

        translations = page.get_translations(
            only_live=False).select_related('language')
        taken_languages = set(t.language for t in translations)

        translation_targets = other_languages - taken_languages
        for language in translation_targets:
            yield widgets.Button(force_text(language),
                                 reverse('wagtailtrans_translations:add',
                                         kwargs={
                                             'instance_id': page.pk,
                                             'language_code': language.code,
                                         }),
                                 priority=priority)

            priority += 1
Esempio n. 4
0
def get_canonical_pages_for_delete(page):
    """Get the translations made for this page

    :param page: Page instance
    :return: queryset or False
    """
    page = page.specific
    if get_wagtailtrans_setting('SYNC_TREE') and getattr(page, 'language', False) and not page.canonical_page:
        return TranslatablePage.objects.filter(canonical_page=page)
    return False
Esempio n. 5
0
def hide_non_canonical_languages(parent_page, pages, request):
    """Hide translations when WAGTAILTRANS_HIDE_TRANSLATION_TREES=True.

    This allows the user to only see the canonical language in the admin.

    """
    if parent_page.depth > 1 and get_wagtailtrans_setting(
            'HIDE_TRANSLATION_TREES'):
        return pages.filter(pk__in=(TranslatablePage.objects.filter(
            canonical_page__isnull=True).values_list('pk', flat=True)))
    return pages
Esempio n. 6
0
def register_signal_handlers():
    """Registers signal handlers.

    To create a signal for TranslatablePage we have to use wagtails
    get_page_model.

    """
    post_save.connect(create_language_permissions_and_group, sender=Language)
    init_new_page.connect(force_parent_language)
    if get_wagtailtrans_setting('SYNC_TREE'):
        if get_wagtailtrans_setting('LANGUAGES_PER_SITE'):
            m2m_changed.connect(update_language_trees_for_site, sender=SiteLanguages.other_languages.through)
        else:
            post_save.connect(create_new_language_tree, sender=Language)

        for model in get_page_models():
            if hasattr(model, 'create_translation'):
                post_save.connect(synchronize_trees, sender=model)

            if hasattr(model, 'get_translations'):
                pre_delete.connect(synchronize_deletions, sender=model)
Esempio n. 7
0
    def can_delete(self):
        """Check if a page can be deleted
        We make the check if the translated sites are kept in sync and
        if the page is a translated page (it has a canonical page)

        :return: Boolean

        """
        has_canonical = getattr(self.page.specific, 'canonical_page', False)
        if (has_canonical and get_wagtailtrans_setting('SYNC_TREE')
                and not self.user.is_superuser):
            return False
        return super(TranslatablePagePermissionTester, self).can_delete()
Esempio n. 8
0
def create_new_language_tree_for_site(site, language):
    """Create a new language tree for a specific site.

    :param site: The site for which a new tree wil be created
    :param language: The language in which the tree wil be created
    """
    site_pages = site.root_page.get_children().values_list('pk', flat=True)
    default_language = (
        site.sitelanguages.default_language
        if get_wagtailtrans_setting('LANGUAGES_PER_SITE')
        else Language.objects.default()
    )
    canonical_home_page = TranslatablePage.objects.filter(pk__in=site_pages, language=default_language).first()
    if not canonical_home_page:
        # no pages created yet.
        return
    descendants = canonical_home_page.get_descendants(inclusive=True)
    for child_page in descendants:
        child_page = child_page.specific
        if hasattr(child_page, 'language') and not child_page.has_translation(language):
            child_page.create_translation(language, copy_fields=True)
Esempio n. 9
0
def force_parent_language(**kwargs):
    """Force the initial language of the first page, before creating..

    When adding a homepage to a site, the initial language should be set.
    By default we set the default language from the Languages model, however
    when the languages are defined per site, it's possible that the default
    language differs from the database default.

    """
    page = kwargs.get('page')
    parent = kwargs.get('parent')

    #: Force the page language according to the parent, when the parent
    #: has no language set and is a site root page, force the default language
    #: For now we assume there isn't more than 1 site rooted at the parent.
    if hasattr(parent, 'language'):
        page.language = parent.language
    elif get_wagtailtrans_setting('LANGUAGES_PER_SITE'):
        site = parent.sites_rooted_here.first()
        if site:
            lang_settings = SiteLanguages.for_site(site)
            page.language = lang_settings.default_language or Language.objects.default()
Esempio n. 10
0
def edit_in_language_items(page, page_perms, is_parent=False):
    """
    Add all other languages in the ``Edit in`` dropdown.

    All languages other than the canonical language are listed as dropdown
    options which allows the user to click on them and edit the page in the
    language they prefer.
    """
    excluded_language_codes = []
    if get_wagtailtrans_setting('STRICT_TRANSLATE_PERMISSIONS'):
        """Restricting translate permissions according to user's groups."""
        user_groups = page_perms.user.groups.values_list('name', flat=True)
        if not is_privileged_user(user_groups):
            excluded_language_codes += [
                lang for lang in Language.objects.live().values_list('code',
                                                                     flat=True)
                if lang not in allowed_language_codes(user_groups)
            ]

    other_languages = (page.specific.get_translations(only_live=False).exclude(
        pk=page.pk, language__code__in=excluded_language_codes).select_related(
            'language').order_by('language__position'))

    for priority, language_page in enumerate(other_languages):
        edit_url = reverse('wagtailadmin_pages:edit',
                           args=(language_page.pk, ))
        return_page = language_page.canonical_page or language_page
        next_url = reverse('wagtailadmin_explore',
                           args=(return_page.get_parent().pk, ))

        yield widgets.Button(
            force_text(language_page.language),
            "{edit_url}?next={next_url}".format(edit_url=edit_url,
                                                next_url=next_url),
            priority=priority,
        )
Esempio n. 11
0
    menu_order = 1000
    list_display = ['__str__', 'position', 'live', 'is_default']
    list_filter = ['live']


modeladmin_register(LanguageModelAdmin)


@hooks.register('register_admin_urls')
def register_admin_urls():
    return [
        url(r'^translate/', include(translations, namespace='wagtailtrans_translations')),
    ]


if get_wagtailtrans_setting('LANGUAGES_PER_SITE'):
    @hooks.register('insert_global_admin_js')
    def global_admin_js():
        return format_html(
            '<script type="text/javascript" src="{path}"></script>'.format(
                path=static('wagtailtrans/js/site_languages_editor.js'))
        )


if not get_wagtailtrans_setting('SYNC_TREE'):
    """Only load hooks when WAGTAILTRANS_SYNC_TREE is disabled"""

    @hooks.register('register_page_listing_buttons')
    def page_translations_menu(page, page_perms, is_parent=False):
        if not hasattr(page, 'language'):
            return
Esempio n. 12
0
def test_get_wagtailtrans_setting_defaults():
    for key, value in conf.DEFAULT_SETTINGS.items():
        assert conf.get_wagtailtrans_setting(key) == value