[rhmessaging-commits] rhmessaging commits: r1527 - in mgmt: cumin/python/wooly and 1 other directories.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Fri Dec 21 16:41:27 EST 2007


Author: justi9
Date: 2007-12-21 16:41:26 -0500 (Fri, 21 Dec 2007)
New Revision: 1527

Added:
   mgmt/cumin/python/wooly/tables.py
   mgmt/cumin/python/wooly/tables.strings
Modified:
   mgmt/cumin/python/cumin/__init__.py
   mgmt/cumin/python/cumin/client.py
   mgmt/cumin/python/cumin/client.strings
   mgmt/cumin/python/cumin/widgets.py
   mgmt/cumin/python/wooly/widgets.py
   mgmt/notes/justin-todo.txt
Log:
Adds a SqlTable class that takes sql mappings, generates queries, and
maps the results to column renderers.

Uses this class to list client sessions.



Modified: mgmt/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/cumin/python/cumin/__init__.py	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/cumin/python/cumin/__init__.py	2007-12-21 21:41:26 UTC (rev 1527)
@@ -7,7 +7,6 @@
 from wooly.devel import DevelPage
 from wooly.parameters import IntegerParameter
 from mint import *
-from sqlobject.main import *
 from time import sleep
 from threading import Thread, Event
 
@@ -32,7 +31,7 @@
         self.model = CuminModel()
 
         self.broker_connect_thread = BrokerConnectThread(self.model)
-        #self.broker_connect_thread.start()
+        self.broker_connect_thread.start()
 
         self.cumin_page = CuminPage(self, "cumin.html")
         self.set_default_page(self.cumin_page)
@@ -47,7 +46,6 @@
         self.add_page(ExchangeChartPage(self, "exchange.png"))
         self.add_page(ClientXmlPage(self, "client.xml"))
         self.add_page(ClientChartPage(self, "client.png"))
-        self.add_page(TestPage(self, "test.html"))
 
 class CuminServer(WebServer):
     def __init__(self, port=9090):
@@ -107,32 +105,3 @@
             print "Connection succeeded"
         except socket.error:
             print "Connection failed"
-
-from wooly.widgets import SqlItemTable, ItemTableColumn
-from sqlobject import sqlhub
-
-class TestPage(Page):
-    def __init__(self, app, name):
-        super(TestPage, self).__init__(app, name)
-
-        self.table = self.TestTable(app, "test")
-        self.add_child(self.table)
-
-    class TestTable(SqlItemTable):
-        def __init__(self, app, name):
-            super(TestPage.TestTable, self).__init__(app, name)
-
-            col = ItemTableColumn(app, "a")
-            self.add_column(col)
-
-            col = ItemTableColumn(app, "b")
-            self.add_column(col)
-
-            col = ItemTableColumn(app, "c")
-            self.add_column(col)
-
-        def get_connection(self, session):
-            return sqlhub.getConnection().getConnection()
-
-        def get_sql(self, session, object):
-            return "select id, name, durable from queue"

Modified: mgmt/cumin/python/cumin/client.py
===================================================================
--- mgmt/cumin/python/cumin/client.py	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/cumin/python/cumin/client.py	2007-12-21 21:41:26 UTC (rev 1527)
@@ -193,34 +193,53 @@
             return "client.png?id=%i;s=framesToClient;s=bytesToClient" \
                    % client.id
 
-class ClientSessionSet(ItemSet):
+class ClientSessionSet(CuminTable):
+    def __init__(self, app, name):
+        super(ClientSessionSet, self).__init__(app, name)
+
+        self.table_sql = "session as s"
+        self.where_sql = "where s.client_id = %(id)r"
+
+        self.add_sql_join("session_stats as c", "c.id", "s.stats_curr_id")
+        self.add_sql_join("session_stats as p", "p.id", "s.stats_curr_id")
+
+        self.add_sql_column("name", "s.name")
+        self.add_sql_column("expires", "c.expire_time")
+        self.add_sql_column("status", "c.attached")
+
+        col = self.NameColumn(app, "name")
+        self.add_column(col)
+
+        col = self.ExpiresColumn(app, "expires")
+        self.add_column(col)
+
+        col = self.StatusColumn(app, "status")
+        self.add_column(col)
+
     def get_title(self, session, client):
         return "Sessions %s" % fmt_count(self.get_item_count(session, client))
 
