commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/gnue-common src/GDataObjects.py doc/Trigge...


From: Jason Cater
Subject: gnue/gnue-common src/GDataObjects.py doc/Trigge...
Date: Thu, 30 Aug 2001 14:57:48 -0700

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    01/08/30 14:57:48

Modified files:
        gnue-common/src: GDataObjects.py 
Added files:
        gnue-common/doc: TriggerSpecifications.txt 

Log message:
        Changes to master/detail to support auto-populating of primary keys

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/doc/TriggerSpecifications.txt?cvsroot=OldCVS&rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/GDataObjects.py.diff?cvsroot=OldCVS&tr1=1.10&tr2=1.11&r1=text&r2=text

Patches:
Index: gnue/gnue-common/src/GDataObjects.py
diff -u gnue/gnue-common/src/GDataObjects.py:1.10 
gnue/gnue-common/src/GDataObjects.py:1.11
--- gnue/gnue-common/src/GDataObjects.py:1.10   Thu Aug 30 14:34:48 2001
+++ gnue/gnue-common/src/GDataObjects.py        Thu Aug 30 14:57:47 2001
@@ -65,7 +65,7 @@
 
 class MasterDetailFieldMismatch(Exception): 
   # Raised when a the number of master fields doesn't match the 
-  # number of detail fields. (e.g., masterlink="id,subid" 
+  # number of detail fields. (e.g., masterlink="id,subid"
   # and detaillink="id" would be a problem; must be 1:1)
   pass
 
@@ -76,11 +76,11 @@
 # 
 # 
 ###########################################################
-class DataObject: 
+class DataObject:
 
-  def __init__(self): 
-    # Set by 
-    self.masterlink = ""       
+  def __init__(self):
+    # Set by
+    self.masterlink = ""
     self.detaillink = ""
 
     self._masterfields = []
@@ -100,28 +100,33 @@
 
 
   # Do we have a master datasource?
-  def hasMaster(self): 
+  def hasMaster(self):
     return self._masterObject != None
 
   # Do not over-ride by vendor code
-  def createResultSet(self, conditions={}, readOnly=0): 
+  def createResultSet(self, conditions={}, readOnly=0):
     return self._createResultSet(conditions, readOnly)
 
-  # Designed to be replaced by vendor-specific code 
-  def _createResultSet(self, conditions={}, readOnly=0): 
+  # Designed to be replaced by vendor-specific code
+  def _createResultSet(self, conditions={}, readOnly=0):
     pass
 
-  def createEmptyResultSet(self, readOnly=0): 
+  # Do not over-ride by vendor code
+  def createEmptyResultSet(self, readOnly=0):
+    return self._createEmptyResultSet(readOnly)
+
+  # Designed to be replaced by vendor-specific code
+  def _createEmptyResultSet(self, readOnly=0):
     return self.createResultSet(conditions={'1':2}, readOnly=readOnly)
 
 
-  # Add a detail data object.  This dataobject will create a new resultset 
-  # everytime this dataobject changes (new record, etc).  The optional 
-  # handler will be called after the detail dataobject is notified.  The 
+  # Add a detail data object.  This dataobject will create a new resultset
+  # everytime this dataobject changes (new record, etc).  The optional
+  # handler will be called after the detail dataobject is notified.  The
   # client application may wish to add a handler to know when the detail
