commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7336 - in trunk: gnue-common/src/datasources/drivers/Base gnue-f


From: reinhard
Subject: [gnue] r7336 - in trunk: gnue-common/src/datasources/drivers/Base gnue-forms/src/GFObjects
Date: Mon, 11 Apr 2005 18:41:27 -0500 (CDT)

Author: reinhard
Date: 2005-04-11 18:41:26 -0500 (Mon, 11 Apr 2005)
New Revision: 7336

Modified:
   trunk/gnue-common/src/datasources/drivers/Base/DataObject.py
   trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFDataSource.py
   trunk/gnue-forms/src/GFObjects/GFField.py
Log:
Changed default value handling to a more consistent implementation.


Modified: trunk/gnue-common/src/datasources/drivers/Base/DataObject.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/DataObject.py        
2005-04-11 21:25:00 UTC (rev 7335)
+++ trunk/gnue-common/src/datasources/drivers/Base/DataObject.py        
2005-04-11 23:41:26 UTC (rev 7336)
@@ -82,6 +82,7 @@
     cond = GConditions.combineConditions (conditions, self._staticCondition)
 
     resultset = self._resultSetClass (dataObject      = self,
+                                      defaultValues   = self._defaultValues,
                                       readonly        = readOnly,
                                       masterRecordSet = masterRecordSet)
 

Modified: trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-04-11 
21:25:00 UTC (rev 7335)
+++ trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-04-11 
23:41:26 UTC (rev 7336)
@@ -37,10 +37,14 @@
   # Constructor
   # ---------------------------------------------------------------------------
 
