Author: fredlin
Date: Mon Jan 21 08:22:34 2008
New Revision: 4006
URL: http://trac.turbogears.org/changeset/4006

Log:
move design gadget to gadgets folder

Added:
   projects/ToolBox2/trunk/toolbox2/gadgets/
   projects/ToolBox2/trunk/toolbox2/gadgets/__init__.py
   projects/ToolBox2/trunk/toolbox2/gadgets/design/
   projects/ToolBox2/trunk/toolbox2/gadgets/design/__init__.py
   projects/ToolBox2/trunk/toolbox2/gadgets/design/design.html
   projects/ToolBox2/trunk/toolbox2/gadgets/design/design.py
   projects/ToolBox2/trunk/toolbox2/gadgets/design/master.html
   projects/ToolBox2/trunk/toolbox2/gadgets/design/statics.py
   projects/ToolBox2/trunk/toolbox2/gadgets/design/tw_resources.html
Removed:
   projects/ToolBox2/trunk/toolbox2/controllers/design.py
   projects/ToolBox2/trunk/toolbox2/templates/design.html
Modified:
   projects/ToolBox2/trunk/ToolBox2.egg-info/PKG-INFO
   projects/ToolBox2/trunk/ToolBox2.egg-info/SOURCES.txt
   projects/ToolBox2/trunk/ToolBox2.egg-info/entry_points.txt
   projects/ToolBox2/trunk/setup.cfg
   projects/ToolBox2/trunk/setup.py

Modified: projects/ToolBox2/trunk/ToolBox2.egg-info/PKG-INFO
==============================================================================
--- projects/ToolBox2/trunk/ToolBox2.egg-info/PKG-INFO  (original)
+++ projects/ToolBox2/trunk/ToolBox2.egg-info/PKG-INFO  Mon Jan 21 08:22:34 2008
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: ToolBox2
-Version: 2.0a2dev-r3976
+Version: 2.0a3dev-r3978
 Summary: TurboGears2 Toolbox
 Home-page: http://docs.turbogears.org/2.0/ToolBox
 Author: Fred Lin

Modified: projects/ToolBox2/trunk/ToolBox2.egg-info/SOURCES.txt
==============================================================================
--- projects/ToolBox2/trunk/ToolBox2.egg-info/SOURCES.txt       (original)
+++ projects/ToolBox2/trunk/ToolBox2.egg-info/SOURCES.txt       Mon Jan 21 
08:22:34 2008
@@ -17,11 +17,14 @@
 toolbox2/command.py
 toolbox2/development.ini
 toolbox2/websetup.py
+toolbox2/apps/__init__.py
+toolbox2/apps/design/__init__.py
+toolbox2/apps/design/design.py
+toolbox2/apps/design/statics.py
 toolbox2/config/__init__.py
 toolbox2/config/environment.py
 toolbox2/config/middleware.py
 toolbox2/controllers/__init__.py
-toolbox2/controllers/design.py
 toolbox2/controllers/error.py
 toolbox2/controllers/help.py
 toolbox2/controllers/root.py

Modified: projects/ToolBox2/trunk/ToolBox2.egg-info/entry_points.txt
==============================================================================
--- projects/ToolBox2/trunk/ToolBox2.egg-info/entry_points.txt  (original)
+++ projects/ToolBox2/trunk/ToolBox2.egg-info/entry_points.txt  Mon Jan 21 
08:22:34 2008
@@ -15,5 +15,5 @@
     info = toolbox2.controllers.tginfo:TurboGearsInfo
     tgapi = toolbox2.controllers.help:TurboGearsAPI
     tbapi = toolbox2.controllers.help:ToolBoxAPI
-    design = toolbox2.controllers.design:DesignMVC
+    design = toolbox2.apps.design.design:DesignMVC
     
\ No newline at end of file

Modified: projects/ToolBox2/trunk/setup.cfg
==============================================================================
--- projects/ToolBox2/trunk/setup.cfg   (original)
+++ projects/ToolBox2/trunk/setup.cfg   Mon Jan 21 08:22:34 2008
@@ -1,6 +1,6 @@
-#[egg_info]
-#tag_build = dev
-#tag_svn_revision = true
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
 
 [easy_install]
 find_links = http://www.pylonshq.com/download/

Modified: projects/ToolBox2/trunk/setup.py
==============================================================================
--- projects/ToolBox2/trunk/setup.py    (original)
+++ projects/ToolBox2/trunk/setup.py    Mon Jan 21 08:22:34 2008
@@ -7,7 +7,7 @@
 
 setup(
     name='ToolBox2',
-    version="2.0a2",
+    version="2.0a3",
     description='TurboGears2 Toolbox',
     long_description = """TurboGears 2 ToolBox is a platform to share gadgets 
which helps the development.
 
@@ -76,6 +76,6 @@
     info = toolbox2.controllers.tginfo:TurboGearsInfo
     tgapi = toolbox2.controllers.help:TurboGearsAPI
     tbapi = toolbox2.controllers.help:ToolBoxAPI
-    design = toolbox2.controllers.design:DesignMVC
+    design = toolbox2.gadgets.design.design:DesignMVC
     """,
 )

