Skip to content

Instantly share code, notes, and snippets.

@niccolomineo
Last active August 19, 2024 09:12
Show Gist options
  • Save niccolomineo/172e71c6aef6946e705cbe6a6551793e to your computer and use it in GitHub Desktop.
Save niccolomineo/172e71c6aef6946e705cbe6a6551793e to your computer and use it in GitHub Desktop.
Automatically register multiple Wagtail tag models
"""Wagtail models."""
from django.db.models import CASCADE, Model
from modelcluster.contrib.taggit import ClusterTaggableManager
from taggit.models import TaggedItemBase
from wagtail.models import Page, ParentalKey
TAG_FIELDS = [
("Tag Category 1", "tag_category_1"),
("Tag Category 2", "tag_category_2"),
("Tag Category 3", "tag_category_3"),
]
def register_tag_fields(cls: Model):
"""Register tag fields for model."""
def _model_wrapper(cls: Model):
"""Model wrapper."""
for verbose_name, field in dict(TAG_FIELDS).items():
meta_model_fields = {"app_label": cls._meta.app_label}
meta_model = type("Meta", (), meta_model_fields)
tag_model_related_name = (
f"tagged_{cls._meta.model_name.lower()}_{field}_items"
)
tag_model_fields = {
"Meta": meta_model,
"__module__": cls.__module__,
"content_object": ParentalKey(
f"{cls._meta.app_label}.{cls._meta.model_name}",
on_delete=CASCADE,
related_name=tag_model_related_name,
),
}
tag_model_suffix = "".join(word.capitalize() or "_" for word in f"{field}Tag".split("_"))
tag_model_name = f"{cls._meta.object_name}{tag_model_suffix}"
tag_model = type(tag_model_name, (TaggedItemBase,), tag_model_fields)
instance_related_name = f"related_{cls._meta.model_name.lower()}_{field}"
instance = ClusterTaggableManager(
through=tag_model,
blank=True,
verbose_name=verbose_name,
related_name=instance_related_name,
)
instance.contribute_to_class(cls, field)
return cls
return _model_wrapper(cls)
@register_tag_fields
class CustomPage(Page):
"""Custom page."""
promote_panels = Page.promote_panels + [
FieldPanel("tag_category_1"),
FieldPanel("tag_category_2"),
FieldPanel("tag_category_3"),
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment