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> » 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']>0" py:replace="' '*4*int(file['level'])"> </span> + <img src="/images/places/folder.png" width='16' height='16' py:if="file['isdir'] and file['level']>1" alt="${idx}/" /> + <div py:if="file['isdir'] and file['level']>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']>0" py:replace="' '*4*int(file['level'])"> </span> + <img src="/images/places/folder.png" width='16' height='16' py:if="file['isdir'] and file['level']>1" alt="${idx}/" /> + <div py:if="file['isdir'] and file['level']>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']>0" py:replace="' '*4*int(file['level'])"> </span> + <img src="/images/places/folder.png" width='16' height='16' py:if="file['isdir'] and file['level']>1" alt="${idx}/" /> + <div py:if="file['isdir'] and file['level']>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']>0" py:replace="' '*4*int(file['level'])"> </span> + <img src="/images/places/folder.png" width='16' height='16' py:if="file['isdir'] and file['level']>1" alt="${idx}/" /> + <div py:if="file['isdir'] and file['level']>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"> </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 © 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>
