Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

ファイラーでいきつまる

DojoWidgetのTreeを使ってファイラーを作ろうとしたが挫折・・・。
とりあえず自分のprojectホームを取るソース。
view.py

from django.utils.httpwrappers import HttpResponse
from django.core.extensions import render_to_response
from xml.dom.minidom import *
import os
import sys
import StringIO

def make_tree(request):

    def tree( parentE, dir ):
        parent = Element( "div" )
        parent.setAttribute( 'dojoType', 'TreeNode' )
        parent.setAttribute( 'title', os.path.basename( dir ) )
        parent.setAttribute( 'isFolder', 'true' )
        parent.setAttribute( 'path', dir )

        l = os.listdir( dir )
        for f in l:
            if os.path.isdir( os.path.join( dir, f ) ):
                tree( parent, os.path.join( dir, f ) )
            else:
                e = Element( "div" )
                e.setAttribute( 'dojoType', 'TreeNode' )
                e.setAttribute( 'title', f )
                e.setAttribute( 'isFolder', 'false' )
                e.setAttribute( 'path', os.path.join( dir, f ) )
                t = Text()
                t.data = " "
                e.appendChild(t)
                parent.appendChild( e )
        parentE.appendChild( parent )
    
    setting = os.environ['DJANGO_SETTINGS_MODULE'];
    me = sys.modules[setting]
   
    dir = os.path.dirname(me.__file__)
    e = Element( "div" )
    e.setAttribute( 'dojoType', 'Tree' )
    e.setAttribute( 'title', 'root' )
    e.setAttribute( 'toggle', 'fade' )
    e.setAttribute( 'widgetId', 'firstTree' )
    tree( e, dir )
    i = StringIO.StringIO()
    e.writexml( i, '\t', '\t', '\n' )
    tree = i.getvalue()
    return render_to_response('edit/tree', {'tree': tree}) 

へたれなのでwalk使ってません。
widgetの仕様に合わせてXML(?)を作成してます。

HTMLおよびjavascriptはこんな感じ。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Dojo Tree Widget Test</title>

<script type="text/javascript">
  //var djConfig = {isDebug: true};
  var djConfig = {isDebug: true, debugAtAllCosts: true };
</script>
<script type="text/javascript" src="/src/js/dojo.js"></script>
<script type="text/javascript">
  dojo.require("dojo.lang.*");
  dojo.require("dojo.io.*");
  dojo.require("dojo.json");
  dojo.require("dojo.widget.*");
  dojo.require("dojo.widget.Tree");
  dojo.hostenv.writeIncludes();

  
</script>
</head>
<body>

<h2>TreeRenderTest</h2>
{{ tree }}
</body>
</html>

すんごい簡単。
単なるTreeなのでこんなんで表示できます。
すごい簡単な理由は以下。

Ajaxではないから。

Ajaxにすると取得データを元にwidgetを再表示するわけだがその方法がわからん・・・。
(おおよそはわかっているけど。xmlをparseしてcreateComponentだと思う・・・。)
問題

  • iconなどのソースもDjangoのviewが知っていないといけない(divタグを作ってるのがviewなため)
  • まじめにフィルタしないとファイルが多すぎて表示できない(特にsvnのファイル)
  • 多すぎると重い(firefoxから怒られます)

うーん、フィルタを追加してEditTreeに変更すべきか。
expandイベント拾ってAjaxするのがいいんだろうなあ。
TreeControllerとかマジメに見ないといけないんだろうけど相変わらずDocがないし辛い。
また暇を見つけて考える。
助け舟出してくれる人募集です。
うくく。