django-mptt: Tree モデルを エクスポート

  • mptt_tags テンプレートライブラリ の recursetree / endrecursetree タグを使う

profiles/templates/profile/workgroup/tree.json:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{% load mptt_tags %}
[
{% recursetree nodes %}
{
    "id": "{{ node.id }}",   
    "code": "{{ node.code|default:''}}",
    "name": "{{ node.name }}",   
    "path": "{{ node.path }}",
    "full_name": "{{ node.full_name }}",
    "data": {},   
    "children": [{{ children }}]
}{% if node.get_next_sibling %},{% endif %}
{% endrecursetree %}
]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from django.template import engines, loader
from django.utils.safestring import mark_safe
from django.db.models import QuerySet


def render(src, request=None, engine_name="django", safe=True, **ctx):
    text = engines[engine_name].from_string(src).render(ctx, request=request)
    return safe and mark_safe(text) or text


def render_by(name, request=None, safe=True, **ctx):
    t = loader.get_template(name)
    text = t.render(ctx, request=request)
    return safe and mark_safe(text) or text


def export_trees(nodes, model_class=None, template_name=None, request=None, safe=True, **ctx):
    if not model_class and isinstance(nodes, QuerySet):
        model_class = nodes.model

    if not template_name and model_class:
        template_name = f"{model_class._meta.app_label}/{model_class._meta.model_name}/tree.json"

    if not template_name:
        return ""

    return render_by(template_name, request=request, safe=safe, nodes=nodes, **ctx)
1
2
3
4
5
6
7
8
@main.command()
@click.argument("path")
@click.pass_context
def workgroup_export(ctx, path):
    """ Workgroup Export """

    nodes = models.Workgroup.objects.all()
    print(export_trees(nodes))