+    def get_sql_values(self, session, client):
+        return {"id": client.id}
+
     def get_item_count(self, session, client):
         return client.sessions.count()
 
-    def do_get_items(self, session, client):
-        return client.sessions
+    class NameColumn(ItemTableColumn):
+        def get_title(self, session, object):
+            return "Name"
 
-    def render_item_name(self, session, session_):
-        return session_.name
+    class ExpiresColumn(ItemTableColumn):
+        def get_title(self, session, object):
+            return "Expires"
 
-    def render_item_remaining_lifespan(self, session, session_):
-        stat = self.app.model.session.get_stat("remainingLifespan")
-        return fmt_duration(stat.value(session_))
+        def do_render(self, session, data):
+            return "<td>%s</td>" % fmt_datetime(data[self.name()])
 
-    def render_item_frames_outstanding(self, session, session_):
-        stat = self.app.model.session.get_stat("framesOutstanding")
-        return stat.value(session_)
+    class StatusColumn(ItemTableColumn):
+        def get_title(self, session, object):
+            return "Status"
 
-    def render_item_attached(self, session, session_):
-        stat = self.app.model.session.get_stat("attached")
-        return fmt_predicate(stat.value(session_))
-
-    def render_item_status(self, session, session_):
-        return fmt_ostatus(session_)
-
 class ClientXmlPage(CuminXmlPage):
     def __init__(self, app, name):
         super(ClientXmlPage, self).__init__(app, name)

Modified: mgmt/cumin/python/cumin/client.strings
===================================================================
--- mgmt/cumin/python/cumin/client.strings	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/cumin/python/cumin/client.strings	2007-12-21 21:41:26 UTC (rev 1527)
@@ -154,6 +154,8 @@
 </script>
 
 [ClientSessionSet.html]
+<div class="rfloat">{page}</div>
+
 <div class="sactions">
   <h2>Act on Selected Sessions:</h2>
   <button>Solicit Ack</button>
@@ -163,24 +165,18 @@
 </div>
 
 <table class="mobjects">
-  <tr>
-    <th><input type="checkbox"/></th>
-    <th>Name</th>
-    <th class="ralign">Remaining Lifespan</th>
-    <th class="ralign">Frames Outstanding</th>
-    <th>Attached?</th>
-    <th>Status</th>
-  </tr>
+  <thead>
+    <tr>
+      <th><input type="checkbox"/></th>
+      {headers}
+    </tr>
+  </thead>
 
-  {items}
+  <tbody>{items}</tbody>
 </table>
 
 [ClientSessionSet.item_html]
 <tr>
   <td><input type="checkbox"/></td>
-  <td>{item_name}</td>
-  <td class="ralign">{item_remaining_lifespan}</td>
-  <td class="ralign">{item_frames_outstanding}</td>
-  <td>{item_attached}</td>
-  <td>{item_status}</td>
+  {cells}
 </tr>

Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/cumin/python/cumin/widgets.py	2007-12-21 21:41:26 UTC (rev 1527)
@@ -1,8 +1,10 @@
 from math import ceil
+from sqlobject import sqlhub
 from sqlobject.sresults import SelectResults
 from wooly import *
 from wooly.widgets import *
 from wooly.forms import *
+from wooly.tables import *
 from mint import *
 
 from parameters import *
@@ -410,6 +412,25 @@
 
         return items
 
