Skip to content

Commit 52ec8c6

Browse files
committed
Refactor common module, add custom components
1 parent b4975e9 commit 52ec8c6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+421
-124
lines changed

djangocms_frontend/cms_plugins.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
from cms.plugin_base import CMSPluginBase
22
from django.utils.encoding import force_str
33

4+
from djangocms_frontend.helpers import get_related_object
5+
46

57
class CMSUIPlugin(CMSPluginBase):
68
render_template = "djangocms_frontend/html_container.html"
79
change_form_template = "djangocms_frontend/admin/base.html"
810

911
def __str__(self):
1012
return force_str(super().__str__())
13+
14+
def render(self, context, instance, placeholder):
15+
for key, value in instance.config.items():
16+
if isinstance(value, dict) and set(value.keys()) == {"pk", "model"}:
17+
if not hasattr(instance, key + "_related"):
18+
setattr(instance, key + "_related", get_related_object(instance.config, key))
19+
return super().render(context, instance, placeholder)

djangocms_frontend/common/__init__.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from importlib import import_module
2+
3+
from djangocms_frontend import settings
4+
5+
from .title import TitleFormMixin, TitleMixin
6+
7+
__common = {
8+
"attributes": ("AttributesMixin",),
9+
"background": ("BackgroundFormMixin", "BackgroundMixin"),
10+
"responsive": ("ResponsiveFormMixin", "ResponsiveMixin"),
11+
"sizing": ("SizingFormMixin", "SizingMixin"),
12+
"spacing": ("SpacingFormMixin", "SpacingMixin", "MarginFormMixin", "MarginMixin", "PaddingFormMixin", "PaddingMixin"),
13+
}
14+
15+
for module, classes in __common.items():
16+
try:
17+
module = import_module(f"{__name__}.{settings.framework}.{module}", module)
18+
for cls in classes:
19+
globals()[cls] = getattr(module, cls)
20+
except ModuleNotFoundError:
21+
for cls in classes:
22+
globals()[cls] = type(cls, (object,), {})
23+
24+
__all__ = [
25+
"TitleMixin",
26+
"TitleFormMixin",
27+
"AttributesMixin",
28+
"BackgroundFormMixin",
29+
"BackgroundMixin",
30+
"ResponsiveFormMixin",
31+
"ResponsiveMixin",
32+
"SizingFormMixin",
33+
"SizingMixin",
34+
"SpacingFormMixin",
35+
"SpacingMixin",
36+
"MarginFormMixin",
37+
"MarginMixin",
38+
"PaddingFormMixin",
39+
"PaddingMixin",
40+
]

djangocms_frontend/common/background.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

djangocms_frontend/common/responsive.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

djangocms_frontend/common/sizing.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

djangocms_frontend/contrib/accordion/cms_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
6+
from ...common import AttributesMixin
77
from ...helpers import add_plugin
88
from .. import accordion
99
from . import forms, models

djangocms_frontend/contrib/alert/cms_plugins.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
7-
from ...common.responsive import ResponsiveMixin
8-
from ...common.spacing import SpacingMixin
6+
from ...common import AttributesMixin, ResponsiveMixin, SpacingMixin
97
from .. import alert
108
from . import forms, models
119

djangocms_frontend/contrib/alert/forms.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
from entangled.forms import EntangledModelForm
44

