El sábado, 15 de diciembre de 2012 12:29:27 UTC-3, Massimo Di Pierro 
escribió:
>
> Did you code this already? Can you send the code. I like it a lot.


Hi Massimo,

Lack control if installed pygraphviz!

[design.html.patch] -> in admin 
[appadmin.html.patch] -> in welcome
[appadmin.py.patch] -> in welcome

Jose

-- 



--- /home/jose/web2py/applications/welcome/views/appadmin.html	2012-10-05 11:44:42.000000000 -0300
+++ /home/jose/trabajos/dbfw2p/web2py/applications/modelografico/views/appadmin.html	2012-12-15 12:41:32.000000000 -0300
@@ -2,7 +2,7 @@
 <script><!--
     jQuery(document).ready(function(){
     jQuery("table.sortable tbody tr").mouseover( function() {
-    jQuery(this).addClass("highlight"); }).mouseout( function() { 
+    jQuery(this).addClass("highlight"); }).mouseout( function() {
     jQuery(this).removeClass("highlight"); });
     jQuery('table.sortable tbody tr:odd').addClass('odd');
     jQuery('table.sortable tbody tr:even').addClass('even');
@@ -63,11 +63,11 @@
     <br/><br/>
     <h4>{{=T("%s selected", nrows)}}</h4>
     {{if start>0:}}{{=A(T('previous 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start-100)),_class="btn")}}{{pass}}
-    {{if stop<nrows:}}{{=A(T('next 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start+100)),_class="btn")}}{{pass}}    
+    {{if stop<nrows:}}{{=A(T('next 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start+100)),_class="btn")}}{{pass}}
     {{if rows:}}
        <div style="overflow: auto;" width="80%">
        {{linkto=URL('update',args=request.args[0])}}
-       {{upload=URL('download',args=request.args[0])}}    
+       {{upload=URL('download',args=request.args[0])}}
        {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}}
        </div>
     {{pass}}
@@ -75,7 +75,7 @@
     <a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}" class="btn">{{=T("export as csv file")}}</a>
   {{=formcsv or ''}}
 
-{{elif request.function=='insert':}}  
+{{elif request.function=='insert':}}
   <h2>{{=T("Database")}} {{=A(request.args[0],_href=URL('index'))}}
     {{if hasattr(table,'_primarykey'):}}
       {{fieldname=table._primarykey[0]}}
@@ -83,7 +83,7 @@
       {{tablename=request.args[1]}}
       {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}
       {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}}
-    {{else:}}  
+    {{else:}}
       {{=T("Table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}}
     {{pass}}
   </h2>
@@ -95,7 +95,7 @@
       {{fieldname=request.vars.keys()[0]}}
       {{dbname=request.args[0]}}
       {{tablename=request.args[1]}}
-      {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}      
+      {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}}
       {{=T("Table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}}
       {{=T("Record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}}
     {{else:}}
@@ -131,7 +131,7 @@
               dict(ratio=total['ratio'], hits=total['hits'], misses=total['misses']))}}
      </p>
     <p>
-      {{=T("Size of cache:")}} 
+      {{=T("Size of cache:")}}
       {{if object_stats:}}
         {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict(items=total['objects'], bytes=total['bytes']))}}
         {{if total['bytes'] > 524287:}}
@@ -151,7 +151,7 @@
     </div>
     <br />
     {{pass}}
-        
+
     <h4>{{=T("RAM")}}</h4>
     <p>{{=T.M("Number of entries: **%s**", ram['entries'])}}</p>
     {{if ram['entries'] > 0:}}
@@ -179,16 +179,16 @@
     </div>
     <br />
     {{pass}}
-    
+
     <h4>{{=T("DISK")}}</h4>
     <p>{{=T.M("Number of entries: **%s**", disk['entries'])}}</p>
     {{if disk['entries'] > 0:}}
       <p>
       {{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})",
-            dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}} 
+            dict(ratio=disk['ratio'], hits=disk['hits'], misses=disk['misses']))}}
       </p>
       <p>
-      {{=T("Size of cache:")}} 
+      {{=T("Size of cache:")}}
       {{if object_stats:}}
         {{=T.M("**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}", dict( items=disk['objects'], bytes=disk['bytes']))}}
         {{if disk['bytes'] > 524287:}}
@@ -209,11 +209,11 @@
       <br />
     {{pass}}
   </div>
-    
+
   <div class="list-header">
     <h3>{{=T("Manage Cache")}}</h3>
   </div>
-  
+
   <div class="content">
     <p>
       {{=form}}
@@ -222,3 +222,12 @@
 </div>
 <div class="clear"></div>
 {{pass}}
+
+{{if request.function=='graph_model':}}
+<h2>{{=T("Graph Model")}}</h2>
+  {{if not databases:}}
+    {{=T("No databases in this application")}}
+  {{else:}}
+    {{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
+  {{pass}}
+{{pass}}
--- /home/jose/web2py/applications/welcome/controllers/appadmin.py	2012-11-25 09:32:54.000000000 -0300
+++ /home/jose/trabajos/dbfw2p/web2py/applications/modelografico/controllers/appadmin.py	2012-12-15 12:47:03.000000000 -0300
@@ -460,3 +460,58 @@
 
     return dict(form=form, total=total,
                 ram=ram, disk=disk, object_stats=hp != False)
+
+
+
+def table_template(table):
+    def f(x):
+        if x.type == 'string':
+            return x.length
+
+        elif x.type == 'id':
+            return B('pk')
+        elif x.type.startswith('reference'):
+            return B('fk')
+        else:
+            return ' '
+
+    header = '''<TR><TD COLSPAN="3" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="#FFA21F"><FONT FACE="Helvetica Bold" COLOR="white">%s</FONT></TD></TR>'''%table
+
+    fields = []
+    for field in db[table].fields:
+        fields.append(
+        '''
+            <TR>
+                <TD ALIGN="LEFT" CELLPADDING="4" BORDER="0"><FONT COLOR="#7B7B7B" FACE="Helvetica Bold">%s</FONT></TD>
+                <TD ALIGN="LEFT" CELLPADDING="4" BORDER="0"><FONT COLOR="#7B7B7B" FACE="Helvetica">%s</FONT></TD>
+                <TD ALIGN="CENTER" CELLPADDING="4" BORDER="0"><FONT COLOR="#7B7B7B" FACE="Helvetica">%s</FONT></TD>
+            </TR>
+        '''%(db[table][field].name, db[table][field].type, f(db[table][field])))
+
+    return '''< <TABLE BGCOLOR="#F1F2AD" BORDER="1" CELLBORDER="0" CELLSPACING="0">%s,%s</TABLE> >'''%(header, ' '.join(fields))
+
+
+
+def bg_graph_model():
+    import pygraphviz as pgv
+
+    A=pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
+    for table in db.tables:
+        A.add_node(table, name=table, shape='plaintext', label=table_template(table))
+
+
+    for table in db.tables:
+        for n, field in enumerate(db[table].fields):
+            f_type = db[table][field].type
+            if f_type.startswith('reference'):
+                referenced_table = f_type.split()[1]
+                n1 = A.get_node(table)
+                n2 = A.get_node(referenced_table)
+
+                A.add_edge(n1, n2, color="#4C4C4C")
+
+    A.layout()
+    return A.draw(format='png', prog='dot')
+
+def graph_model():
+    return dict(databases=databases)
--- /home/jose/web2py/applications/admin/views/default/design.html	2012-09-11 20:39:26.000000000 -0300
+++ /home/jose/trabajos/dbfw2p/web2py/applications/admin/views/default/design.html	2012-12-15 11:37:01.000000000 -0300
@@ -79,6 +79,7 @@
     {{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}}
       {{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}}
     {{pass}}
+    {{=button(URL(a=app, c='appadmin',f='graph_model'), T('graph model'))}}
   </div>
   {{pass}}
 

Reply via email to