commit-gnue
[Top][All Lists]
Advanced

[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,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]