Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

django-polymorphic-tree

https://img.shields.io/travis/edoburu/django-polymorphic-tree/master.svg?branch=master https://img.shields.io/pypi/v/django-polymorphic-tree.svg https://img.shields.io/pypi/dm/django-polymorphic-tree.svg https://img.shields.io/badge/wheel-yes-green.svg https://img.shields.io/pypi/l/django-polymorphic-tree.svg https://img.shields.io/codecov/c/github/edoburu/django-polymorphic-tree/master.svg

This package combines django-mptt with django-polymorphic.

In other words, this module provides a node tree, where each node can be a different model type. This allows you to freely structure tree data. For example:

  • Build a tree of a root node, category nodes, leaf nodes, each with custom fields.

  • Build a todo list of projects, categories and items.

  • Build a book of chapters, sections, and pages.

Origin

This module was extracted out of django-fluent-pages because it turned out to serve a generic purpose. This was done during contract work at Leukeleu (also known for their involvement in django-fiber).

Installation

First install the module, preferably in a virtual environment:

pip install django-polymorphic-tree

Or install the current repository:

pip install -e git+https://github.com/edoburu/django-polymorphic-tree.git#egg=django-polymorphic-tree

The main dependencies are django-mptt and django-polymorphic, which will be automatically installed.

Configuration

Next, create a project which uses the application:

cd ..
django-admin.py startproject demo

Add the following to settings.py:

INSTALLED_APPS += (
    'polymorphic_tree',
    'polymorphic',
    'mptt',
)

Usage

The main feature of this module is creating a tree of custom node types. It boils down to creating a application with 2 files:

The models.py file should define the custom node type, and any fields it has:

from django.db import models
from django.utils.translation import ugettext_lazy as _
from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey


# A base model for the tree:

class BaseTreeNode(PolymorphicMPTTModel):
    parent = PolymorphicTreeForeignKey('self', blank=True, null=True, related_name='children', verbose_name=_('parent'))
    title = models.CharField(_("Title"), max_length=200)

    class Meta(PolymorphicMPTTModel.Meta):
        verbose_name = _("Tree node")
        verbose_name_plural = _("Tree nodes")


# Create 3 derived models for the tree nodes:

class CategoryNode(BaseTreeNode):
    opening_title = models.CharField(_("Opening title"), max_length=200)
    opening_image = models.ImageField(_("Opening image"), upload_to='images')

    class Meta:
        verbose_name = _("Category node")
        verbose_name_plural = _("Category nodes")


class TextNode(BaseTreeNode):
    extra_text = models.TextField()

    # Extra settings:
    can_have_children = False

    class Meta:
        verbose_name = _("Text node")
        verbose_name_plural = _("Text nodes")


class ImageNode(BaseTreeNode):
    image = models.ImageField(_("Image"), upload_to='images')

    class Meta:
        verbose_name = _("Image node")
        verbose_name_plural = _("Image nodes")

The admin.py file should define the admin, both for the child nodes and parent:

from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from polymorphic_tree.admin import PolymorphicMPTTParentModelAdmin, PolymorphicMPTTChildModelAdmin
from . import models


# The common admin functionality for all derived models:

class BaseChildAdmin(PolymorphicMPTTChildModelAdmin):
    GENERAL_FIELDSET = (None, {
        'fields': ('parent', 'title'),
    })

    base_model = models.BaseTreeNode
    base_fieldsets = (
        GENERAL_FIELDSET,
    )


# Optionally some custom admin code

class TextNodeAdmin(BaseChildAdmin):
    pass


# Create the parent admin that combines it all:

class TreeNodeParentAdmin(PolymorphicMPTTParentModelAdmin):
    base_model = models.BaseTreeNode
    child_models = (
        (models.CategoryNode, BaseChildAdmin),
        (models.TextNode, TextNodeAdmin),  # custom admin allows custom edit/delete view.
        (models.ImageNode, BaseChildAdmin),
    )

    list_display = ('title', 'actions_column',)

    class Media:
        css = {
            'all': ('admin/treenode/admin.css',)
        }


admin.site.register(models.BaseTreeNode, TreeNodeParentAdmin)

The child_models attribute defines which admin interface is loaded for the edit and delete page. The list view is still rendered by the parent admin.

Tests

To run the included test suite, execute:

./runtests.py

To test support for multiple Python and Django versions, run tox from the repository root:

pip install tox
tox

The Python versions need to be installed at your system. See pyenv (Linux) or Homebrew (Mac OS X).

Python 2.6, 2.7, and 3.3 are the currently supported versions.

Todo

  • Sphinx Documentation

Contributing

This module is designed to be generic. In case there is anything you didn’t like about it, or think it’s not flexible enough, please let us know. We’d love to improve it!

If you have any other valuable contribution, suggestion or idea, please let us know as well because we will look into it. Pull requests are welcome too. :-)

Metadata

Release files for sigmacms-polymorphic-tree 1.2.6b1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sigmacms-polymorphic-tree 1.2.6b1
File Size Uploaded Provenance Actions
sigmacms-polymorphic-tree-1.2.6b1.tar.gz 39.5 kB Without provenance Details for sigmacms-polymorphic-tree-1.2.6b1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for sigmacms-polymorphic-tree 1.2.6b1
File Interpreter ABI Platform Actions
sigmacms_polymorphic_tree-1.2.6b1-py2.py3-none-any.whl Python 2, Python 3 none any Details for sigmacms_polymorphic_tree-1.2.6b1-py2.py3-none-any.whl

Total release size: 86.5 kB

Release files / sigmacms-polymorphic-tree-1.2.6b1.tar.gz

Download URL sigmacms-polymorphic-tree-1.2.6b1.tar.gz
Size 39.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b1e6d3770b1db02ac4e761435cbfa08e82342e69e68edc55fc574c8f95bff855
BLAKE2b-256 checksum
How to use checksums
0bed9c4208b5b248d7c9e738d8cb5702f5373715ecc2093c9ddf62f6a05d898b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / sigmacms_polymorphic_tree-1.2.6b1-py2.py3-none-any.whl

Download URL sigmacms_polymorphic_tree-1.2.6b1-py2.py3-none-any.whl
Size 47.1 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
256dd2c7ffa495bf907136409fae9ca3cadf53bcfd4338afb83d0784316631ec
BLAKE2b-256 checksum
How to use checksums
07c6d9cd27816372dc7e9829a60a9371ea70c08018f5654ec5bb93394b58c175
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for sigmacms-polymorphic-tree 1.2.6b1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page