[Zope-dev] RFC: Date property requiers valid date (no more)
Joseph Wayne Norton
norton@alum.mit.edu
Thu, 04 Oct 2001 10:02:26 +0900
Johan -
I have done a similiar hotfix by using None - which I think is a
better alternative than ''.
If you want to see all of the source, download the following Product,
http://www.zope.org/Members/natsukashi/Products/CMFPropertyCore, and
look inside the file CMFPropertyCore/LinkPropertyManager.py
1) I created my own converter functions and simply call the real
function if the value is not none. Here is an excerpt from a file
called LinkPropertyManager.py:
from OFS.PropertyManager import PropertyManager
from ZPublisher import Converters
class LinkPropertyManager(PropertyManager):
def field2float(v):
if not v:
return None
else:
return Converters.field2float(v)
def field2int(v):
if not v:
return None
else:
return Converters.field2int(v)
def field2long(v):
if not v:
return None
else:
return Converters.field2long(v)
def field2date(v):
if not v:
return None
else:
return Converters.field2date(v)
def field2link(v):
if hasattr(v,'read'): v=v.read()
else: v=str(v)
return v
type_converters = Converters.type_converters
type_converters.update({'float' : field2float
, 'int' : field2int
, 'long' : field2long
, 'date' : field2date
, 'link' : field2link
})
PropertyManager.type_converters = LinkPropertyManager.type_converters
2) Since you are patching the type converter, you might as well patch
the manage_propertiesForm. This can be done by hotfixing the
OFS.PropertyManager.PropertyManager.manage_propertiesForm value with
your own dtml file.
Here is a diff between the CMFPropertyCore/dtml/properties.dtml file
and zope's properties.dtml file.
bash$ diff -c properties.dtml
/opt/arseed/tfs-lib/zope/zope-2.4.1/lib/python/OFS/dtml/properties.dtml
*** properties.dtml Thu Aug 9 10:41:41 2001
---
/opt/arseed/tfs-lib/zope/zope-2.4.1/lib/python/OFS/dtml/properties.dtml
Wed Oct 3 07:49:38 2001
***************
*** 58,74 ****
<dtml-if "type == 'int'">
<input type="text" name="<dtml-var id>:<dtml-var
type>" size="35" value="<dtml-if "hasProperty(id)"><dtml-var
! "'%s' % (getProperty(id) or '')" html_quote></dtml-if>">
<dtml-elif "type == 'long'">
<input type="text" name="<dtml-var id>:<dtml-var type>" size="35"
value="<dtml-if "hasProperty(id)"><dtml-var
! "('%s' % (getProperty(id) or ''))[:-1]" html_quote></dtml-if>">
<dtml-elif "type in ('float', 'date')">
<input type="text" name="<dtml-var id>:<dtml-var type>" size="35"
! value="<dtml-var "getProperty(id)" html_quote null="">">
<dtml-elif "type=='string'">
<input type="text" name="<dtml-var id>:string" size="35"
! value="<dtml-var "getProperty(id)" html_quote null="">">
<dtml-elif "type=='boolean'">
<input type="checkbox" name="<dtml-var id>:boolean" size="35"
<dtml-if "getProperty(id)">CHECKED</dtml-if>>
--- 58,74 ----
<dtml-if "type == 'int'">
<input type="text" name="<dtml-var id>:<dtml-var
type>" size="35" value="<dtml-if "hasProperty(id)"><dtml-var
! "'%s' % getProperty(id)" html_quote></dtml-if>">
<dtml-elif "type == 'long'">
<input type="text" name="<dtml-var id>:<dtml-var type>" size="35"
value="<dtml-if "hasProperty(id)"><dtml-var
! "('%s' % getProperty(id))[:-1]" html_quote></dtml-if>">
<dtml-elif "type in ('float', 'date')">
<input type="text" name="<dtml-var id>:<dtml-var type>" size="35"
! value="<dtml-var "getProperty(id)" html_quote>">
<dtml-elif "type=='string'">
<input type="text" name="<dtml-var id>:string" size="35"
! value="<dtml-var "getProperty(id)" html_quote>">
<dtml-elif "type=='boolean'">
<input type="checkbox" name="<dtml-var id>:boolean" size="35"
<dtml-if "getProperty(id)">CHECKED</dtml-if>>
***************
*** 77,83 ****
value="<dtml-in "getProperty(id)"><dtml-var sequence-item
html_quote> </dtml-in>">
<dtml-elif "type=='text'">
<textarea name="<dtml-var id>:text" rows="6" cols="35"><dtml-var
! "getProperty(id)" html_quote null=""></textarea>
<dtml-elif "type=='lines'">
<textarea name="<dtml-var id>:lines" rows="6" cols="35"><dtml-in
"getProperty(id)"><dtml-var sequence-item html_quote><dtml-if
--- 77,83 ----
value="<dtml-in "getProperty(id)"><dtml-var sequence-item
html_quote> </dtml-in>">
<dtml-elif "type=='text'">
<textarea name="<dtml-var id>:text" rows="6" cols="35"><dtml-var
! "getProperty(id)" html_quote></textarea>
<dtml-elif "type=='lines'">
<textarea name="<dtml-var id>:lines" rows="6" cols="35"><dtml-in
"getProperty(id)"><dtml-var sequence-item html_quote><dtml-if
***************
*** 91,97 ****
<dtml-in "getProperty(select_variable)">
<option
<dtml-if
"_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
! ><dtml-var sequence-item html_quote null="" ></option>
</dtml-in>
</select>
</div>
--- 91,97 ----
<dtml-in "getProperty(select_variable)">
<option
<dtml-if
"_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
! ><dtml-var sequence-item html_quote></option>
</dtml-in>
</select>
</div>
***************
*** 101,107 ****
<dtml-in "_[select_variable]">
<option
<dtml-if
"_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
! ><dtml-var sequence-item html_quote null="" ></option>
</dtml-in>
</select>
</div>
--- 101,107 ----
<dtml-in "_[select_variable]">
<option
<dtml-if
"_['sequence-item']==getProperty(id)">SELECTED</dtml-if>
! ><dtml-var sequence-item html_quote></option>
</dtml-in>
</select>
</div>
***************
*** 121,127 ****
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in
getProperty(id))"
> SELECTED</dtml-if
! >><dtml-var sequence-item html_quote null=""></option>
</dtml-in>
</select>
</div>
--- 121,127 ----
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in
getProperty(id))"
> SELECTED</dtml-if
! >><dtml-var sequence-item html_quote></option>
</dtml-in>
</select>
</div>
***************
*** 133,139 ****
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in
getProperty(id))"
> SELECTED</dtml-if
! >><dtml-var sequence-item html_quote null=""></option>
</dtml-in>
</select>
</div>
--- 133,139 ----
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in
getProperty(id))"
> SELECTED</dtml-if
! >><dtml-var sequence-item html_quote></option>
</dtml-in>
</select>
</div>
***************
*** 142,156 ****
No value for <dtml-var select_variable>.
</div>
</dtml-if>
- <dtml-elif "type=='link'">
- <input type="text" name="<dtml-var id>:string" size="35"
- value="<dtml-var "getProperty(id)[1]" html_quote null="">">
<dtml-else>
<em>Unknown property type</em>
</dtml-if>
<dtml-else>
<table border="1">
! <tr><td><dtml-var "getProperty(id)" html_quote null=""></td></tr>
</table>
</dtml-if>
</td>
--- 142,153 ----
No value for <dtml-var select_variable>.
</div>
</dtml-if>
<dtml-else>
<em>Unknown property type</em>
</dtml-if>
<dtml-else>
<table border="1">
! <tr><td><dtml-var "getProperty(id)" html_quote></td></tr>
</table>
</dtml-if>
</td>
At Wed, 3 Oct 2001 17:06:24 +0200,
Johan Carlsson wrote:
>
> Hi,
> We currently want to use date-properties in the regular property sheet.
> The current date-property doesn't accept an empty value.
> We want to be able to submit an empty string and set a NullDate value
> indicating. Also a NullDate value should return an empty string when the
> "manage_propertiesForm" is rendered, e.g. showing an empty field.
>
> We have currently chosen a empty string "", to represent the NullDate value.
> (We haven't found any NullDate representation in DateTime and have concluded
> that it doesn't exist?)
> Choosing None as the NullDate value would have been preferred but it
> generates
> issues with the rendering of "manage_propertiesForm".
>
>
> Question:
>
> Is there anything better then an empty string for the NullDate value?
>
> Best Regards,
> Johan Carlsson
> www.torped.se
>
>
> [Here's our hot-patch]
>
> from ZPublisher import Converters
>
> def fixedfield2date(v):
> print "Fixed field2date conversion", fixedfield2date, v
> from DateTime import DateTime
> if hasattr(v,'read'): v=v.read()
> else: v=str(v)
> if v=='':
> return v
> return DateTime(v)
>
> Converters.field2date = fixedfield2date
> Converters.type_converters['date'] = fixedfield2date
>
> print "ZPublisher.Converters.field2date patched."
>
>
>
>
> _______________________________________________
> Zope-Dev maillist - Zope-Dev@zope.org
> http://lists.zope.org/mailman/listinfo/zope-dev
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://lists.zope.org/mailman/listinfo/zope-announce
> http://lists.zope.org/mailman/listinfo/zope )
>