-  def __init__ (self, parent, initialData = {}, defaultData = {},
+  def __init__ (self, parent, initialData = {}, masterRecord = None,
+      masterKeyFields = [], masterLinkFields = [], defaultValues = {},
       rowidField = None, primarykeyFields = []):
 
-    self.__rowidField = rowidField              # Field name of the rowid
+    self.__masterRecord     = masterRecord
+    self.__masterKeyFields  = masterKeyFields
+    self.__masterLinkFields = masterLinkFields
+    self.__rowidField       = rowidField        # Field name of the rowid
     self.__primarykeyFields = primarykeyFields  # Field names of the primarykey
 
     # Status information - FIXME: should be private, others should use
@@ -70,7 +74,7 @@
     # Dictionary with field:value pairs of initial data
     self.__initialData = initialData.copy ()     # don't touch the parameter!
 
-    if self.__initialData and len (self.__initialData):
+    if self.__initialData:
 
       # Existing record:
       # Set the current state of all fields as given in the parameter
@@ -94,32 +98,31 @@
       # 3. Get default values from driver (e.g. initialize primary keys)
       if do._connection:                # There are datasources w/o connection!
         defaults = do._connection.initialize (do.table)
-        for (field, value) in defaults.items ():
-          self.__fields [field.lower ()] = value
-          # Make sure the default values are included in the insert field list
-          self._modifiedFlags [field.lower ()] = True
+        for (fieldname, value) in defaults.items ():
+          self.__setField (fieldname, value)
 
       # 4. Query current data from the backend, if the primary key was
       #    initialized above.  This is used for appserver to retrieve the
       #    result of OnInit.
       if self.__primarykeyFields:
         primarykeyIsComplete = True
-        for field in self.__primarykeyFields:
-          if self.__fields [field] is None:
+        for fieldname in self.__primarykeyFields:
+          if self.__fields [fieldname.lower ()] is None:
             primarykeyIsComplete = False
             break
         if primarykeyIsComplete:
           self.__initialData = self.__fields.copy ()
           self.requery ()
 
-      # 5. Get default values from DataSource.  This has to be done at the very
-      #    end, as these changes remain local until the first post.
-      for (field, value) in defaultData.items ():
-        self.__fields [field.lower ()] = value
-        # Make sure the default values are included in the insert field list
-        self._modifiedFlags [field.lower ()] = True
+      # 5. Get default values from DataSource.  This has to be done after the
+      #    requery, as these changes remain local until the first post.
+      for (fieldname, value) in defaultValues.items ():
+        self.__setField (fieldname, value)
 
+      # 6. Link to the master record
+      self.__setMasterLink ()
 
+
   # ---------------------------------------------------------------------------
   # Field access
   # ---------------------------------------------------------------------------
@@ -154,52 +157,43 @@
 
   # ---------------------------------------------------------------------------
 
-  def setField (self, field, value, trackMod = True):
+  def setField (self, fieldname, value):
     """
     Set a new value for a field.
 
-    @param field: Field name, case insensitive
+    @param fieldname: Field name, case insensitive
     @param value: Value to set
-    @param trackMod: If set to False, the field isn't marked as modified and
-        will not be included in the post to the backend
-    @return: The value parameter
     """
-    gDebug (8, "Set field %s to %s" % (field, repr (value)))
+
     do = self._parent._dataObject
+
     # 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(fieldname) and self._parent.isReadOnly():
       # Provide better feedback??
-      tmsg = u_("Attempted to modify read only field '%s'") % field
+      tmsg = u_("Attempted to modify read only field '%s'") % fieldname
       raise Exceptions.ReadOnlyError, tmsg
-    else:
-      fn = field.lower ()
-      self.__fields [fn] = value
-      if trackMod:
-        if self._parent.isFieldBound(field):
-          self._emptyFlag = False
-          self._updateFlag = True
-          self._modifiedFlags [fn] = True
 
-          try:
-            do._dataSource._onModification(self)
-          except AttributeError:
-            pass
-    return value
+    self.__setField (fieldname, value)
+    if self._parent.isFieldBound (fieldname):
+      self._emptyFlag = False
+      # On first touch of the record, call _onModification trigger
+      if not self._updateFlag:
+        self._updateFlag = True
+        if hasattr (do, '_dataSource'):
+          do._dataSource._onModification (self)
 
   # ---------------------------------------------------------------------------
 
-  def setFields (self, updateDict, trackMod = True):
+  def setFields (self, updateDict):
     """
     Set new values for several fields at once.
 
     @param updateDict: dictionary with the keys being the field names and the
         values being the new values for the fields
-    @param trackMod: if set to False, the field isn't marked as modified and
-        will not be included in the post to the backend
     """
-    for (field, value) in updateDict.items ():
-      self.setField (field, value, trackMod)
+    for (fieldname, value) in updateDict.items ():
+      self.setField (fieldname, value)
 
   # ---------------------------------------------------------------------------
 
@@ -366,6 +360,10 @@
     gDebug (8, 'Preparing to post datasource %s' \
                % self._parent._dataObject.name)
 
+    # Update the link to our master record, in case any key fields were updated
+    # in the master when it was posted.
+    self.__setMasterLink ()
+
     # Save the initial status so we know if any triggers changed us
     status = (self._insertFlag, self._deleteFlag, self._updateFlag)
 
@@ -437,15 +435,9 @@
 
     # Post all detail records
     for child in (self._cachedDetailResultSets.values ()):
-      do = child._dataObject
-      # Set the primary key for any new child records
-      fk = {}
-      for i in range(len(do._masterfields)):
-        fk[do._detailfields[i]] = self.getField(do._masterfields[i])
+      child.post ()
 
-      child.post (foreign_keys = fk)
 
-
   # ---------------------------------------------------------------------------
   # Requery the record data from the backend
   # ---------------------------------------------------------------------------
@@ -477,8 +469,8 @@
 
   def __post_master (self):
 
-    if self._parent._masterRecordSet:
-      self._parent._masterRecordSet.__post_master ()
+    if self.__masterRecord:
+      self.__masterRecord.__post_master ()
     else:
       self.post ()
 
@@ -486,8 +478,8 @@
 
   def __requery_master (self):
 
-    if self._parent._masterRecordSet:
-      self._parent._masterRecordSet.__requery_master ()
+    if self.__masterRecord:
+      self.__masterRecord.__requery_master ()
     else:
       self.requery ()
 
@@ -554,6 +546,32 @@
 
 
   # ---------------------------------------------------------------------------
+  # Set the master link
+  # ---------------------------------------------------------------------------
+
+  def __setMasterLink (self):
+
+    if self.__masterRecord is not None:
+      for (key, link) in zip (self.__masterKeyFields, self.__masterLinkFields):
+        self.__setField (link, self.__masterRecord.getField (key))
+
+
+  # ---------------------------------------------------------------------------
+  # Set a field and mark it as dirty, leaving the record state unchanged
+  # ---------------------------------------------------------------------------
+
+  def __setField (self, fieldname, value):
+
+    # Calling this function directly (instead of setField) causes the field to
+    # be marked as dirty, but the complete record remains unchanged. This is
+    # useful to initialize a new record: the record will still be regarded as
+    # "empty", but the field will be included in any following insert
+    # statement.
+    fieldname = fieldname.lower ()
+    self.__fields [fieldname] = value
+    self._modifiedFlags [fieldname] = True
+
+  # ---------------------------------------------------------------------------
   # Dictionary emulation
   # ---------------------------------------------------------------------------
 

Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-11 
21:25:00 UTC (rev 7335)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-11 
23:41:26 UTC (rev 7336)
@@ -49,8 +49,7 @@
      self._recordCount = 0
      self._postingRecord = None
 
-     self._defaultValues = {}
-     self._defaultValues.update(defaultValues)
+     self.__defaultValues = defaultValues.copy ()
 
      if self._dataObject._dataSource:
        self.__rowidField       = self._dataObject._dataSource._rowidField
@@ -170,13 +169,22 @@
   # Create a new RecordSet instance
   # ---------------------------------------------------------------------------
 
-  def __createRecord (self, initialData = {}, position = None):
+  def __createRecord (self, initialData = {}, defaultValues = {},
+      position = None):
 
-    record = RecordSet (parent           = self,
-                        initialData      = initialData,
-                        rowidField       = self.__rowidField,
-                        primarykeyFields = self.__primarykeyFields)
+    __defaultValues = self.__defaultValues.copy ()
+    __defaultValues.update (defaultValues)
 
+    record = RecordSet (
+        parent           = self,
+        initialData      = initialData,
+        masterRecord     = self._masterRecordSet,
+        masterKeyFields  = self._dataObject._masterfields,
+        masterLinkFields = self._dataObject._detailfields,
+        defaultValues    = __defaultValues,
+        rowidField       = self.__rowidField,
+        primarykeyFields = self.__primarykeyFields)
+
     if position is None:
       self._cachedRecords.append (record)
     else:
@@ -391,42 +399,23 @@
   # Insert a new record after the current one
   # ---------------------------------------------------------------------------
 
-  def insertRecord(self):
+  def insertRecord (self, defaultValues = {}):
+
     if self.isReadOnly():
       # Provide better feedback??
       tmsg =  _("Attempted to insert into a read only datasource")
       raise Exceptions.ReadOnlyError, tmsg
-    else:
-      gDebug (8, 'Inserting a blank record in %s' % self)
-      self._recordCount += 1
-      self._currentRecord += 1
-      record = self.__createRecord (position = self._currentRecord)
-      self.current = record
 
-      # Set any dataobject-wide default values
-      for field in self._dataObject._defaultValues.keys():
-        gDebug (8, "DataObject-Wide default for %s" % field)
-        record.setField(field, self._dataObject._defaultValues[field],False)
+    gDebug (8, 'Inserting a blank record in %s' % self)
 
-      # Set any resultset specific values
-      for field in self._defaultValues.keys():
-        gDebug (8, "ResultSet-specific default for %s" % field)
-        record.setField(field, self._defaultValues[field],False)
+    self._recordCount += 1
+    self._currentRecord += 1
+    record = self.__createRecord (defaultValues = defaultValues,
+                                  position = self._currentRecord)
+    self.__sync ()
+    return record
 
-      # Pull any primary keys from a master record set
-      if self._masterRecordSet != None and hasattr(self._dataObject, 
'_masterfields'):
-        i = 0
-        for field in self._dataObject._masterfields:
-          gDebug (8, "Value for %s to %s" % (field, \
-                     self._masterRecordSet.getField (field)))
-          
record.setField(self._dataObject._detailfields[i],self._masterRecordSet.getField(field),False)
-          i += 1
 
-      self.notifyDetailObjects()
-      self.__notifyListeners ()
-      return record
-
-
   # ---------------------------------------------------------------------------
   # Create a new record with a copy of the existing one
   # ---------------------------------------------------------------------------
@@ -479,7 +468,7 @@
   # Post changes to the backend
   # ---------------------------------------------------------------------------
 
-  def post (self, foreign_keys = {}):
+  def post (self):
 
     """
     Post all local changes to the backend.
@@ -496,18 +485,6 @@
       self._postingRecord = self._cachedRecords[recordPosition]
       postingRecordset = self._postingRecord
 
-      if self._postingRecord.isInserted ():
-        # Flip the flag for 'default' values to true so that hidden
-        # default fields are included in insert statements
-        # FIXME: should be handled by RecordSet itself via defaultData param
-        for field in self._dataObject._defaultValues.keys():
-          self._postingRecord._modifiedFlags[field] = True
-
-        # Set the foreign key fields we've got from our master. This must be
-        # done here because the primary key of the master might have been
-        # generated just before.
-        self._postingRecord.setFields (foreign_keys)
-
       if (self._postingRecord.isEmpty () or self._postingRecord.isDeleted ()) \
           and self._dataObject._dataSource._connection is not None:
         # Adjust the current record if a preceding record or the current record

Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-04-11 21:25:00 UTC (rev 
7335)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-04-11 23:41:26 UTC (rev 
7336)
@@ -382,13 +382,8 @@
       self._form.commit()
     self.processTrigger('POST-FOCUSOUT')
 
-    if self._resultSet.insertRecord():
+    if self._resultSet.insertRecord (self._lastValues):
 
-      # Set the defaultToLast fields
-      for field, value in self._lastValues.items():
-        if value is not None:
-          self._resultSet.current.setField(field, value, 0)
-
       self._recordCount = self._resultSet.getRecordCount()
       # self.switchRecord(1)            # happens via currentRecordMoved
       # Focus in
@@ -532,16 +527,6 @@
 
     self._resultSet.setRecord(self._precommitRecord)
 
-    # Step thru all the records looking for records with uncommited 
-    # changes that had default values set.  If one is found then those
-    # fields are reset to their current values *with* modification tracking
-    # on.  The default population on new records is to set the value without
-    # marking the record as modified which prevents their value from being 
saved.
-    for record in self._resultSet._cachedRecords:
-      if record.isPending():
-        for field in self._lastValues.keys():
-          record.setField(field, record.getField(field), 1)
-
     if not self._dataSourceLink.hasMaster():
       self._resultSet.post()
 

Modified: trunk/gnue-forms/src/GFObjects/GFDataSource.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFDataSource.py      2005-04-11 21:25:00 UTC 
(rev 7335)
+++ trunk/gnue-forms/src/GFObjects/GFDataSource.py      2005-04-11 23:41:26 UTC 
(rev 7336)
@@ -62,18 +62,9 @@
     self._form.dispatchEvent('preCommit', record=record)
 
   def _onModification(self, record):
-    try:
-      record.__firstModification
-    except NameError:
-      record.__firstModification = True
-      self._form.dispatchEvent('onRecordTouched', record=record)
+    self._form.dispatchEvent('onRecordTouched', record=record)
     return True
 
   def _onRecordLoaded(self, record):
     self._form.dispatchEvent('onQueryNewRecord', record=record)
     return True
-
-
-
-
-

Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py   2005-04-11 21:25:00 UTC (rev 
7335)
+++ trunk/gnue-forms/src/GFObjects/GFField.py   2005-04-11 23:41:26 UTC (rev 
7336)
@@ -323,7 +323,7 @@
       self._block._queryValues[self] = value
 
     elif mode == 'precommit':
-      value = self._block._preCommitWorkingRecord.setField(self.field,value)
+      self._block._preCommitWorkingRecord.setField(self.field,value)
 
     else:
       self._block.processTrigger('Pre-Change')





reply via email to

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