55
from djangocms_frontend import settings
6-
from djangocms_frontend.common.responsive import ResponsiveFormMixin
7-
from djangocms_frontend.common.spacing import SpacingFormMixin
6+
from djangocms_frontend.common import ResponsiveFormMixin, SpacingFormMixin
87
from djangocms_frontend.contrib import alert
98
from djangocms_frontend.fields import (
109
AttributesFormField,

djangocms_frontend/contrib/badge/cms_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
6+
from ...common import AttributesMixin
77
from .. import badge
88
from . import forms, models
99

djangocms_frontend/contrib/card/cms_plugins.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
7-
from ...common.background import BackgroundMixin
8-
from ...common.responsive import ResponsiveMixin
9-
from ...common.spacing import MarginMixin, PaddingMixin
6+
from ...common import (
7+
AttributesMixin,
8+
BackgroundMixin,
9+
MarginMixin,
10+
PaddingMixin,
11+
ResponsiveMixin,
12+
)
1013
from ...helpers import add_plugin
1114
from .. import card
1215
from . import forms, models

djangocms_frontend/contrib/card/forms.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
from djangocms_frontend.settings import COLOR_STYLE_CHOICES, DEVICE_SIZES
88

99
from ... import settings
10-
from ...common.background import BackgroundFormMixin
11-
from ...common.responsive import ResponsiveFormMixin
12-
from ...common.spacing import MarginFormMixin, PaddingFormMixin
10+
from ...common import (
11+
BackgroundFormMixin,
12+
MarginFormMixin,
13+
PaddingFormMixin,
14+
ResponsiveFormMixin,
15+
)
1316
from ...fields import (
1417
AttributesFormField,
1518
ButtonGroup,

djangocms_frontend/contrib/carousel/cms_plugins.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55

66
from ... import settings
77
from ...cms_plugins import CMSUIPlugin
8-
from ...common.attributes import AttributesMixin
9-
from ...common.background import BackgroundMixin
8+
from ...common import AttributesMixin, BackgroundMixin
109
from .. import carousel
1110
from ..link.cms_plugins import LinkPluginMixin
1211
from . import forms, models

djangocms_frontend/contrib/carousel/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
)
1414

1515
from ... import settings
16-
from ...common.background import BackgroundFormMixin
16+
from ...common import BackgroundFormMixin
1717
from ...fields import HTMLFormField
1818
from ...helpers import first_choice
1919
from ...models import FrontendUIItem

djangocms_frontend/contrib/collapse/cms_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
6+
from ...common import AttributesMixin
77
from .. import collapse
88
from . import forms, models
99

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from cms.plugin_pool import plugin_pool
2+
3+
from .models import components
4+
5+
for _, plugin in components._registry.values():
6+
globals()[plugin.__name__] = plugin
7+
plugin_pool.register_plugin(plugin)
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import importlib
2+
3+
from django import forms
4+
from django.utils.module_loading import autodiscover_modules
5+
from django.utils.translation import gettext_lazy as _
6+
from entangled.forms import EntangledModelForm
7+
8+
from djangocms_frontend.cms_plugins import CMSUIPlugin
9+
from djangocms_frontend.models import FrontendUIItem
10+
11+
12+
def _get_mixin_classes(mixins: list, suffix: str = "") -> list[type]:
13+
"""Find and import mixin classes from a list of mixin strings"""
14+
mixins = [
15+
(mixin.rsplit(".")[0], f"{mixin.rsplit['.'][-1]}{suffix}Mixin")
16+
if "." in mixin
17+
else ("djangocms_frontend.common", f"{mixin}{suffix}Mixin")
18+
for mixin in mixins
19+
]
20+
return [importlib.import_module(module).__dict__[name] for module, name in mixins]
21+
22+
23+
class CMSFrontendComponent(forms.Form):
24+
"""Base class for frontend components:"""
25+
@classmethod
26+
def admin_form_factory(cls, **kwargs) -> type:
27+
mixins = getattr(cls._component_meta, "mixins", [])
28+
mixins = _get_mixin_classes(mixins, "Form")
29+
return type(
30+
f"{cls.__name__}Form",
31+
(
32+
*mixins,
33+
EntangledModelForm,
34+
cls,
35+
),
36+
{
37+
**kwargs,
38+
"Meta": type(
39+
"Meta",
40+
(),
41+
{
42+
"model": FrontendUIItem,
43+
"entangled_fields": {
44+
"config": list(cls.declared_fields.keys()),
45+
},
46+
},
47+
),
48+
},
49+
)
50+
51+
@classmethod
52+
def plugin_model_factory(cls) -> type:
53+
model_class = type(
54+
cls.__name__,
55+
(FrontendUIItem,),
56+
{
57+
"Meta": type(
58+
"Meta",
59+
(),
60+
{
61+
"proxy": True,
62+
"managed": False,
63+
"verbose_name": getattr(cls._component_meta, "name", cls.__name__),
64+
},
65+
),
66+
"get_short_description": cls.get_short_description,
67+
"__module__": "djangocms_frontend.contrib.component.models",
68+
},
69+
)
70+
return model_class
71+
72+
@classmethod
73+
def plugin_factory(cls) -> type:
74+
mixins = getattr(cls._component_meta, "mixins", [])
75+
mixins = _get_mixin_classes(mixins)
76+
77+
return type(
78+
cls.__name__ + "Plugin",
79+
(
80+
*mixins,
81+
CMSUIPlugin,
82+
),
83+
{
84+
"name": getattr(cls._component_meta, "name", cls.__name__),
85+
"module": getattr(cls._component_meta, "module", _("Component")),
86+
"model": cls.plugin_model_factory(),
87+
"form": cls.admin_form_factory(),
88+
"allow_children": getattr(cls._component_meta, "allow_children", False),
89+
"child_classes": getattr(cls._component_meta, "child_classes", []),
90+
"render_template": getattr(cls._component_meta, "render_template", CMSUIPlugin.render_template),
91+
"fieldsets": getattr(cls, "fieldsets", cls._generate_fieldset()),
92+
"change_form_template": "djangocms_frontend/admin/base.html",
93+
},
94+
)
95+
96+
@classmethod
97+
@property
98+
def _component_meta(cls) -> type | None:
99+
if hasattr(cls, "Meta"):
100+
return cls.Meta
101+
return None
102+
103+
@classmethod
104+
def _generate_fieldset(cls):
105+
return [(None, {"fields": cls.declared_fields.keys()})]
106+
107+
def get_short_description(self) -> str:
108+
return ""
109+
110+
111+
class Components:
112+
_registry: dict = {}
113+
_discovered: bool = False
114+
115+
def register(self, component):
116+
self._registry[component.__name__] = (component.plugin_model_factory(), component.plugin_factory())
117+
return component
118+
119+
120+
components = Components()
121+
if not components._discovered:
122+
autodiscover_modules("cms_components", register_to=components)
123+
components._discovered = True
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from djangocms_frontend.contrib.component.components import components
2+
3+
# Register all component models for Django
4+
# Component models are unmanaged and do not create migrations
5+
6+
for model, _ in components._registry.values():
7+
globals()[model.__name__] = model

djangocms_frontend/contrib/content/cms_plugins.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33

44
from ... import settings
55
from ...cms_plugins import CMSUIPlugin
6-
from ...common.attributes import AttributesMixin
7-
from ...common.background import BackgroundMixin
8-
from ...common.responsive import ResponsiveMixin
9-
from ...common.spacing import SpacingMixin
6+
from ...common import AttributesMixin, BackgroundMixin, ResponsiveMixin, SpacingMixin
107
from .. import content
118
from . import forms, models
129

djangocms_frontend/contrib/content/forms.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
from djangocms_frontend.settings import ALIGN_CHOICES
77

88
from ... import settings
9-
from ...common.background import BackgroundFormMixin
10-
from ...common.responsive import ResponsiveFormMixin
11-
from ...common.spacing import SpacingFormMixin
9+
from ...common import BackgroundFormMixin, ResponsiveFormMixin, SpacingFormMixin
1210
from ...fields import AttributesFormField, HTMLFormField, IconGroup, TagTypeFormField
1311
from ...helpers import first_choice
1412
from ...models import FrontendUIItem

djangocms_frontend/contrib/grid/cms_plugins.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
from django.utils.translation import gettext_lazy as _
33

44
from djangocms_frontend import settings
5-
from djangocms_frontend.common.attributes import AttributesMixin
6-
from djangocms_frontend.common.background import BackgroundMixin
7-
from djangocms_frontend.common.responsive import ResponsiveMixin
8-
from djangocms_frontend.common.sizing import SizingMixin
9-
from djangocms_frontend.common.spacing import SpacingMixin
5+
from djangocms_frontend.common import (
6+
AttributesMixin,
7+
BackgroundMixin,
8+
ResponsiveMixin,
9+
SizingMixin,
10+
SpacingMixin,
11+
)
1012

1113
from ...cms_plugins import CMSUIPlugin
12-
from ...common.title import TitleMixin
14+
from ...common import TitleMixin
1315
from ...helpers import add_plugin
1416
from .. import grid
1517
from . import forms, models

0 commit comments

Comments
 (0)