def test_queryset_filter_for_distinct_groupers(self): poll1_archived_version = PollVersionFactory( content__poll=self.initial_version.content.poll, state=ARCHIVED) poll1_published_version = PollVersionFactory( content__poll=self.initial_version.content.poll, state=PUBLISHED) poll2_version = PollVersionFactory() PollVersionFactory(content__poll=poll2_version.content.poll, state=ARCHIVED) poll2_archived_version = PollVersionFactory( content__poll=poll2_version.content.poll, state=ARCHIVED) versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) qs_published_filter = {"versions__state__in": [PUBLISHED]} # Should be one published version self.assertQuerysetEqual( versionable.distinct_groupers(**qs_published_filter), [poll1_published_version.pk], transform=lambda x: x.pk, ordered=False, ) qs_archive_filter = {"versions__state__in": [ARCHIVED]} # Should be two archived versions self.assertQuerysetEqual( versionable.distinct_groupers(**qs_archive_filter), [poll1_archived_version.pk, poll2_archived_version.pk], transform=lambda x: x.pk, ordered=False, )
def test_raises_exception_if_content_class_already_registered_in_different_config( self): """Tests ImproperlyConfigured exception is raised if the same content class is registered twice in different config files """ extension = VersioningCMSExtension() poll_versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) poll_versionable2 = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) cms_config1 = Mock(spec=[], djangocms_versioning_enabled=True, versioning=[poll_versionable]) cms_config2 = Mock(spec=[], djangocms_versioning_enabled=True, versioning=[poll_versionable2]) with self.assertRaises(ImproperlyConfigured): extension.handle_versioning_setting(cms_config1) extension.handle_versioning_setting(cms_config2)
class BlogpostCMSConfig(CMSAppConfig): djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=BlogContent, grouper_field_name='blogpost', copy_function=default_copy, ), VersionableItem( content_model=CommentContent, grouper_field_name='comment', copy_function=default_copy, ), ]
def test_for_grouper(self): poll1_version2 = PollVersionFactory( content__poll=self.initial_version.content.poll, ) poll2_version = PollVersionFactory() PollVersionFactory(content__poll=poll2_version.content.poll) PollVersionFactory(content__poll=poll2_version.content.poll) versionable = VersionableItem(content_model=PollContent, grouper_field_name='poll', copy_function=default_copy) self.assertQuerysetEqual( versionable.for_grouper(self.initial_version.content.poll), [self.initial_version.content.pk, poll1_version2.content.pk], transform=lambda x: x.pk, ordered=False)
class NavigationCMSAppConfig(CMSAppConfig): djangocms_navigation_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_CMS_MODELS_ENABLED", True) djangocms_versioning_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_VERSIONING_ENABLED", True) djangocms_moderation_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_MODERATION_ENABLED", True) navigation_models = { # model_class : field(s) to search in menu item form UI Page: ["title"] } if djangocms_versioning_enabled: from djangocms_versioning.datastructures import VersionableItem versioning = [ VersionableItem( content_model=MenuContent, grouper_field_name="menu", copy_function=copy_menu_content, preview_url=MenuContent.get_preview_url, on_publish=on_menu_content_publish, on_unpublish=on_menu_content_unpublish, on_draft_create=on_menu_content_draft_create, on_archive=on_menu_content_archive, ) ] moderated_models = [MenuContent]
def test_versionables_list_created(self): """Test handle_versioning_setting method adds all the models into the versionables list """ extension = VersioningCMSExtension() poll_versionable = VersionableItem(content_model=PollContent, grouper_field_name='poll', copy_function=default_copy) blog_versionable = VersionableItem(content_model=BlogContent, grouper_field_name='blogpost', copy_function=default_copy) cms_config = Mock(spec=[], djangocms_versioning_enabled=True, versioning=[poll_versionable, blog_versionable]) extension.handle_versioning_setting(cms_config) self.assertListEqual(extension.versionables, [poll_versionable, blog_versionable])
def test_grouper_model(self): versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) self.assertEqual(versionable.grouper_model, Poll)
class CMSApp1Config(CMSAppConfig): djangocms_moderation_enabled = True djangocms_versioning_enabled = True moderated_models = (App1PostContent, App1TitleContent) versioning = [ VersionableItem( content_model=App1PostContent, grouper_field_name="post", copy_function=lambda x: x, ), VersionableItem( content_model=App1TitleContent, grouper_field_name="title", copy_function=lambda x: x, ), ]
def _create_versionables_mock(self, copy_function): """Helper function for mocking the versionables_by_content property so that a different copy_function can be specified on the polls app. """ versionable = VersionableItem(content_model=PollContent, grouper_field_name='poll', copy_function=copy_function) return {PollContent: versionable}
class PollsCMSConfig(CMSAppConfig): djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=PollContent, grouper_field_name='poll', copy_function=default_copy, ), ]
def test_raises_exception_if_content_model_does_not_have_url_method(self): """Tests ImproperlyConfigured exception is raised if a content model does not have get_absolute_url implemented """ # NOTE: Answer doesn't have get_absolute_url so this should # throw an exception with self.assertRaises(ImproperlyConfigured): answer_versionable = VersionableItem( content_model=Answer, grouper_field_name='poll_content', copy_function=default_copy)
def test_version_model_proxy(self): versionable = VersionableItem(content_model=PersonContent, grouper_field_name='person', copy_function=default_copy) version_model_proxy = versionable.version_model_proxy self.assertIn(Version, version_model_proxy.mro()) self.assertEqual(version_model_proxy.__name__, 'PersonContentVersion') self.assertEqual(version_model_proxy._source_model, PersonContent) self.assertTrue(version_model_proxy._meta.proxy)
def test_is_content_model_versioned(self): """Test that is_content_model_versioned returns True for content model that's versioned """ extension = VersioningCMSExtension() extension.versionables = [VersionableItem( content_model=PollContent, grouper_field_name='poll', copy_function=default_copy )] self.assertTrue(extension.is_content_model_versioned(PollContent))
def test_distinct_groupers(self): latest_poll1_version = PollVersionFactory( content__poll=self.initial_version.content.poll) poll2_version = PollVersionFactory() PollVersionFactory(content__poll=poll2_version.content.poll) latest_poll2_version = PollVersionFactory( content__poll=poll2_version.content.poll) versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) self.assertQuerysetEqual( versionable.distinct_groupers(), [latest_poll1_version.pk, latest_poll2_version.pk], transform=lambda x: x.pk, ordered=False, )
def test_version_model_proxy_cached(self): """Test that version_model_proxy property is cached and return value is created once.""" versionable = VersionableItem( content_model=PersonContent, grouper_field_name="person", copy_function=default_copy, ) self.assertEqual(id(versionable.version_model_proxy), id(versionable.version_model_proxy))
def test_content_model_is_sideframe_editable_for_sideframe_enabled_model( self): """ A content model without placeholders should be opened in the sideframe """ versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) self.assertEqual(versionable.content_model_is_sideframe_editable, True)
class VersionedNoneModeratedAppConfig(CMSAppConfig): djangocms_moderation_enabled = False djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=NoneModeratedPollContent, grouper_field_name="poll", extra_grouping_fields=["language"], version_list_filter_lookups={"language": get_language_tuple}, copy_function=default_copy, ) ]
class PollsCMSConfig(CMSAppConfig): djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=PollContent, grouper_field_name='poll', extra_grouping_fields=['language'], version_list_filter_lookups={ 'language': get_language_tuple, }, copy_function=default_copy, ), ]
def test_raises_exception_if_versioning_not_iterable(self): """Tests ImproperlyConfigured exception is raised if versioning setting is not an iterable """ extensions = VersioningCMSExtension() cms_config = Mock(spec=[], djangocms_versioning_enabled=True, versioning=VersionableItem( content_model=PollContent, grouper_field_name='poll', copy_function=default_copy)) with self.assertRaises(ImproperlyConfigured): extensions.handle_versioning_setting(cms_config)
def test_content_model_is_sideframe_editable_for_sideframe_disabled_model( self): """ A content model with placeholders should not be opened in the sideframe """ versionable = VersionableItem( content_model=PageContent, grouper_field_name="page", copy_function=default_copy, ) self.assertEqual(versionable.content_model_is_sideframe_editable, False)
class PollsCMSConfig(CMSAppConfig): djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=PollContent, grouper_field_name="poll", extra_grouping_fields=["language"], version_list_filter_lookups={"language": get_language_tuple}, copy_function=default_copy, preview_url=PollContent.get_preview_url, ) ] versioning_add_to_confirmation_context = { "unpublish": OrderedDict([("warning", unpublish_warning)]) }
def test_handle_content_admin_classes(self): """Test handle_admin_classes replaces the admin model class with an admin model class that inherits from VersioningAdminMixin """ extensions = VersioningCMSExtension() cms_config = Mock(spec=[], djangocms_versioning_enabled=True, versioning=[ VersionableItem(content_model=PollContent, grouper_field_name='poll', copy_function=default_copy) ]) extensions.handle_admin_classes(cms_config) self.assertIn(PollContent, admin.site._registry) self.assertIn(VersioningAdminMixin, admin.site._registry[PollContent].__class__.mro())
def test_versioning_add_to_confirmation_context_is_an_optional_setting( self): extension = VersioningCMSExtension() poll_versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) cms_config = Mock(spec=[], djangocms_versioning_enabled=True, versioning=[poll_versionable]) try: extension.configure_app(cms_config) except ImproperlyConfigured: self.fail( "versioning_add_to_confirmation_context setting should be optional" )
class AliasCMSConfig(CMSAppConfig): cms_enabled = True cms_toolbar_enabled_models = [(AliasContent, render_alias_content)] moderated_models = [AliasContent] djangocms_moderation_enabled = getattr(settings, 'MODERATING_ALIAS_MODELS_ENABLED', True) djangocms_versioning_enabled = getattr(settings, 'VERSIONING_ALIAS_MODELS_ENABLED', True) if djangocms_versioning_enabled and djangocms_versioning_installed: from cms.utils.i18n import get_language_tuple from djangocms_versioning.datastructures import VersionableItem versioning = [ VersionableItem( content_model=AliasContent, grouper_field_name='alias', extra_grouping_fields=["language"], version_list_filter_lookups={"language": get_language_tuple}, copy_function=copy_alias_content, grouper_selector_option_label=lambda obj, lang: obj.get_name( lang), ), ] djangocms_references_enabled = getattr(settings, 'REFERENCES_ALIAS_MODELS_ENABLED', True) reference_fields = [ (AliasPlugin, 'alias'), ] # Internalsearch configuration if AliasContentConfig: djangocms_internalsearch_enabled = True internalsearch_config_list = [ AliasContentConfig, ]
class PollsCMSConfig(CMSAppConfig): djangocms_moderation_enabled = True # Moderation configuration moderated_models = (PollContent, ) moderation_request_changelist_actions = [ get_poll_additional_changelist_action ] moderation_request_changelist_fields = [ get_poll_additional_changelist_field ] # Versioning configuration djangocms_versioning_enabled = True versioning = [ VersionableItem( content_model=PollContent, grouper_field_name="poll", extra_grouping_fields=["language"], version_list_filter_lookups={"language": get_language_tuple}, copy_function=default_copy, ) ]
class NavigationCMSAppConfig(CMSAppConfig): djangocms_navigation_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_CMS_MODELS_ENABLED", True) djangocms_versioning_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_VERSIONING_ENABLED", True) djangocms_moderation_enabled = getattr( settings, "DJANGOCMS_NAVIGATION_MODERATION_ENABLED", True) navigation_models = { # model_class : field(s) to search in menu item form UI Page: ["title"] } djangocms_references_enabled = True reference_fields = [ (NavigationPlugin, "menu"), ] if djangocms_versioning_enabled: from djangocms_versioning.datastructures import VersionableItem cms_enabled = True cms_toolbar_enabled_models = [(MenuContent, render_navigation_content)] versioning = [ VersionableItem( content_model=MenuContent, grouper_field_name="menu", extra_grouping_fields=["language"], version_list_filter_lookups={"language": get_language_tuple}, copy_function=copy_menu_content, preview_url=MenuContent.get_preview_url, on_publish=on_menu_content_publish, on_unpublish=on_menu_content_unpublish, on_draft_create=on_menu_content_draft_create, on_archive=on_menu_content_archive, ) ] moderated_models = [MenuContent]
def test_raises_exception_if_unsupported_key_added_to_add_to_context(self): """Tests ImproperlyConfigured exception is raised if an unsupported dict key is used for the versioning_add_to_confirmation_context setting """ extension = VersioningCMSExtension() poll_versionable = VersionableItem( content_model=PollContent, grouper_field_name="poll", copy_function=default_copy, ) cms_config = Mock( spec=[], djangocms_versioning_enabled=True, versioning=[poll_versionable], # versioning doesn't know what red rabbits is # so this should raise an exception versioning_add_to_confirmation_context={ "red_rabbits": OrderedDict({ "rabbit": lambda r, v: v.content }) }, ) with self.assertRaises(ImproperlyConfigured): extension.configure_app(cms_config)