Added: projects/ToolBox2/trunk/toolbox2/gadgets/__init__.py
==============================================================================

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/__init__.py
==============================================================================

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/design.html
==============================================================================
--- (empty file)
+++ projects/ToolBox2/trunk/toolbox2/gadgets/design/design.html Mon Jan 21 
08:22:34 2008
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+                      
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";
+      xmlns:py="http://genshi.edgewall.org/";
+      xmlns:xi="http://www.w3.org/2001/XInclude";>
+
+<xi:include href="master.html" />
+
+<head>
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type" 
py:replace="''"/>
+  <title>TurboGears 2.0 Info</title>
+</head>
+
+<body>
+    <!-- Debug template -->
+    <!-- 
+    <h1>All objects from locals():<h1>
+
+    <div py:for="item in sorted(locals()['data'].keys())">
+      ${item}: ${repr(locals()['data'][item])}</div>
+    -->
+    <h1><a href="/">Toolbox</a> &#x00BB; Design</h1>
+    <div id="sidebar">
+      <ul class="links">
+        <li><a href="#models">Models</a></li>
+        <li><a href="#controllers">Controllers</a></li>
+        <li><a href="#views">Views</a></li>
+        <li><a href="#languages">Languages</a></li>
+        <li><a href="#static">Static Files</a></li>
+      </ul>
+    </div>
+    <h1>Design for project ${project}</h1>
+    <div id="getting_started">
+        <h2 id="models">Models</h2>
+        the data representation, define database tables and sets 
+        <div id="model_manager" py:for="idx,file in enumerate(model)" 
class="${idx%2 and 'odd' or 'even'}"><table cellpadding="0" cellspacing="0" 
border="0">
+                <tr><td>
+                    <span py:if="file['level']&gt;0" 
py:replace="'&nbsp;'*4*int(file['level'])">&nbsp;</span>
+                    <img src="/images/places/folder.png" width='16' 
height='16' py:if="file['isdir'] and file['level']&gt;1" alt="${idx}/" />
+                    <div py:if="file['isdir'] and file['level']&gt;1" 
py:strip="">${file['file_name']}</div>
+                    <img src="/images/mimetypes/text-html.png"  width='16' 
height='16' py:if="not file['isdir']" alt="-" />
+                    <a href="preview/${file['file_name']}" target="_blank" 
py:if="not file['isdir']">${file['file_name']}</a> 
+                </td></tr>
+            </table>
+        </div>
+    </div>
+    <div id="getting_started">
+        <h2 id="controllers">Controllers</h2>
+        the application logic, each URL path is mapped in one exposed method 
in the controller 
+        <div id="controller_manager" py:for="idx,file in 
enumerate(controllers)" class="${idx%2 and 'odd' or 'even'}"><table 
cellpadding="0" cellspacing="0" border="0">
+                <tr><td>
+                    <span py:if="file['level']&gt;0" 
py:replace="'&nbsp;'*4*int(file['level'])">&nbsp;</span>
+                    <img src="/images/places/folder.png" width='16' 
height='16' py:if="file['isdir'] and file['level']&gt;1" alt="${idx}/" />
+                    <div py:if="file['isdir'] and file['level']&gt;1" 
py:strip="">${file['file_name']}</div>
+                    <img src="/images/mimetypes/text-html.png"  width='16' 
height='16' py:if="not file['isdir']" alt="-" />
+                    <a href="preview/${file['file_name']}" target="_blank" 
py:if="not file['isdir']">${file['file_name']}</a> 
+                </td></tr>
+            </table>
+        </div>
+    </div>
+    <div id="getting_started">
+        <h2 id="views">Views</h2>
+        the presentations layer, views are also known as templates
+        <div id="template_manager" py:for="idx,file in enumerate(views)" 
class="${idx%2 and 'odd' or 'even'}"><table cellpadding="0" cellspacing="0" 
border="0">
+                <tr><td>
+                    <span py:if="file['level']&gt;0" 
py:replace="'&nbsp;'*4*int(file['level'])">&nbsp;</span>
+                    <img src="/images/places/folder.png" width='16' 
height='16' py:if="file['isdir'] and file['level']&gt;1" alt="${idx}/" />
+                    <div py:if="file['isdir'] and file['level']&gt;1" 
py:strip="">${file['file_name']}</div>
+                    <img src="/images/mimetypes/text-html.png"  width='16' 
height='16' py:if="not file['isdir']" alt="-" />
+                    <a href="preview/${file['file_name']}" target="_blank" 
py:if="not file['isdir']">${file['file_name']}</a> 
+                </td></tr>
+            </table>
+        </div>
+    </div>
+    <div id="getting_started">
+        <h2 id="languages">Languages</h2>
+        translation strings for the application 
+    </div>
+    <div id="getting_started">
+        <h2 id="static">Static Files</h2>
+        these files are served without processing, your images go here 
+        <div id="static_manager" py:for="idx,file in enumerate(statics)" 
class="${idx%2 and 'odd' or 'even'}"><table cellpadding="0" cellspacing="0" 
border="0">
+                <tr><td>
+                    <span py:if="file['level']&gt;0" 
py:replace="'&nbsp;'*4*int(file['level'])">&nbsp;</span>
+                    <img src="/images/places/folder.png" width='16' 
height='16' py:if="file['isdir'] and file['level']&gt;1" alt="${idx}/" />
+                    <div py:if="file['isdir'] and file['level']&gt;1" 
py:strip="">${file['file_name']}</div>
+                    <img src="/images/mimetypes/text-html.png"  width='16' 
height='16' py:if="not file['isdir']" alt="-" />
+                    <a href="preview/${file['file_name']}" target="_blank" 
py:if="not file['isdir']">${file['file_name']}</a> 
+                </td></tr>
+            </table>
+         </div>
+        <form action="statics/receive" enctype="multipart/form-data" 
method="post">
        <h2>Upload Static File</h2>
        File: <input name="myfile" type="file" />
        <input type="submit" />
        </form>