+class CuminTable(SqlTable):
+    def __init__(self, app, name):
+        super(CuminTable, self).__init__(app, name)
+
+        self.paginator = Paginator(app, "page")
+        self.add_child(self.paginator)
+
+    def get_connection(self, session):
+        return sqlhub.getConnection().getConnection()
+
+    def do_process(self, session, object):
+        super(CuminTable, self).do_process(session, object)
+
+        self.paginator.set_count(session, self.get_item_count(session, object))
+
+    def get_limit_sql(self, session):
+        start, end = self.paginator.get_bounds(session)
+        return "limit %i offset %i" % (end, start)
+
 class PaginatedItemSet(ItemSet):
     def __init__(self, app, name):
         super(PaginatedItemSet, self).__init__(app, name)
@@ -475,4 +496,3 @@
     def render_item_messages_matched_rate(self, session, binding):
         stat = self.app.model.binding.get_stat("msgMatched")
         return fmt_rate(stat.rate(binding), "msg", "sec")
-

Added: mgmt/cumin/python/wooly/tables.py
===================================================================
--- mgmt/cumin/python/wooly/tables.py	                        (rev 0)
+++ mgmt/cumin/python/wooly/tables.py	2007-12-21 21:41:26 UTC (rev 1527)
@@ -0,0 +1,261 @@
+from wooly import *
+from widgets import *
+from parameters import *
+
+strings = StringCatalog(__file__)
+
+class ItemTable(ItemSet):
+    def __init__(self, app, name):
+        super(ItemTable, self).__init__(app, name)
+
+        self.header_html = Template(self, "header_html")
+        self.cell_tmpl = Template(self, "cell_html")
+
+        self.columns = list()
+
+        self.scolumn = Parameter(app, "col")
+        self.add_parameter(self.scolumn)
+
+        self.reversed = BooleanParameter(app, "rev")
+        self.reversed.set_default(False)
+        self.add_parameter(self.reversed)
+
+    def add_column(self, column):
+        self.columns.append(column)
+        self.add_child(column)
+
+        if self.scolumn.default is None:
+            self.scolumn.default = column.name()
+
+    def get_selected_column(self, session):
+        name = self.scolumn.get(session)
+        for column in self.columns:
+            if column.name() == name:
+                return column
+
+    def is_reversed(self, session):
+        return self.reversed.get(session)
+
+    def get_items(self, session, object):
+        """Gets the rows"""
+
+        return None
+
+    def render_headers(self, session, object):
+        writer = Writer()
+
+        for column in self.columns:
+            self.header_html.render(session, (column, object), writer)
+
+        return writer.to_string()
+
+    #def render_header_class(self, session, column):
+    #    return " ".join(column.get_classes(session))
+
+    def render_header_href(self, session, args):
+        column, object = args
+        branch = session.branch()
+
+        if column.name() == self.scolumn.get(session):
+            self.reversed.set(branch, not self.reversed.get(session))
+
+        self.scolumn.set(branch, column.name())
+
+        return branch.marshal()
+
+    def render_header_content(self, session, args):
+        column, object = args
+        return column.get_title(session, object)
+
+    def render_cells(self, session, data):
+        data_map = dict()
+
+        for col, datum in zip(self.columns, data):
+            data_map[col.name()] = datum
+
+        writer = Writer()
+
+        for col in self.columns:
+            writer.write(col.render(session, data_map))
+
+        return writer.to_string()
+
+    def render_none(self, session, object):
+        """For producing a message when the table is empty"""
+        
+        return None
+
+class ItemTableColumn(Widget):
+    def __init__(self, app, name):
+        super(ItemTableColumn, self).__init__(app, name)
+
+    def do_render(self, session, data):
+        return "<td>%s</td>" % str(data[self.name()])
+
+class SqlTable(ItemTable):
+    def __init__(self, app, name):
+        super(SqlTable, self).__init__(app, name)
+
+        self.table_sql = None
+        self.where_sql = None
+        self.sql_joins = list()
+        self.sql_columns = list()
+
+    def add_sql_join(self, table_sql, column_sql, fk_column_sql):
+        join = self.SqlJoin(self, table_sql, column_sql, fk_column_sql)
+        self.sql_joins.append(join)
+
+    def add_sql_column(self, name, sql):
+        col = self.SqlColumn(self, name, sql)
+        self.sql_columns.append(col)
+
+    def get_sql_column(self, name):
+        for col in self.sql_columns:
+            if col.name == name:
+                return col
+
+    def get_select_sql(self, session):
+        if not self.sql_columns:
+            raise Exception()
+
+        cols = ", ".join([col.get_sql(session) for col in self.sql_columns])
+        sql = "select %s" % cols
+
+        return sql
+
+    def get_from_sql(self, session):
+        if not self.table_sql:
+            raise Exception()
+
+        elems = list()
+
+        elems.append("from %s" % self.table_sql)
+
+        for join in self.sql_joins:
+            elems.append(join.get_sql(session))
+
+        return "\n".join(elems)
+
+    def get_where_sql(self, session):
+        return self.where_sql
+
+    def get_orderby_sql(self, session):
+        scol = self.get_selected_column(session)
+        sqlcol = self.get_sql_column(scol.name())
+
+        if sqlcol:
+            column_sql = sqlcol.get_sql(session)
+            dir = self.is_reversed(session) and "desc" or "asc"
+            sql = "order by %s %s" % (column_sql, dir)
+
+            return sql
+
+    def get_limit_sql(self, session):
+        return None
+
+    def get_sql(self, session):
+        elems = (self.get_select_sql(session),
+                 self.get_from_sql(session),
+                 self.get_where_sql(session),
+                 self.get_orderby_sql(session),
+                 self.get_limit_sql(session))
+
+        writer = Writer()
+        
+        for elem in elems:
+            if elem:
+                writer.write(elem)
+                writer.write("\n")
+
+        sql = writer.to_string()
+
+        #print sql
+
+        return sql
+
+    def get_sql_values(self, session, object):
+        return None
+
+    def get_connection(self, session):
+        pass
+
+    def get_items(self, session, object):
+        conn = self.get_connection(session)
+
+        if conn:
+            cursor = conn.cursor()
+            sql = self.get_sql(session)
+            sql_values = self.get_sql_values(session, object)
+
+            cursor.execute(sql, sql_values)
+
+            return cursor
+
+    def do_render(self, session, object):
+        cursor = self.get_items(session, object)
+
+        if cursor:
+            html = super(ItemSet, self).do_render(session, cursor)
+        else:
+            html = self.render_none(session, object)
+
+        return html
+
+    def render_items(self, session, cursor):
+        writer = Writer()
+
+        for row in cursor:
+            self.item_tmpl.render(session, row, writer)
+
+        return writer.to_string()
+
+    def render_cells(self, session, data):
+        data_map = dict()
+
+        for col, datum in zip(self.sql_columns, data):
+            data_map[col.name] = datum
+
+        writer = Writer()
+
+        for col in self.columns:
+            writer.write(col.render(session, data_map))
+
+        return writer.to_string()
+
+    class SqlColumn(object):
+        def __init__(self, table, name, sql):
+            self.table = table
+            self.name = name
+            self.sql = sql
+
+        def get_sql(self, session):
+            return self.sql
+
+    class SqlJoin(object):
+        def __init__(self, table,
+                     table_sql=None, column_sql=None, fk_column_sql=None):
+            self.table = table
+            self.table_sql = table_sql
+            self.column_sql = column_sql
+            self.fk_column_sql = fk_column_sql
+            self.type_sql = "left outer join"
+
+        def get_table_sql(self, session):
+            return self.table_sql
+
+        def get_column_sql(self, session):
+            return self.column_sql
+
+        def get_fk_column_sql(self, session):
+            return self.fk_column_sql
+
+        def get_type_sql(self, session):
+            return self.type_sql
+
+        def get_sql(self, session):
+            elems = (self.get_type_sql(session),
+                     self.get_table_sql(session),
+                     "on", self.get_column_sql(session),
+                     "=", self.get_fk_column_sql(session))
+
+            return " ".join(elems)

