[Top][All Lists]
[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')
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7336 - in trunk: gnue-common/src/datasources/drivers/Base gnue-forms/src/GFObjects,
reinhard <=