forked from ungleich-public/dynamicweb
94 lines
3.4 KiB
Python
94 lines
3.4 KiB
Python
from cms.exceptions import SubClassNeededError
|
|
|
|
from .models import PageContentExtension, PageExtension
|
|
|
|
|
|
class ExtensionPool:
|
|
def __init__(self):
|
|
self.page_extensions = set()
|
|
self.page_content_extensions = set()
|
|
|
|
def register(self, extension):
|
|
"""
|
|
Registers the given extension.
|
|
|
|
Example::
|
|
|
|
class MyExtension(PageExtension):
|
|
pass
|
|
|
|
extension_pool.register(MyExtension)
|
|
|
|
or as decorator::
|
|
|
|
@extension_pool.register
|
|
class MyExtension(PageExtension):
|
|
pass
|
|
|
|
"""
|
|
|
|
if issubclass(extension, PageExtension):
|
|
self.page_extensions.add(extension)
|
|
elif issubclass(extension, PageContentExtension):
|
|
self.page_content_extensions.add(extension)
|
|
else:
|
|
raise SubClassNeededError(
|
|
f'Extension has to subclass either {PageExtension} or {PageContentExtension}. {extension} does not!'
|
|
)
|
|
return extension
|
|
|
|
def unregister(self, extension):
|
|
"""
|
|
Unregisters the given extension. No error is thrown if given extension isn't an extension or wasn't
|
|
registered yet.
|
|
"""
|
|
|
|
try:
|
|
if issubclass(extension, PageExtension):
|
|
self.page_extensions.remove(extension)
|
|
elif issubclass(extension, PageContentExtension):
|
|
self.page_content_extensions.remove(extension)
|
|
except KeyError:
|
|
pass
|
|
|
|
def _copy_page_extensions(self, source_page, target_page, language):
|
|
for extension in self.page_extensions:
|
|
for instance in extension.objects.filter(extended_object=source_page):
|
|
instance.copy(target_page, language)
|
|
|
|
def _copy_content_extensions(self, source_page, target_page, language):
|
|
source_content = source_page.pagecontent_set(manager="admin_manager").current_content(language=language).get()
|
|
target_content = target_page.pagecontent_set(manager="admin_manager").current_content(language=language).get()
|
|
for extension in self.page_content_extensions:
|
|
for instance in extension.objects.filter(extended_object=source_content):
|
|
instance.copy(target_content, language)
|
|
|
|
def copy_extensions(self, source_page, target_page, languages=None):
|
|
if not languages:
|
|
languages = target_page.get_languages()
|
|
if self.page_extensions:
|
|
self._copy_page_extensions(source_page, target_page, None)
|
|
for language in languages:
|
|
if self.page_content_extensions:
|
|
self._copy_content_extensions(source_page, target_page, language)
|
|
|
|
def get_page_extensions(self, page=None):
|
|
extensions = []
|
|
for extension in self.page_extensions:
|
|
if page:
|
|
extensions.extend(list(extension.objects.filter(extended_object=page)))
|
|
else:
|
|
extensions.extend(list(extension.objects.all()))
|
|
return extensions
|
|
|
|
def get_page_content_extensions(self, page_content=None):
|
|
extensions = []
|
|
for extension in self.page_content_extensions:
|
|
if page_content:
|
|
extensions.extend(list(extension.objects.filter(extended_object=page_content)))
|
|
else:
|
|
extensions.extend(list(extension.objects.all()))
|
|
return extensions
|
|
|
|
|
|
extension_pool = ExtensionPool()
|