16 |
# write to the Free Software Foundation, Inc., 59 Temple Place |
# write to the Free Software Foundation, Inc., 59 Temple Place |
17 |
# - Suite 330, Boston, MA 02111-1307, USA. |
# - Suite 330, Boston, MA 02111-1307, USA. |
18 |
# |
# |
19 |
# Copyright 2000-2002 Free Software Foundation |
# Copyright 2000-2003 Free Software Foundation |
20 |
# |
# |
21 |
# FILE: |
# FILE: |
22 |
# GFEntry.py |
# GFEntry.py |
40 |
# |
# |
41 |
# It send events to its parent GFBlock |
# It send events to its parent GFBlock |
42 |
# |
# |
43 |
class GFEntry(GFValue, GFTabStop): |
class GFEntry(GFTabStop): |
44 |
def __init__(self, parent=None, value=None): |
def __init__(self, parent=None, value=None): |
45 |
GFValue.__init__(self, parent, value, 'GFEntry') |
GFTabStop.__init__(self, parent, 'GFEntry') |
46 |
|
|
47 |
# Default attributes (these may be replaced by parser) |
# Default attributes (these may be replaced by parser) |
48 |
self.height = float(gConfig('widgetHeight')) |
self.height = float(gConfig('widgetHeight')) |
49 |
self.width = float(gConfig('widgetWidth')) |
self.width = float(gConfig('widgetWidth')) |
50 |
self.typecast="text" |
self.style = "default" |
|
self.case="mixed" |
|
|
self.style="default" |
|
|
|
|
|
# Runtime variables |
|
|
self._uppercase = 0 |
|
|
self._lowercase = 0 |
|
|
self._numeric = 0 |
|
|
self._queryable = 1 |
|
51 |
|
|
52 |
self._inits = [self.initialize] |
self._inits = [self.initialize] |
|
self._allowedValues = None |
|
|
self._allowedValuesDescr = [""] |
|
53 |
|
|
54 |
self._rows = 1 |
self._rows = 1 |
55 |
self._gap = 0 |
self._gap = 0 |
56 |
|
|
57 |
|
# TODO: Conversion: Dunno about any of these triggers |
58 |
# |
# |
59 |
# Trigger exposure |
# Trigger exposure |
60 |
# |
# |
62 |
'POST-FOCUSOUT': 'Post-FocusOut', |
'POST-FOCUSOUT': 'Post-FocusOut', |
63 |
'PRE-FOCUSIN': 'Pre-FocusIn', |
'PRE-FOCUSIN': 'Pre-FocusIn', |
64 |
'POST-FOCUSIN': 'Post-FocusIn', |
'POST-FOCUSIN': 'Post-FocusIn', |
|
'ON-SWITCH': 'On-Switch', |
|
|
'PRE-COMMIT': 'Pre-Commit', |
|
|
'POST-COMMIT': 'Post-Commit', |
|
|
'POST-QUERY': 'Post-Query', |
|
|
'PRE-MODIFY': 'Pre-Modify', |
|
|
'PRE-INSERT': 'Pre-Insert', |
|
|
'PRE-DELETE': 'Pre-Delete', |
|
|
'PRE-UPDATE': 'Pre-Update', |
|
|
'PRE-CHANGE': 'Pre-Change', |
|
|
'POST-CHANGE': 'Post-Change', |
|
65 |
} |
} |
66 |
|
self._triggerFunctions={'set':{'function':self.triggerSetValue}, |
|
self._triggerFunctions={'allowedValues':{'function':self.allowedValues,}, |
|
|
'autofillBySequence':{'function':self.triggerAutofillBySequence}, |
|
|
'atomicModify':{'function':self.triggerAtomicModify}, |
|
|
'isEmpty':{'function':self.isEmpty}, |
|
|
'resetForeignKey':{'function':self.resetForeignKey}, |
|
|
'set':{'function':self.triggerSetValue}, |
|
67 |
'get':{'function':self.getValue} |
'get':{'function':self.getValue} |
68 |
} |
} |
|
self._triggerProperties={'readonly':{'set':self.setReadonly, |
|
|
'get':self.getReadonly |
|
|
}, |
|
|
'parent': {'get':self.getParent} |
|
|
} |
|
69 |
self._triggerSet = self.triggerSetValue |
self._triggerSet = self.triggerSetValue |
70 |
self._triggerGet = self.getValue |
self._triggerGet = self.getValue |
71 |
|
|
72 |
|
|
|
def triggerAutofillBySequence(self,sequenceName): |
|
|
if (not self.getValue()) or self.getValue()=="": |
|
|
sequenceNumber = self._block._dataSourceLink._dataObject.triggerExtensions.getSequence(sequenceName) |
|
|
self.setValue(sequenceNumber) |
|
|
|
|
|
def triggerAtomicModify(self,func): |
|
|
if self.getValue() or self.getValue()!="": |
|
|
self._block._dataSourceLink._dataObject.triggerExtensions.atomicModify(func=func, \ |
|
|
field=self.field, \ |
|
|
dataObject=self._block._dataSourceLink._dataObject,\ |
|
|
record=self._block._resultSet.current) |
|
|
|
|
|
def isEmpty(self): |
|
|
return self.getValue() in ("",None) |
|
|
|
|
|
def getReadonly(self): |
|
|
return self.readonly |
|
|
|
|
|
def setReadonly(self,value): |
|
|
self.readonly = value |
|
|
|
|
73 |
def _buildObject(self): |
def _buildObject(self): |
74 |
# Convert deprecated attributes |
return GFTabStop._buildObject(self) |
75 |
|
|
76 |
# Numeric attributes (now typecast="..") |
def initialize(self): |
|
# DEPRECATED with 0.1.x |
|
|
if hasattr(self,'numeric') and self.numeric: |
|
|
del self.numeric |
|
|
self.typecast = 'number' |
|
|
|
|
|
# visibleCount attributes... (now rows="..") |
|
|
# DEPRECATED with 0.1.x |
|
|
if not hasattr(self, 'rows') and hasattr(self,'visibleCount'): |
|
|
self.rows = self.visibleCount |
|
|
del self.visibleCount |
|
|
|
|
|
# Case attributes... (now case="..") |
|
|
# DEPRECATED with 0.1.x |
|
|
if hasattr(self,'uppercase') and self.uppercase: |
|
|
del self.uppercase |
|
|
self.case = 'upper' |
|
|
elif hasattr(self,'lowercase') and self.lowercase: |
|
|
del self.lowercase |
|
|
self.case = 'lower' |
|
|
|
|
|
# Foreign keys |
|
|
# DEPRECATED with 0.4.x |
|
|
if hasattr(self,'foreign_key') and self.foreign_key: |
|
|
fk_data= string.split(self.foreign_key,'.') |
|
|
if len (fk_data)==2: |
|
|
# no table |
|
|
(self.fk_source, self.fk_key) = fk_data |
|
|
elif len (fk_data)==3: |
|
|
# with table |
|
|
(self.fk_source, self.fk_key) = (fk_data[0], "%s.%s" % (fk_data[1], fk_data[2])) |
|
|
else: |
|
|
raise "bad forign key reference (name)" |
|
|
del self.foreign_key |
|
|
if hasattr(self,'foreign_key_description') and self.foreign_key_description: |
|
|
self.fk_description = self.foreign_key_description |
|
|
del self.foreign_key_description |
|
|
|
|
|
|
|
|
# Force 'label' styles into "readonly" mode |
|
|
if self.style == 'label': |
|
|
self.readonly = 1 |
|
|
self._queryable = 0 |
|
77 |
|
|
78 |
return GFValue._buildObject(self) |
# |
79 |
|
# Find parents/relatives |
80 |
|
# |
81 |
|
|
82 |
def initialize(self): |
# ...Block |
83 |
if self.typecast == 'number': |
try: |
84 |
self._numeric = 1 |
self._block = block = self.findParentOfType('GFForm')._logic._blockMap[self.block] |
85 |
self._allowFormulas = gConfig("AllowNumericFormulas") |
block._entryList.append(self) |
86 |
if self.case == 'upper': |
except KeyError: |
87 |
self._uppercase = 1 |
raise "Entry references non-existent block '%s'" % self.block |
88 |
elif self.case == 'lower': |
|
89 |
self._lowercase = 1 |
# ...Field |
90 |
|
try: |
91 |
|
self._field = field = block._fieldMap[self.field] |
92 |
|
field._entryList.append(self) |
93 |
|
except KeyError: |
94 |
|
raise "Entry references non-existent field '%s'" % self.field |
95 |
|
|
96 |
|
# ...Page |
97 |
|
self._page = self.findParentOfType('GFPage') |
98 |
|
self._page._entryList.append(self) |
99 |
|
|
100 |
|
self._form = self._block._form |
101 |
|
|
102 |
|
|
103 |
|
# Navigable? or no? |
104 |
|
self._navigable = self.navigable |
105 |
|
if self.style == 'label' or self.hidden: |
106 |
|
self._navigable = 0 |
107 |
|
self._queryable = 0 # TODO: is this used? |
108 |
|
|
109 |
self._formatmask = "" |
self._formatmask = "" |
110 |
self._inputmask = hasattr(self,'inputmask') and self.inputmask or "" |
self._inputmask = hasattr(self,'inputmask') and self.inputmask or "" |
111 |
self._displaymask = hasattr(self,'displaymask') and self.displaymask or "" |
self._displaymask = hasattr(self,'displaymask') and self.displaymask or "" |
112 |
|
|
113 |
self._block = self.findParentOfType('GFBlock') |
# TODO: Conversion: I'm torn... does this go here or in GFField?? |
|
|
|
|
if hasattr(self, 'default') and self.default != None and len(self.default): |
|
|
default = self.default |
|
|
else: |
|
|
default = None |
|
|
|
|
|
if not hasattr(self,'field') or not len(self.field): |
|
|
self.field = "__GNUe__%s" % self.name |
|
|
self._block._dataSourceLink.referenceUnboundField(self.field, default) |
|
|
self._bound = 0 |
|
|
else: |
|
|
self._block._dataSourceLink.referenceField(self.field, default) |
|
|
self._bound = 1 |
|
|
|
|
|
# Initialize the foreign key lookup (if necessary) |
|
|
if hasattr(self,'fk_source'): |
|
|
try: |
|
|
self.fk_key |
|
|
except NameError: |
|
|
raise "fk_source specified, but no fk_key" |
|
|
|
|
|
try: |
|
|
self._fk_descr = string.split(self.fk_description,',') |
|
|
except NameError: |
|
|
self.fk_description = self.fk_key |
|
|
self._fk_descr = string.split(self.fk_key,',') |
|
|
|
|
|
self._fk_datasource = \ |
|
|
self._block._form._datasourceDictionary[string.lower(self.fk_source)] |
|
|
|
|
|
# Reference the foreign keys to their datasources |
|
|
# (so they are selected) |
|
|
for field in [self.fk_key] + self._fk_descr: |
|
|
self._fk_datasource.referenceField(field, None) |
|
|
|
|
|
if hasattr(self, 'queryDefault') and \ |
|
|
self.queryDefault != None and \ |
|
|
self._bound and \ |
|
|
len(self.queryDefault): |
|
|
self._block._queryDefaults[self] = self.queryDefault |
|
|
|
|
|
|
|
114 |
# Create an appropriate display handler |
# Create an appropriate display handler |
115 |
if self.style == 'checkbox': |
if self.style == 'checkbox': |
116 |
self._displayHandler = GFDisplayHandler.CheckboxDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.CheckboxDisplayHandler(self, |
117 |
self._block._form._app.eventController) |
self._form._instance.eventController) |
118 |
elif self.style == 'dropdown': |
elif self.style == 'dropdown': |
119 |
self._displayHandler = GFDisplayHandler.DropdownDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.DropdownDisplayHandler(self, |
120 |
self._block._form._app.eventController) |
self._form._instance.eventController) |
121 |
elif self.style == 'textlookup': |
elif self.style == 'textlookup': |
122 |
self._displayHandler = GFDisplayHandler.TextLookupDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.TextLookupDisplayHandler(self, |
123 |
self._block._form._app.eventController) |
self._form._instance.eventController) |
124 |
elif self.typecast == 'text': |
elif self._field.typecast == 'text': |
125 |
self._displayHandler = GFDisplayHandler.TextDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.TextDisplayHandler(self, |
126 |
self._block._form._app.eventController, |
self._form._instance.eventController, |
127 |
self._displaymask, self._inputmask) |
self._displaymask, self._inputmask) |
128 |
elif self.typecast == 'number': |
elif self._field.typecast == 'number': |
129 |
self._displayHandler = GFDisplayHandler.NumberDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.NumberDisplayHandler(self, |
130 |
self._block._form._app.eventController, |
self._form._instance.eventController, |
131 |
self._displaymask, self._inputmask) |
self._displaymask, self._inputmask) |
132 |
elif self.typecast == 'date': |
elif self._field.typecast == 'date': |
133 |
self._displayHandler = GFDisplayHandler.DateDisplayHandler(self, |
self._displayHandler = GFDisplayHandler.DateDisplayHandler(self, |
134 |
self._block._form._app.eventController, |
self._form._instance.eventController, |
135 |
self._displaymask, self._inputmask) |
self._displaymask, self._inputmask) |
136 |
|
|
137 |
|
# Row settings |
138 |
def isQueryable(self): |
if hasattr(self,'rows'): |
139 |
return self._queryable |
self._rows = self.rows |
|
|
|
|
|
|
|
# |
|
|
# Pulls the proper value from the resultSet |
|
|
# |
|
|
def getValue(self): |
|
|
# TODO: No longer true... |
|
|
# We have to check to see if the _block has been |
|
|
# setup yet. The Trigger system calls getValue |
|
|
# before it's ready so we fake it |
|
|
#if hasattr(self,'_block'): |
|
|
if self._block.mode == 'query': |
|
|
try: |
|
|
value = self._block._queryValues[self] |
|
|
except KeyError: |
|
|
value = None |
|
|
elif self._block.mode == 'precommit': |
|
|
value = self._block._preCommitWorkingRecord.getField(self.field) |
|
|
|
|
140 |
else: |
else: |
141 |
value = self._block._resultSet.current.getField(self.field) |
self._rows = self._field._rows |
|
# TODO: part of the removed block check from above |
|
|
#else: |
|
|
# value = None |
|
|
|
|
|
if value == None: value = '' |
|
|
|
|
|
# TODO: check to see if this is still needed |
|
|
#CheckBox does not work if comment following "if" block (ra3vat) |
|
|
if self.style == 'checkbox' and value == '': value = 0 |
|
|
|
|
|
return value |
|
|
|
|
|
# |
|
|
# triggerSetValue |
|
|
# |
|
|
# does proper typecasting when value is set via a trigger |
|
|
# |
|
|
def triggerSetValue(self, value): |
|
|
if self.style=='checkbox' and value =='': |
|
|
value = 0 |
|
|
if self.typecast == "number" and value != None: |
|
|
value = float(value) |
|
|
self.setValue(value) |
|
|
|
|
|
def setValue(self, value): |
|
|
# TODO: This is now being done in the display handler |
|
|
#if self.style=='checkbox' and value =='': |
|
|
# value = 0 |
|
|
# |
|
|
# Number fields |
|
|
#if self.typecast == "number" and value != None: |
|
|
# value = float(value) |
|
142 |
|
|
143 |
if self._block.mode == 'query': |
if hasattr(self,'rowSpacer'): |
144 |
self._block._queryValues[self] = value |
self._gap = self.rowSpacer |
145 |
|
else: |
146 |
|
self._gap = self._field._gap |
147 |
|
|
|
elif self._block.mode == 'precommit': |
|
|
value = self._block._preCommitWorkingRecord.setField(self.field,value) |
|
148 |
|
|
149 |
else: |
# TODO: Conversion: Does this belong here or not? |
150 |
self.processTrigger('Pre-Change') |
def getValue(self, *args, **parms): |
151 |
self._block._resultSet.current.setField(self.field,value) |
return self._field.getValue(*args, **parms) |
|
self.processTrigger('Post-Change') |
|
|
self._block._form.updateUIEntry(self) |
|
|
|
|
|
# |
|
|
# allowedValues |
|
|
# |
|
|
def allowedValues(self, cond=None): |
|
|
if not self._allowedValues and hasattr(self,'_fk_datasource'): |
|
|
if cond: |
|
|
rs = self._fk_datasource.createResultSet(cond) |
|
|
else: |
|
|
rs = self._fk_datasource.createResultSet() |
|
|
more = rs.firstRecord() |
|
|
self._allowedValues = {"":""} |
|
|
self._allowedValuesDescr = [""] |
|
|
self._allowedValuesReverse = {"":""} |
|
|
dropdownSeparator = gConfig('DropdownSeparator') |
|
|
while more: |
|
|
try: |
|
|
key = "%s" % rs.current.getField(self.fk_key) |
|
|
descriptions = [] |
|
|
for i in self._fk_descr: |
|
|
descriptions.append("%s" % rs.current.getField(i)) |
|
|
descr = string.join(descriptions,dropdownSeparator) |
|
|
|
|
|
self._allowedValues[key] = descr |
|
|
self._allowedValuesDescr.append(descr) |
|
|
self._allowedValuesReverse[descr] = key |
|
|
except AttributeError: |
|
|
# TODO: What's this for? |
|
|
self._allowedValues[rs.current.getField(self.fk_key)] = None |
|
|
more = rs.nextRecord() |
|
|
GDebug.printMesg (5,'Created for DropDown: %s' % self._allowedValues) |
|
|
|
|
|
return (self._allowedValues, self._allowedValuesDescr) |
|
|
|
|
|
def resetForeignKey(self): |
|
|
self._allowedValues = None |
|
|
self.allowedValues() |
|
152 |
|
|
153 |
|
# TODO: Conversion: Does this belong here or not? |
154 |
|
def triggerSetValue(self, *args, **parms): |
155 |
|
return self._field.triggerSetValue(*args, **parms) |
156 |
|
|