-  # has been requeried.  handler is a method that takes two arguments: 
-  # the master ResultSet and the detail ResultSet 
-  def addDetailDataObject(self, dataObject, handler=None): 
+  # has been requeried.  handler is a method that takes two arguments:
+  # the master ResultSet and the detail ResultSet
+  def addDetailDataObject(self, dataObject, handler=None):
     GDebug.printMesg (1,"Adding a master/detail relationship to DataObject")
     dataObject._masterObject = self
     dataObject._masterfields = string.split(hasattr(dataObject,'masterlink') 
and \
@@ -129,7 +134,7 @@
     dataObject._detailfields = string.split(hasattr(dataObject,'detaillink') 
and \
                                       dataObject.detaillink or "", ',')
 
-    if len(dataObject._masterfields) != len(dataObject._detailfields): 
+    if len(dataObject._masterfields) != len(dataObject._detailfields):
       raise MasterDetailFieldMismatch, "master=%s; detail=%s" % \
           (dataObject._masterfields, dataObject._detailfields)
 
@@ -140,9 +145,9 @@
     self._detailObjects.append ([dataObject, handler])
 
 
-  # Return a list of necessary login fields (e.g., user/pass). 
+  # Return a list of necessary login fields (e.g., user/pass).
   # Each list item is another list of ["field label", isPassword?]
-  def getLoginFields(self): 
+  def getLoginFields(self):
     return []
 
 
@@ -157,7 +162,7 @@
   #
   #   As such, if the vendor-specific drivers replace this method, the last
   #   line of the new method should be self._postConnect()!
-  # 
+  #
   def connect(self, connectData={}):
     self._postConnect()
 
@@ -167,7 +172,7 @@
   #
   # NOTE: See note for connect()
   #
-  def _postConnect(self): 
+  def _postConnect(self):
     pass
 
 
@@ -177,12 +182,12 @@
   #
   # NOTE: See note for connect()
   #
-  def setDataConnection(self, connection): 
+  def setDataConnection(self, connection):
     self._dataConnection = connection
     self._postConnect()
 
 
-  def getDataConnection(self): 
+  def getDataConnection(self):
     return self._dataConnection
 
 
@@ -196,14 +201,14 @@
   def _masterRecordChanged(self, master):
     GDebug.printMesg (5, 'Master Record Changed')
     criteria = {}
-    
+
     # If a detail result set has already been created for a particular
-    # master record set, then just return/reuse this old set (after all, 
+    # master record set, then just return/reuse this old set (after all,
     # it may contain uncommitted changes)
     if (not master.current._cachedDetailResultSets.has_key(self)) or \
         ( not int(GConfig.get('CacheDetailRecords','1')) and \
          not master.current._cachedDetailResultSets[self].isPending() ):
-      for i in range(0, len(self._masterfields)): 
+      for i in range(0, len(self._masterfields)):
         GDebug.printMesg(10,"Adding criteria")
         criteria[string.strip(self._detailfields[i])] = \
             master.current.getField(string.strip(self._masterfields[i]))
@@ -215,10 +220,10 @@
 
 ###########################################################
 #
-# 
-# 
+#
+#
 ###########################################################
-class ResultSet: 
+class ResultSet:
 
   def __init__(self, dataObject, 
cursor=None,defaultValues={},masterRecordSet=None):
      self._dataObject = dataObject
@@ -230,22 +235,22 @@
      self._readonly = 0
      self._boundFields = {}
      self._unboundFields = {}
-    
-     self._defaultValues = {} 
-     for key in defaultValues.keys(): 
+
+     self._defaultValues = {}
+     for key in defaultValues.keys():
        self._defaultValues[key] = defaultValues[key]
 
      self.current = None
 
-     if masterRecordSet: 
+     if masterRecordSet:
        masterRecordSet.addDetailResultSet(self)
 
 
   # Returns whether this result set is read only or not
-  def isReadOnly(self): 
+  def isReadOnly(self):
     return self._readonly
-  
 
+
   # Returns 1=At first record, 0=Not first record
   def isFirstRecord(self):
     return (self._currentRecord == 1)
@@ -275,7 +280,7 @@
   # move to record #, returns 1=New record loaded, 0=invalid #
   def setRecord(self, record):
 
-    while (record - 1 > len(self._cachedRecords)) and self._loadNextRecord(): 
+    while (record - 1 > len(self._cachedRecords)) and self._loadNextRecord():
       pass
 
     if record - 1 > len(self._cachedRecords): 
@@ -288,10 +293,10 @@
       
   # returns 1=New record loaded, 0=No more records
   def nextRecord(self):
-    if self._currentRecord + 1 == len(self._cachedRecords): 
-      if not self._loadNextRecord(): 
+    if self._currentRecord + 1 == len(self._cachedRecords):
+      if not self._loadNextRecord():
         return 0
-  
+
     self._currentRecord = self._currentRecord + 1
     self.current = self._cachedRecords[self._currentRecord]
     self.notifyDetailObjects()
@@ -311,23 +316,23 @@
 
   # returns 1=at first record, 0=No records loaded
   def firstRecord(self):
-    if self._currentRecord < 0: 
-      if not self._loadNextRecord(): 
+    if self._currentRecord < 0:
+      if not self._loadNextRecord():
         return 0
 
     self._currentRecord = 0
     self.current = self._cachedRecords[0]
     self.notifyDetailObjects()
     return 1
-       
 
 
+
   # returns 1=at last record, 0=No records loaded
   def lastRecord(self):
-    if self._currentRecord == -1: 
+    if self._currentRecord == -1:
       return 0
     else:
-      while self._loadNextRecord(): 
+      while self._loadNextRecord():
         pass
       self._currentRecord = len(self._cachedRecords) - 1
       self.current = self._cachedRecords[self._currentRecord]
@@ -337,24 +342,30 @@
 
   # Insert a blank record after the current record
   def insertRecord(self):
-    if self.isReadOnly(): 
-      # Provide better feedback?? 
+    if self.isReadOnly():
+      # Provide better feedback??
       raise ReadOnlyError, "Attempted to insert into a read only datasource"
-    else: 
+    else:
       GDebug.printMesg(7,'Inserting a blank record')
       self._currentRecord = self._currentRecord+1
       self._cachedRecords.insert(self._currentRecord, 
self._createEmptyRecord())
       self.current = self._cachedRecords[self._currentRecord]
+      if self._masterRecordSet != None and has_attr(self._dataObject, 
'_masterfields'):
+        for field in self._dataObject._masterfields:
+          # We will not call setField because we don't wan't want 
auto-populated
+          # fields to report the record as pending a post.
+          self.current._fields[field] = self._masterRecordSet.getField(field)
+
       self.notifyDetailObjects()
       return 1
 
 
-  # Returns 1=DataObject has uncommitted changes 
+  # Returns 1=DataObject has uncommitted changes
   def isPending(self):
-    isPending = 0 
+    isPending = 0
     for rec in (self._cachedRecords):
       isPending = isPending or rec.isPending()
-      if isPending: 
+      if isPending:
         break
     return isPending
 
@@ -365,14 +376,14 @@
   # Post changes to the database
   def post(self):
     # post our changes
-    for record in (self._cachedRecords): 
+    for record in (self._cachedRecords):
       record.post()
 
   def notifyDetailObjects(self):
     GDebug.printMesg(5,'Master record changed; Notifying Detail Objects')
     for detail in self._dataObject._detailObjects:
        rs = detail[0]._masterRecordChanged(self)
-       if detail[1]: 
+       if detail[1]:
          detail[1].masterResultSetChanged(self, rs)
 
 
@@ -403,13 +414,13 @@
 ###########################################################
 class RecordSet: 
 
-  def __init__(self, parent, initialData={}, dbIdentifier=None, 
defaultData={}): 
+  def __init__(self, parent, initialData={}, dbIdentifier=None, 
defaultData={}):
     self._detailObjects = []
     self._dbIdentifier = dbIdentifier
     self._deleteFlag = 0
     self._updateFlag = 0
     self._parent = parent
-    self._modifiedFlags = {}      # If field name is present as a key, 
+    self._modifiedFlags = {}      # If field name is present as a key,
                                   # then field has been modified
 
     self._cachedDetailResultSets = {}
@@ -418,17 +429,17 @@
 
     self._unboundFields = {}
 
-    if len(initialData): 
+    if len(initialData):
       self._insertFlag = 0
       self._emptyFlag = 0
-      self._fields = {} 
-      for key in initialData.keys(): 
+      self._fields = {}
+      for key in initialData.keys():
        self._fields[key] = initialData[key]
-    else: 
+    else:
       self._insertFlag = 1
       self._emptyFlag = 1
-      self._fields = {} 
-      for key in defaultData.keys(): 
+      self._fields = {}
+      for key in defaultData.keys():
        self._fields[key] = defaultData[key]
 
 
@@ -437,25 +448,25 @@
 
     # The _insertFlag and _deleteFlag takes care of records that
     # were inserted, but then deleted before a save (i.e., nothing to do)
-    if self._emptyFlag or self._insertFlag and self._deleteFlag: 
+    if self._emptyFlag or self._insertFlag and self._deleteFlag:
       return 0
-    else: 
+    else:
       return self._insertFlag or self._deleteFlag or self._updateFlag
 
 
   # Returns 1=Record is pending a deletion
   def isDeleted(self):
-    if self._emptyFlag: 
+    if self._emptyFlag:
       return 0
-    else: 
+    else:
       return self._deleteFlag
 
 
   # Returns 1=Record is pending an update
   def isModified(self):
-    if self._emptyFlag or self._insertFlag: 
+    if self._emptyFlag or self._insertFlag:
       return 0
-    else: 
+    else:
       return self._updateFlag
 
 
@@ -474,43 +485,43 @@
 
   # Returns current value of "field"
   def getField(self, field):
-    if self._fields.has_key(string.lower(field)): 
+    if self._fields.has_key(string.lower(field)):
       return self._fields[string.lower(field)]
-    else: 
+    else:
       return None
 
 
   # Sets current value of "field"
   def setField(self, field, value):
-    # If this field is bound to a datasource and the datasource is read only, 
+    # If this field is bound to a datasource and the datasource is read only,
     # generate an error.
-    if self._parent.isFieldBound(field) and self._parent.isReadOnly(): 
+    if self._parent.isFieldBound(field) and self._parent.isReadOnly():
       # Provide better feedback??
       raise ReadOnlyError, "Attempted to modify read only field '%s'" % field
-    else: 
+    else:
       self._emptyFlag = 0
       fn = string.lower(field)
       self._fields[fn] = "%s" % value
-      if self._parent.isFieldBound(field): 
+      if self._parent.isFieldBound(field):
         self._updateFlag = 1
-        if self._modifiedFlags.has_key(fn): 
+        if self._modifiedFlags.has_key(fn):
           flag = self._modifiedFlags[fn] + 1
-        else: 
+        else:
           flag = 1
         self._modifiedFlags[fn] = flag
 
 
   # Returns 1=Field has been modified
   def isFieldModified(self, fieldName):
-    return self._modifiedFlags.has_key (string.lower(fieldName))   
+    return self._modifiedFlags.has_key (string.lower(fieldName))
 
 
   # Mark the current record as deleted
-  def delete(self): 
-    if self._parent.isReadOnly(): 
-      # Provide better feedback?? 
+  def delete(self):
+    if self._parent.isReadOnly():
+      # Provide better feedback??
       raise ReadOnlyError, "Attempted to delete from a read only datasource"
-    else: 
+    else:
       self._deleteFlag = 1
 
 
@@ -522,12 +533,12 @@
 
     GDebug.printMesg(5,'Preparing to post datasource %s' %  
self._parent._dataObject.name)
 
-    if self.isPending(): 
+    if self.isPending():
       GDebug.printMesg(5,'Posting datasource %s' % 
self._parent._dataObject.name)
       self._postChanges()
 
-    # Post all details in 
-    for child in (self._cachedDetailResultSets.keys()): 
+    # Post all details in
+    for child in (self._cachedDetailResultSets.keys()):
       self._cachedDetailResultSets[child].post()
 
 
@@ -541,7 +552,7 @@
   ###
 
   # Post any changes to database
-  def _postChanges(self): 
+  def _postChanges(self):
     return 1
 
 



reply via email to

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