Added: mgmt/cumin/python/wooly/tables.strings
===================================================================
--- mgmt/cumin/python/wooly/tables.strings	                        (rev 0)
+++ mgmt/cumin/python/wooly/tables.strings	2007-12-21 21:41:26 UTC (rev 1527)
@@ -0,0 +1,13 @@
+[ItemTable.html]
+<table>
+  <thead>{headers}</thead>
+  <tbody>{items}</tbody>
+</table>
+
+[ItemTable.header_html]
+<th class="{header_class}"><a href="{header_href}">{header_content}</a></th>
+
+[ItemTable.item_html]
+<tr>
+  {cells}
+</tr>

Modified: mgmt/cumin/python/wooly/widgets.py
===================================================================
--- mgmt/cumin/python/wooly/widgets.py	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/cumin/python/wooly/widgets.py	2007-12-21 21:41:26 UTC (rev 1527)
@@ -142,14 +142,6 @@
     def do_get_items(self, session, object):
         return ()
 
-    def do_render(self, session, object):
-        if self.get_item_count(session, object):
-            html = super(ItemSet, self).do_render(session, object)
-        else:
-            html = self.render_none(session, object)
-
-        return html
-
     def render_items(self, session, object):
         items = self.get_items(session, object)
         writer = Writer()
@@ -182,83 +174,3 @@
             self.item_tmpl.render(session, child, writer)
 
         return writer.to_string()
