[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r6894 - in trunk/gnue-common/src/datasources: . drivers/DBSIG2 dr
From: |
johannes |
Subject: |
[gnue] r6894 - in trunk/gnue-common/src/datasources: . drivers/DBSIG2 drivers/appserver/appserver |
Date: |
Thu, 13 Jan 2005 09:11:09 -0600 (CST) |
Author: johannes
Date: 2005-01-13 09:11:08 -0600 (Thu, 13 Jan 2005)
New Revision: 6894
Modified:
trunk/gnue-common/src/datasources/GDataSource.py
trunk/gnue-common/src/datasources/drivers/DBSIG2/DataObject.py
trunk/gnue-common/src/datasources/drivers/appserver/appserver/DataObject.py
Log:
Added <sortorder>-tag to datasources which also handles 'descending' order
Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py 2005-01-12 09:40:43 UTC
(rev 6893)
+++ trunk/gnue-common/src/datasources/GDataSource.py 2005-01-13 15:11:08 UTC
(rev 6894)
@@ -38,6 +38,7 @@
from gnue.common.formatting import GTypecast
from gnue.common.datasources import GConditions, Exceptions
from gnue.common.definitions.GParserHelpers import GContent
+from gnue.common.definitions.GParser import MarkupError
########################################################################
@@ -70,6 +71,7 @@
self._toplevelParent = None # Needs to be set by subclass
# so that _topObject gets set
self._topObject = None
+ self.sorting = None
#
# trigger support
@@ -129,25 +131,21 @@
self._fieldReferences[field] = True
except AttributeError:
pass
- try:
- # TODO: This might be deprecated;
- # TODO: should be using <sorting> tags
- for field in string.split(self.order_by,','):
- gDebug (5, "Order-By field %s" % field)
- if field[-5:].lower() == ' desc':
- field = field[:-5]
- self._fieldReferences[field] = True
- except AttributeError:
- pass
+
+ self.__getSortOrder ()
+ if self.sorting:
+ for (field, order) in self.sorting:
+ self._fieldReferences [field] = True
+
return GObjects.GObj._buildObject(self)
def triggerGetOrderBy(self):
- return self.order_by
+ return self.sorting
def triggerSetOrderBy(self,value):
- self.order_by = value
+ self.sorting = value
if self._dataObject:
- self._dataObject.order_by = value
+ self._dataObject.sorting = value
def triggerGetCount(self):
if self._currentResultSet:
@@ -313,6 +311,7 @@
except KeyError:
pass
self._dataObject = dataObject
+ self._dataObject.sorting = self.sorting
def connect(self):
@@ -394,11 +393,13 @@
self._topObject = self.findParentOfType(self._toplevelParent)
gDebug (10, "Setting %s to connect mgr %s" \
% (self.name, self._topObject._connections))
+ self.__getSortOrder ()
self.setConnectionManager(self._topObject._connections)
self.initialize()
self.connect()
self.extensions = self._dataObject.triggerExtensions
+
# TODO: Merged into GDataSource per the TODOs in reports and forms however
# TODO: self._topObject._datasourceDictionary implies that the top object
# TODO: always has a specifc structure. This is a bad thing :( Maybe
GRootObj
@@ -423,12 +424,69 @@
'master': self.master}
raise StandardError, tmsg
+
+
def tertiaryInit(self):
if hasattr(self, 'prequery'):
if not self.hasMaster() and self.prequery:
self.createResultSet()
+ # ---------------------------------------------------------------------------
+ # Make sure we have either no sort order, or one in the proper format
+ # ---------------------------------------------------------------------------
+
+ def __getSortOrder (self):
+
+ # If there is both, an order_by attribute *and* a sorting-tag, we've stop
+ child = self.findChildOfType ('GSortOrder')
+ if child is not None and hasattr (self, 'order_by'):
+ raise MarkupError, u_("The use of order_by is depreciated. Please "
+ "use <sortorder> instead")
+
+ # If there's a sorting tag, we'll use this first
+ if child is not None:
+ self.sorting = []
+ for item in child.findChildrenOfType ('GSortField'):
+ self.sorting.append ((item.name, item.descending))
+
+ # otherwise let's investigate the order_by attribute given
+ elif hasattr (self, 'order_by'):
+ self.sorting = []
+
+ # If it's a string or a unicode string, we transform it into a tuple
+ # sequence, where all items are treated to be in 'ascending' order
+ if isinstance (self.order_by, types.StringType) or \
+ isinstance (self.order_by, types.UnicodeType):
+ print o(u_("DEPRECIATION WARNING: use of 'order_by' attribute is " \
+ "depreciated. Please use <sortorder> instead."))
+ for field in string.split (self.order_by, ','):
+ (item, desc) = (field, field [-5:].lower () == ' desc')
+ if desc:
+ item = item [:-5].strip ()
+
+ self.sorting.append ((item, desc))
+
+ # Well, order_by is already a sequence. So we've to make sure it's a
+ # sequence of tuples with fieldname and direction.
+ elif isinstance (self.order_by, types.ListType):
+ for item in self.order_by:
+ if isinstance (item, types.StringType) or \
+ isinstance (item, types.UnicodeType):
+ self.sorting.append ((item, False))
+ else:
+ self.sorting.append (item)
+
+ else:
+ raise MarkupError, \
+ u_("Invalid form of 'order_by' attribute. Please use <sorting> "
+ "instead")
+
+ delattr (self, 'order_by')
+
+
+
+
# Find a specific record in the resultset by field values
def findRecord(self, fieldValues):
self._currentResultSet.findRecord(fieldValues)
@@ -610,6 +668,28 @@
'Typecast': GTypecast.text }
},
'ParentTags': None },
+
+ 'sortorder': {
+ 'BaseClass': GSortOrder,
+ 'Attributes': {},
+ 'ParentTags': ('datasource',),
+ },
+ 'sortfield': {
+ 'BaseClass': GSortField,
+ 'Attributes': {
+ 'name': {
+ 'Required': True,
+ 'Unique' : True,
+ 'Typecast': GTypecast.name,
+ },
+ 'descending': {
+ 'Default' : False,
+ 'Typecast': GTypecast.boolean,
+ },
+ },
+ 'ParentTags': ('sortorder',),
+ },
+
'staticset': {
'BaseClass': GStaticSet,
# TODO: This should be replaced by a SingleInstanceInParentObject
@@ -684,6 +764,26 @@
return xmlElements
+# =============================================================================
+# Classes for implementing sort options
+# =============================================================================
+
+class GSortOrder (GObjects.GObj):
+ def __init__ (self, parent = None):
+ GObjects.GObj.__init__ (self, parent, 'GSortOrder')
+ self.sorting = []
+ self._inits = [self._build]
+
+ def _build (self):
+ for item in self.findChildrenOfType ('GSortField'):
+ self.sorting.append ((item.name, item.descending))
+
+
+class GSortField (GObjects.GObj):
+ def __init__ (self, parent = None):
+ GObjects.GObj.__init__ (self, parent, 'GSortField')
+
+
#
# Wrapper for standalone DataSources
# (i.e., not in context of a GObj tree)
Modified: trunk/gnue-common/src/datasources/drivers/DBSIG2/DataObject.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/DBSIG2/DataObject.py
2005-01-12 09:40:43 UTC (rev 6893)
+++ trunk/gnue-common/src/datasources/drivers/DBSIG2/DataObject.py
2005-01-13 15:11:08 UTC (rev 6894)
@@ -339,8 +339,9 @@
q = "SELECT %s* FROM %s%s" % (distinct, self.table,
whereClause)
- if hasattr(self,'order_by') and not forDetail:
- q = "%s ORDER BY %s " % (q, self.order_by)
+ if hasattr (self, 'sorting') and not forDetail and self.sorting:
+ order = ["%s%s" % (f, d and ' desc' or '') for (f, d) in self.sorting]
+ q = "%s ORDER BY %s " % (q, string.join (order, ", "))
gDebug (5, q)
Modified:
trunk/gnue-common/src/datasources/drivers/appserver/appserver/DataObject.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/appserver/appserver/DataObject.py
2005-01-12 09:40:43 UTC (rev 6893)
+++ trunk/gnue-common/src/datasources/drivers/appserver/appserver/DataObject.py
2005-01-13 15:11:08 UTC (rev 6894)
@@ -87,11 +87,7 @@
else:
filter = []
- if hasattr (self, 'order_by'):
- sort = string.splitfields (self.order_by, ',')
- else:
- sort = []
-
+ sort = self.sorting and self.sorting or []
fieldlist = self._fieldReferences.keys ()
list_id = self._connection._sm.request (self._connection._sess_id,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r6894 - in trunk/gnue-common/src/datasources: . drivers/DBSIG2 drivers/appserver/appserver,
johannes <=