class UndeletableRawTextWidget(RawTextWidget): deletable = False class Meta: proxy = True class UnnestableWidget(Bucket): @classmethod def valid_child_of(cls, parent, obj=None): for p in list(parent.get_ancestors()) + [parent]: if isinstance(p, UnnestableWidget): return False return super(UnnestableWidget, cls).valid_child_of(parent, obj) registry.register(Layout) registry.register(Bucket) registry.register(RawTextWidget) registry.register(CantGoAnywhereWidget) registry.register(PickyBucket) registry.register(ImmovableBucket) registry.register(AnotherLayout) registry.register(VowelBucket) registry.register(UnnestableWidget) class HasAWidgy(models.Model): widgy = WidgyField( null=True, blank=True, root_choices=[Layout],
from widgy import registry from widgy.db.fields import WidgyField from widgy.contrib.page_builder.models import Layout, MainContent, Accordion class TwoContentLayout(Layout): default_children = [ ('main1', MainContent, (), {}), ('main2', MainContent, (), {}), ] class Meta: verbose_name = 'Two Content Layout' registry.register(TwoContentLayout) class DemoAccordion(Accordion): class Meta: proxy = True verbose_name = 'Accordion' def valid_parent_of(self, cls, obj=None): if obj and obj in self.get_children(): return True else: sup = super(DemoAccordion, self).valid_parent_of(cls) if isinstance(self.get_root(), TwoContentLayout): return sup and len(self.get_children()) < 2 else: