def __init__(self, *args, **kwargs):
        super(TranslationMixin, self).__init__(*args, **kwargs)

        # if state is not None, no need to patch all the fields
        # this is necessary for data migrations
        # if getattr(self, '_state').db is not None:
        #     return

        TranslationMixin._translation_options = translator.\
            get_options_for_model(
                self.__class__)

        if self.__class__._translated:
            return

        # CONSTRUCT TEMPORARY EDIT HANDLER
        if issubclass(self.__class__, Page):
            edit_handler_class = get_page_edit_handler(self.__class__)
        else:
            edit_handler_class = get_snippet_edit_handler(self.__class__)
        TranslationMixin._wgform_class = edit_handler_class.get_form_class(
            self.__class__)

        defined_tabs = TranslationMixin._fetch_defined_tabs(self.__class__)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = TranslationMixin._patch_panel(self, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(self.__class__, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if issubclass(self.__class__, Page):
            if self.__class__ in PAGE_EDIT_HANDLERS:
                del PAGE_EDIT_HANDLERS[self.__class__]
            edit_handler_class = get_page_edit_handler(self.__class__)
        else:
            if self.__class__ in SNIPPET_EDIT_HANDLERS:
                del SNIPPET_EDIT_HANDLERS[self.__class__]
            edit_handler_class = get_snippet_edit_handler(self.__class__)

        form = edit_handler_class.get_form_class(self.__class__)
        for fname, f in form.base_fields.items():
            # set field required on formset level if original field is required
            # as well
            if fname in self._required_fields:
                f.required = True

            if fname in TranslationMixin._translation_options.fields and TranslationMixin._is_orig_required(
                    fname):
                f.required = False

        self.__class__._translated = True
    def __init__(self, *args, **kwargs):
        super(TranslationMixin, self).__init__(*args, **kwargs)

        # if state is not None, no need to patch all the fields
        # this is necessary for data migrations
        if getattr(self, '_state').db is not None:
            return

        TranslationMixin._translation_options = translator.\
            get_options_for_model(
                self.__class__)

        if self.__class__._translated:
            return

        # CONSTRUCT TEMPORARY EDIT HANDLER
        if issubclass(self.__class__, Page):
            edit_handler_class = get_page_edit_handler(self.__class__)
        else:
            edit_handler_class = get_snippet_edit_handler(self.__class__)
        TranslationMixin._wgform_class = edit_handler_class.get_form_class(
            self.__class__)

        defined_tabs = TranslationMixin._fetch_defined_tabs(self.__class__)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = TranslationMixin._patch_panel(self, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(self.__class__, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if issubclass(self.__class__, Page):
            if self.__class__ in PAGE_EDIT_HANDLERS:
                del PAGE_EDIT_HANDLERS[self.__class__]
            edit_handler_class = get_page_edit_handler(self.__class__)
        else:
            if self.__class__ in SNIPPET_EDIT_HANDLERS:
                del SNIPPET_EDIT_HANDLERS[self.__class__]
            edit_handler_class = get_snippet_edit_handler(self.__class__)

        form = edit_handler_class.get_form_class(self.__class__)
        for fname, f in form.base_fields.items():
            # set field required on formset level if original field is required
            # as well
            if fname in self._required_fields:
                f.required = True

            if fname in TranslationMixin._translation_options.fields and TranslationMixin._is_orig_required(fname):
                f.required = False

        self.__class__._translated = True
Example #3
0
    def test_snippet_form(self):
        """
        In this test we use the InlinePanelSnippet model because it has all the possible "patchable" fields
        so if the created form has all fields the the form was correctly patched
        """
        from wagtail.wagtailsnippets.views.snippets import get_snippet_edit_handler
        snippet_edit_handler = get_snippet_edit_handler(
            models.InlinePanelSnippet)

        form = snippet_edit_handler.get_form_class(models.InlinePanelSnippet)

        inline_model_fields = [
            'field_name_de', 'field_name_en', 'image_chooser_de',
            'image_chooser_en', 'fieldrow_name_de', 'fieldrow_name_en',
            'name_de', 'name_en', 'image_de', 'image_en', 'other_name_de',
            'other_name_en'
        ]

        related_formset_form = form.formsets['related_snippet_model'].form

        try:
            # python 3
            self.assertCountEqual(inline_model_fields,
                                  related_formset_form.base_fields.keys())
        except AttributeError:
            # python 2.7
            self.assertItemsEqual(inline_model_fields,
                                  related_formset_form.base_fields.keys())
    def __init__(self, *args, **kwargs):
        super(SnippetsTranslationMixin, self).__init__(*args, **kwargs)

        SnippetsTranslationMixin._translation_options = translator.\
            get_options_for_model(
                self.__class__)

        if self.__class__._translated:
            return

        edit_handler_class = get_snippet_edit_handler(self.__class__)
        SnippetsTranslationMixin._wgform_class =\
            edit_handler_class.get_form_class(self.__class__)

        defined_tabs =\
            SnippetsTranslationMixin._fetch_defined_tabs(self.__class__)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = SnippetsTranslationMixin._patch_panel(self, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(self.__class__, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if self.__class__ in SNIPPET_EDIT_HANDLERS:
            del SNIPPET_EDIT_HANDLERS[self.__class__]
        edit_handler_class = get_snippet_edit_handler(self.__class__)

        form = edit_handler_class.get_form_class(self.__class__)
        for fname, f in form.base_fields.items():
            # set field required on formset level if original field is required
            # as well
            if fname in self._required_fields:
                f.required = True

            if fname in SnippetsTranslationMixin._translation_options.fields\
                    and SnippetsTranslationMixin._is_orig_required(fname):
                f.required = False

        self.__class__._translated = True
    def __init__(self, *args, **kwargs):
        super(SnippetsTranslationMixin, self).__init__(*args, **kwargs)

        SnippetsTranslationMixin._translation_options = translator.\
            get_options_for_model(
                self.__class__)

        if self.__class__._translated:
            return

        edit_handler_class = get_snippet_edit_handler(self.__class__)
        SnippetsTranslationMixin._wgform_class =\
            edit_handler_class.get_form_class(self.__class__)

        defined_tabs =\
            SnippetsTranslationMixin._fetch_defined_tabs(self.__class__)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = SnippetsTranslationMixin._patch_panel(self, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(self.__class__, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if self.__class__ in SNIPPET_EDIT_HANDLERS:
            del SNIPPET_EDIT_HANDLERS[self.__class__]
        edit_handler_class = get_snippet_edit_handler(self.__class__)

        form = edit_handler_class.get_form_class(self.__class__)
        for fname, f in form.base_fields.items():
            # set field required on formset level if original field is required
            # as well
            if fname in self._required_fields:
                f.required = True

            if fname in SnippetsTranslationMixin._translation_options.fields\
                    and SnippetsTranslationMixin._is_orig_required(fname):
                f.required = False

        self.__class__._translated = True
Example #6
0
    def setUp(self):
        content_type = Advert
        test_snippet = Advert.objects.get(id=1)

        edit_handler_class = get_snippet_edit_handler(Advert)
        form_class = edit_handler_class.get_form_class(Advert)
        form = form_class(instance=test_snippet)

        self.snippet_chooser_panel_class = SnippetChooserPanel('text', content_type)
        self.snippet_chooser_panel = self.snippet_chooser_panel_class(instance=test_snippet,
                                                                      form=form)
Example #7
0
    def setUp(self):
        content_type = Advert
        test_snippet = Advert.objects.get(id=1)

        edit_handler_class = get_snippet_edit_handler(Advert)
        form_class = edit_handler_class.get_form_class(Advert)
        form = form_class(instance=test_snippet)

        self.snippet_chooser_panel_class = SnippetChooserPanel('text', content_type)
        self.snippet_chooser_panel = self.snippet_chooser_panel_class(instance=test_snippet,
                                                                      form=form)
Example #8
0
    def setUp(self):
        model = SnippetChooserModel
        self.advert_text = "Test advert text"
        test_snippet = model.objects.create(advert=Advert.objects.create(text=self.advert_text))

        edit_handler_class = get_snippet_edit_handler(model)
        form_class = edit_handler_class.get_form_class(model)
        form = form_class(instance=test_snippet)
        edit_handler = edit_handler_class(instance=test_snippet, form=form)

        self.snippet_chooser_panel = [
            panel for panel in edit_handler.children if getattr(panel, "field_name", None) == "advert"
        ][0]
Example #9
0
    def setUp(self):
        model = SnippetChooserModel
        self.advert_text = 'Test advert text'
        test_snippet = model.objects.create(
            advert=Advert.objects.create(text=self.advert_text))

        edit_handler_class = get_snippet_edit_handler(model)
        form_class = edit_handler_class.get_form_class(model)
        form = form_class(instance=test_snippet)
        edit_handler = edit_handler_class(instance=test_snippet, form=form)

        self.snippet_chooser_panel = [
            panel for panel in edit_handler.children
            if getattr(panel, 'field_name', None) == 'advert'][0]
Example #10
0
    def setUp(self):
        content_type = get_content_type_from_url_params("tests", "advert")

        test_snippet = Advert()
        test_snippet.text = "test_advert"
        test_snippet.url = "http://www.example.com/"
        test_snippet.save()

        edit_handler_class = get_snippet_edit_handler(Advert)
        form_class = edit_handler_class.get_form_class(Advert)
        form = form_class(instance=test_snippet)

        self.snippet_chooser_panel_class = SnippetChooserPanel("text", content_type)
        self.snippet_chooser_panel = self.snippet_chooser_panel_class(instance=test_snippet, form=form)
Example #11
0
    def setUp(self):
        content_type = get_content_type_from_url_params('tests', 'advert')

        test_snippet = Advert()
        test_snippet.text = 'test_advert'
        test_snippet.url = 'http://www.example.com/'
        test_snippet.save()

        edit_handler_class = get_snippet_edit_handler(Advert)
        form_class = edit_handler_class.get_form_class(Advert)
        form = form_class(instance=test_snippet)

        self.snippet_chooser_panel_class = SnippetChooserPanel(
            'text', content_type)
        self.snippet_chooser_panel = self.snippet_chooser_panel_class(
            instance=test_snippet, form=form)
    def test_snippet_form(self):
        """
        In this test we use the InlinePanelSnippet model because it has all the possible "patchable" fields
        so if the created form has all fields the the form was correctly patched
        """
        from wagtail.wagtailsnippets.views.snippets import get_snippet_edit_handler
        snippet_edit_handler = get_snippet_edit_handler(models.InlinePanelSnippet)

        form = snippet_edit_handler.get_form_class(models.InlinePanelSnippet)

        inline_model_fields = ['field_name_de', 'field_name_en', 'image_chooser_de', 'image_chooser_en',
                               'fieldrow_name_de', 'fieldrow_name_en', 'name_de', 'name_en', 'image_de', 'image_en',
                               'other_name_de', 'other_name_en']

        related_formset_form = form.formsets['related_snippet_model'].form

        try:
            # python 3
            self.assertCountEqual(inline_model_fields, related_formset_form.base_fields.keys())
        except AttributeError:
            # python 2.7
            self.assertItemsEqual(inline_model_fields, related_formset_form.base_fields.keys())
Example #13
0
 def test_fancy_edit_handler(self):
     edit_handler_class = get_snippet_edit_handler(FancySnippet)
     form_class = edit_handler_class.get_form_class(FancySnippet)
     self.assertTrue(issubclass(form_class, WagtailAdminModelForm))
     self.assertTrue(issubclass(form_class, FancySnippetForm))
Example #14
0
    def __init__(self, model):

        # Check if this class was already patched
        if model in WagtailTranslator._patched_models:
            return

        WagtailTranslator._base_model = model
        WagtailTranslator._required_fields = {}

        # CONSTRUCT TEMPORARY EDIT HANDLER
        if issubclass(model, Page):
            if hasattr(model, 'get_edit_handler'):
                edit_handler_class = model.get_edit_handler()
            else:
                edit_handler_class = get_page_edit_handler(model)
        else:
            edit_handler_class = get_snippet_edit_handler(model)
        WagtailTranslator._base_model_form = edit_handler_class.get_form_class(
            model)

        defined_tabs = WagtailTranslator._fetch_defined_tabs(model)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = WagtailTranslator._patch_panel(model, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(model, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if issubclass(model, Page):
            if hasattr(model, 'get_edit_handler'):
                model.get_edit_handler.cache_clear()
                edit_handler_class = model.get_edit_handler()
            else:
                if model in PAGE_EDIT_HANDLERS:
                    del PAGE_EDIT_HANDLERS[model]
                edit_handler_class = get_page_edit_handler(model)
        else:
            if model in SNIPPET_EDIT_HANDLERS:
                del SNIPPET_EDIT_HANDLERS[model]
            edit_handler_class = get_snippet_edit_handler(model)

        # Set the required of the translated fields that were required on the original field
        form = edit_handler_class.get_form_class(model)
        for fname, f in form.base_fields.items():
            if fname in WagtailTranslator._required_fields[model]:
                f.required = True

        # Do the same to the formsets
        for related_name, formset in form.formsets.iteritems():
            if (formset.model in WagtailTranslator._required_fields
                    and WagtailTranslator._required_fields[formset.model]):
                for fname, f in formset.form.base_fields.items():
                    if fname in WagtailTranslator._required_fields[
                            formset.model]:
                        f.required = True

        # Overide page methods
        if issubclass(model, Page):
            model.move = _new_move
            model.set_url_path = _new_set_url_path
            model.route = _new_route
            model.get_site_root_paths = _new_get_site_root_paths
            model.relative_url = _new_relative_url
            model.url = _new_url
            _patch_clean(model)
            _patch_elasticsearch_fields(model)

        WagtailTranslator._patched_models.append(model)
Example #15
0
 def test_fancy_edit_handler(self):
     edit_handler_class = get_snippet_edit_handler(FancySnippet)
     form_class = edit_handler_class.get_form_class(FancySnippet)
     self.assertTrue(issubclass(form_class, WagtailAdminModelForm))
     self.assertTrue(issubclass(form_class, FancySnippetForm))
    def __init__(self, model):

        # Check if this class was already patched
        if model in WagtailTranslator._patched_models:
            return

        WagtailTranslator._base_model = model
        WagtailTranslator._required_fields = {}

        # CONSTRUCT TEMPORARY EDIT HANDLER
        if issubclass(model, Page):
            if hasattr(model, 'get_edit_handler'):
                edit_handler_class = model.get_edit_handler()
            else:
                edit_handler_class = get_page_edit_handler(model)
        else:
            edit_handler_class = get_snippet_edit_handler(model)
        WagtailTranslator._base_model_form = edit_handler_class.get_form_class(model)

        defined_tabs = WagtailTranslator._fetch_defined_tabs(model)

        for tab_name, tab in defined_tabs:
            patched_tab = []

            for panel in tab:
                trtab = WagtailTranslator._patch_panel(model, panel)

                if trtab:
                    for x in trtab:
                        patched_tab.append(x)

            setattr(model, tab_name, patched_tab)

        # DELETE TEMPORARY EDIT HANDLER IN ORDER TO LET WAGTAIL RECONSTRUCT
        # NEW EDIT HANDLER BASED ON NEW TRANSLATION PANELS
        if issubclass(model, Page):
            if hasattr(model, 'get_edit_handler'):
                model.get_edit_handler.cache_clear()
                edit_handler_class = model.get_edit_handler()
            else:
                if model in PAGE_EDIT_HANDLERS:
                    del PAGE_EDIT_HANDLERS[model]
                edit_handler_class = get_page_edit_handler(model)
        else:
            if model in SNIPPET_EDIT_HANDLERS:
                del SNIPPET_EDIT_HANDLERS[model]
            edit_handler_class = get_snippet_edit_handler(model)

        # Set the required of the translated fields that were required on the original field
        form = edit_handler_class.get_form_class(model)
        for fname, f in form.base_fields.items():
            if fname in WagtailTranslator._required_fields[model]:
                f.required = True

        # Do the same to the formsets
        for related_name, formset in form.formsets.items():
            if (formset.model in WagtailTranslator._required_fields and
                    WagtailTranslator._required_fields[formset.model]):
                for fname, f in formset.form.base_fields.items():
                    if fname in WagtailTranslator._required_fields[formset.model]:
                        f.required = True

        # Overide page methods
        if issubclass(model, Page):
            model.move = _new_move
            model.set_url_path = _new_set_url_path
            model.route = _new_route
            model.get_site_root_paths = _new_get_site_root_paths
            model.relative_url = _new_relative_url
            model.url = _new_url
            _patch_clean(model)
            _patch_elasticsearch_fields(model)

        WagtailTranslator._patched_models.append(model)