[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