+    </div>
+</body>
+</html>

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/design.py
==============================================================================
--- (empty file)
+++ projects/ToolBox2/trunk/toolbox2/gadgets/design/design.py   Mon Jan 21 
08:22:34 2008
@@ -0,0 +1,119 @@
+"""TurboGears 2 MVC Designer gadget"""
+from toolbox2.lib.base import Controller
+from tg import expose, validate
+from tg.util import get_project_name, get_package_name
+import os
+from operator import isSequenceType
+from statics import statics
+
+def flatten_sequence(seq):
+    """Flatten sequence."""
+    for item in seq:
+        if isSequenceType(item) and not isinstance(item, basestring):
+            for item in flatten_sequence(item):
+                yield item
+        else:
+            yield item
+
+
+class DesignMVC(Controller):
+    """Project MVC Browser"""
+    __label__ ="Project Browser"
+    __version__ = "0.3"
+    __author__ = "Fred Lin"
+    __email__ = "[EMAIL PROTECTED]"
+    __copyright__ = "Copyright 2008 Fred Lin"
+    __license__ = "MIT"
+    __group__ = "Design"
+    __icon__ = "actions/document-open.png"
+    need_project = True
+    
+    statics = statics()
+    
+    @expose('toolbox2.apps.design.design')
+    def index(self):
+        project = get_project_name()
+        project_files = self.project_files()
+        model = self.folder_filter(project_files, 'model')
+        controllers = self.folder_filter(project_files, 'controllers') 
+        views = self.folder_filter(project_files, 'templates')
+        statics = self.folder_filter(project_files, 'public') 
+        return dict(project=project, model=model,
+                    controllers=controllers, views=views,
+                    statics = statics)
+
+    @expose()
+    def preview(self, source, **kw):
+        return "not implement yet"
+
+    def folder_filter(self, files, include=None):
+        """filter single folder and its contain files"""
+        start = None
+        end = None
+        if include:
+            for idx, f in enumerate(files):
+                if f['level']==1 and f['isdir']==True and 
f['file_name']==include:
+                   start = idx
+                   continue
+                if start and f['level']==1 and f['isdir']==True and (idx > 
start):
+                    end =  idx
+                    break
+            if start:
+                if end:
+                    return files[start:end]
+                else:
+                    return files[start:]
+            else:
+                return files
+        else:
+            return files
+
+    def project_files(self):
+        """Walk through the directory, return the template name, path"""
+        p = get_package_name()
+        base_level = len([x for x in p.split(os.sep) if x])
+        fl,dct,visibility = [],{},{}
+    
+        def collect_files(file_list, dirpath, namelist):
+            level = len([x for x in dirpath.split(os.sep) if x]) - base_level
+            slot0 = {  # directory info
+                    'dir':os.path.dirname(dirpath),
+                    'file_name':os.path.basename(dirpath),
+                    'path':dirpath,
+                    'isdir':True,
+                    'level':level
+                    }
+            slot1 = [] # children directories info
+            slot2 = [] # children files info
+            slots = (slot0, slot1, slot2)
+            dct[dirpath] = slots
+            if level:
+                dct[os.path.dirname(dirpath)][1].append(slots)
+            else:
+                file_list.append(slots)
+            namelist.sort()
+            for name in namelist[:]:
+                if name.startswith('.'): #or name in ['public']
+                    namelist.remove(name)
+                    continue
+                p = os.path.join(dirpath, name)
+                if os.path.isfile(p) and os.path.splitext(name)[-1] in ['.py', 
'.kid',
+                    '.tmpl','.html', '.po', '.js', '.css', '.png', '.jpg', 
'.gif']:
+                    slot2.append({
+                                'dir':dirpath,
+                                'file_name':name,
+                                'path':p,
+                                'isdir':os.path.isdir(p),
+                                'level':level+1
+                                })
+            # decide if current directory (and ancestors) should be visible
+            visibility[dirpath] = bool(slot2)
+            if slot2:
+                while not visibility.get(os.path.dirname(dirpath), True):
+                    dirpath = os.path.dirname(dirpath)
+                    visibility[dirpath] = True
+            
+        os.path.walk(p, collect_files, fl)
+        return [x for x in flatten_sequence(fl)
+                if not x["isdir"] or visibility[x["path"]]]
+              
\ No newline at end of file

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/master.html
==============================================================================
--- (empty file)
+++ projects/ToolBox2/trunk/toolbox2/gadgets/design/master.html Mon Jan 21 
08:22:34 2008
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+                      
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";
+      xmlns:py="http://genshi.edgewall.org/";
+      xmlns:xi="http://www.w3.org/2001/XInclude";
+      py:strip="">
+<?python
+import tg
+tg_flash = tg.get_flash()
+tg_status = tg.get_status()
+?>
+<xi:include href="${tg.url('tw_resources.html')}" />
+<head py:match="head" py:attrs="select('@*')">
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type" 
py:replace="''"/>
+  <title py:replace="''">Your title goes here</title>
+  <meta py:replace="select('*')"/>
+  <link rel="stylesheet" type="text/css" media="screen" 
href="${tg.url('/css/style.css')}" />
+</head>
+
+<body py:match="body" py:attrs="select('@*')">
+  <h1 id="header" title="TurboGears 2.0">&nbsp;</h1>
+
+  <div id="main_content">
+
+    <div id="${tg_status}" py:if="tg_flash" class="flash" py:content="tg_flash"
+    ></div>
+    <!-- End of status_block -->
+
+    <!-- Start of page template body -->
+    <div py:replace="select('*|text()')"/>
+    <!-- End of page template body -->
+  </div>
+  <!-- End of main_content -->
+
+  <div id="footer"> 
+    <img src="images/under_the_hood_blue.png" alt="TurboGears" />
+    <p>TurboGears 2 is an open source front-to-back web development
+    framework written in Python</p>
+
+    <p>Copyright &#xa9; 2005-2008</p>
+  </div>
+  <!-- End of footer -->
+</body>
+
+</html>

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/statics.py
==============================================================================
--- (empty file)
+++ projects/ToolBox2/trunk/toolbox2/gadgets/design/statics.py  Mon Jan 21 
08:22:34 2008
@@ -0,0 +1,17 @@
+"""TurboGears 2 System Information gadget"""
+from toolbox2.lib.base import Controller
+from tg import expose, validate
+from pylons import request
+
+class statics(Controller):
+    """Static Files Uploader"""
+
+    @expose()
+    def upload(self):
+        return """
+    <form action="receive" enctype="multipart/form-data"
        method="post">
        <h2>Large File Upload Test</h2>
        File: <input name="myfile" type="file" />
        <input type="submit" />
    </form>
+        """
+    
+    @expose()
+    def receive(self, **kw):
+        return str(request.POST['myfile'])
\ No newline at end of file

Added: projects/ToolBox2/trunk/toolbox2/gadgets/design/tw_resources.html
==============================================================================
--- (empty file)
+++ projects/ToolBox2/trunk/toolbox2/gadgets/design/tw_resources.html   Mon Jan 
21 08:22:34 2008
@@ -0,0 +1,20 @@
+<html xmlns="http://www.w3.org/1999/xhtml"; 
+      xmlns:py="http://genshi.edgewall.org/";
+      xmlns:xi="http://www.w3.org/2001/XInclude";
+      py:strip="">
+  <?python resources = context.w and context.w.retrieve_resources() or {} ?>
+  <head py:match="head" py:attrs="select('@*')">
+    <link py:for="rsrc in resources.get('head', [])" 
+          py:replace="rsrc.display()" />
+    <meta py:replace="select('*|comment()|text()')" />
+  </head>
+  <body py:match="body" py:attrs="select('@*')">
+    <div py:for="rsrc in resources.get('bodytop', [])"
+         py:replace="rsrc.display()" />
+
+    <div py:replace="select('*|comment()|text()')" />
+
+    <div py:for="rsrc in resources.get('bodybottom', [])" 
+         py:replace="rsrc.display()" />
+  </body>
+</html>

Reply via email to