-
-class ItemTable(ItemSet):
-    def __init__(self, app, name):
-        super(ItemTable, self).__init__(app, name)
-
-        self.cell_tmpl = Template(self, "cell_html")
-
-        self.columns = list()
-
-    def add_column(self, column):
-        self.columns.append(column)
-        self.add_child(column)
-
-    # Here "items" are rows
-    def get_items(self, session, object):
-        return None
-
-    def render_cells(self, session, item):
-        writer = Writer()
-
-        for col, datum in zip(self.columns, item):
-            writer.write(col.render(session, datum))
-
-        return writer.to_string()
-
-    def render_none(self, session, object):
-        """For producing a message when the table is empty"""
-        
-        return None
-
-class ItemTableColumn(Widget):
-    def __init__(self, app, name):
-        super(ItemTableColumn, self).__init__(app, name)
-
-    def do_render(self, session, object):
-        return "<td>%s</td>" % str(object)
-
-class SqlItemTable(ItemTable):
-    def __init__(self, app, name):
-        super(SqlItemTable, self).__init__(app, name)
-
-    def get_connection(self, session):
-        pass
-
-    def get_sql(self, session, object):
-        pass
-
-    def get_items(self, session, object):
-        conn = self.get_connection(session)
-
-        if conn:
-            cursor = conn.cursor()
-            sql = self.get_sql(session, object)
-
-            cursor.execute(sql)
-
-            return cursor
-
-    def do_render(self, session, object):
-        cursor = self.get_items(session, object)
-
-        if cursor:
-            html = super(ItemSet, self).do_render(session, cursor)
-        else:
-            html = "XXX none"
-
-        return html
-
-    def render_items(self, session, cursor):
-        writer = Writer()
-
-        while True:
-            row = cursor.fetchone()
-
-            if not row:
-                break
-
-            self.item_tmpl.render(session, row, writer)
-
-        return writer.to_string()

Modified: mgmt/notes/justin-todo.txt
===================================================================
--- mgmt/notes/justin-todo.txt	2007-12-21 16:35:23 UTC (rev 1526)
+++ mgmt/notes/justin-todo.txt	2007-12-21 21:41:26 UTC (rev 1527)
@@ -38,6 +38,9 @@
 
 Deferred
 
+ * Directly set attr.default for static defaults; eliminate
+   attr.set_default
+
  * Add sort direction icon
 
  * Deal with large numbers of pages in paginators




More information about the rhmessaging-commits mailing list