Commit 05c6a413 authored by Hanno Schlichting's avatar Hanno Schlichting

Remove property management ZMI screens.

parent cab094bb
...@@ -30,6 +30,8 @@ Features Added ...@@ -30,6 +30,8 @@ Features Added
Restructuring Restructuring
+++++++++++++ +++++++++++++
- Remove property management ZMI screens.
- Remove ZMI copy/cut/paste and re-ordering features. - Remove ZMI copy/cut/paste and re-ordering features.
- Drop `OFS.History` functionality. - Drop `OFS.History` functionality.
......
...@@ -21,8 +21,6 @@ from AccessControl.Permissions import manage_properties ...@@ -21,8 +21,6 @@ from AccessControl.Permissions import manage_properties
from AccessControl.SecurityInfo import ClassSecurityInfo from AccessControl.SecurityInfo import ClassSecurityInfo
from Acquisition import aq_base from Acquisition import aq_base
from ExtensionClass import Base from ExtensionClass import Base
from App.special_dtml import DTMLFile
from App.Dialogs import MessageDialog
from zExceptions import BadRequest from zExceptions import BadRequest
from zope.interface import implements from zope.interface import implements
from ZPublisher.Converters import type_converters from ZPublisher.Converters import type_converters
...@@ -77,22 +75,6 @@ class PropertyManager(Base): ...@@ -77,22 +75,6 @@ class PropertyManager(Base):
Entries in the _properties structure which do not have a 'mode' key Entries in the _properties structure which do not have a 'mode' key
are assumed to have the mode 'wd' (writeable and deleteable). are assumed to have the mode 'wd' (writeable and deleteable).
To fully support property management, including the system-provided
tabs and user interfaces for working with properties, an object which
inherits from PropertyManager should include the following entry in
its manage_options structure::
{'label':'Properties', 'action':'manage_propertiesForm',}
to ensure that a 'Properties' tab is displayed in its management
interface. Objects that inherit from PropertyManager should also
include the following entry in its __ac_permissions__ structure::
('Manage properties', ('manage_addProperty',
'manage_editProperties',
'manage_delProperties',
'manage_changeProperties',)),
""" """
implements(IPropertyManager) implements(IPropertyManager)
...@@ -102,15 +84,7 @@ class PropertyManager(Base): ...@@ -102,15 +84,7 @@ class PropertyManager(Base):
security.setPermissionDefault(access_contents_information, security.setPermissionDefault(access_contents_information,
('Anonymous', 'Manager')) ('Anonymous', 'Manager'))
manage_options = ( manage_options = tuple()
{'label': 'Properties', 'action': 'manage_propertiesForm'},
)
security.declareProtected(manage_properties, 'manage_propertiesForm')
manage_propertiesForm = DTMLFile(
'dtml/properties', globals(), property_extensible_schema__=1)
security.declareProtected(manage_properties, 'manage_propertyTypeForm')
manage_propertyTypeForm = DTMLFile('dtml/propertyType', globals())
title = '' title = ''
_properties = ( _properties = (
...@@ -280,8 +254,6 @@ class PropertyManager(Base): ...@@ -280,8 +254,6 @@ class PropertyManager(Base):
if type in type_converters: if type in type_converters:
value = type_converters[type](value) value = type_converters[type](value)
self._setProperty(id.strip(), value, type) self._setProperty(id.strip(), value, type)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
security.declareProtected(manage_properties, 'manage_editProperties') security.declareProtected(manage_properties, 'manage_editProperties')
def manage_editProperties(self, REQUEST): def manage_editProperties(self, REQUEST):
...@@ -300,10 +272,6 @@ class PropertyManager(Base): ...@@ -300,10 +272,6 @@ class PropertyManager(Base):
else: else:
value = REQUEST.form.get(name, '') value = REQUEST.form.get(name, '')
self._updateProperty(name, value) self._updateProperty(name, value)
if REQUEST:
message = "Saved changes."
return self.manage_propertiesForm(self, REQUEST,
manage_tabs_message=message)
security.declareProtected(manage_properties, 'manage_changeProperties') security.declareProtected(manage_properties, 'manage_changeProperties')
def manage_changeProperties(self, REQUEST=None, **kw): def manage_changeProperties(self, REQUEST=None, **kw):
...@@ -327,10 +295,6 @@ class PropertyManager(Base): ...@@ -327,10 +295,6 @@ class PropertyManager(Base):
if 'w' not in propdict[name].get('mode', 'wd'): if 'w' not in propdict[name].get('mode', 'wd'):
raise BadRequest('%s cannot be changed' % escape(name)) raise BadRequest('%s cannot be changed' % escape(name))
self._updateProperty(name, value) self._updateProperty(name, value)
if REQUEST:
message = "Saved changes."
return self.manage_propertiesForm(self, REQUEST,
manage_tabs_message=message)
security.declareProtected(manage_properties, 'manage_changePropertyTypes') security.declareProtected(manage_properties, 'manage_changePropertyTypes')
def manage_changePropertyTypes(self, old_ids, props, REQUEST=None): def manage_changePropertyTypes(self, old_ids, props, REQUEST=None):
...@@ -348,8 +312,6 @@ class PropertyManager(Base): ...@@ -348,8 +312,6 @@ class PropertyManager(Base):
return return
for prop in props: for prop in props:
self._setProperty(prop.new_id, prop.new_value, prop.new_type) self._setProperty(prop.new_id, prop.new_value, prop.new_type)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
security.declareProtected(manage_properties, 'manage_delProperties') security.declareProtected(manage_properties, 'manage_delProperties')
def manage_delProperties(self, ids=None, REQUEST=None): def manage_delProperties(self, ids=None, REQUEST=None):
...@@ -360,10 +322,7 @@ class PropertyManager(Base): ...@@ -360,10 +322,7 @@ class PropertyManager(Base):
ids = None ids = None
ids = REQUEST.get('_ids', ids) ids = REQUEST.get('_ids', ids)
if ids is None: if ids is None:
return MessageDialog( raise BadRequest('No propery specified.')
title='No property specified',
message='No properties were specified!',
action='./manage_propertiesForm')
propdict = self.propdict() propdict = self.propdict()
nd = self._reserved_names nd = self._reserved_names
for id in ids: for id in ids:
...@@ -371,14 +330,7 @@ class PropertyManager(Base): ...@@ -371,14 +330,7 @@ class PropertyManager(Base):
raise BadRequest( raise BadRequest(
'The property <em>%s</em> does not exist' % escape(id)) 'The property <em>%s</em> does not exist' % escape(id))
if ('d' not in propdict[id].get('mode', 'wd')) or (id in nd): if ('d' not in propdict[id].get('mode', 'wd')) or (id in nd):
return MessageDialog( raise BadRequest('Cannot delete %s' % id)
title='Cannot delete %s' % id,
message='The property <em>%s</em> '
'cannot be deleted.' % escape(id),
action='manage_propertiesForm')
self._delProperty(id) self._delProperty(id)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
InitializeClass(PropertyManager) InitializeClass(PropertyManager)
...@@ -19,20 +19,16 @@ import sys ...@@ -19,20 +19,16 @@ import sys
from AccessControl.class_init import InitializeClass from AccessControl.class_init import InitializeClass
from AccessControl.Permissions import access_contents_information from AccessControl.Permissions import access_contents_information
from AccessControl.Permissions import manage_properties from AccessControl.Permissions import manage_properties
from AccessControl.Permissions import view_management_screens
from AccessControl.SecurityInfo import ClassSecurityInfo from AccessControl.SecurityInfo import ClassSecurityInfo
from Acquisition import aq_base from Acquisition import aq_base
from Acquisition import aq_parent from Acquisition import aq_parent
from Acquisition import Implicit from Acquisition import Implicit
from App.Dialogs import MessageDialog
from App.Management import Tabs from App.Management import Tabs
from App.special_dtml import DTMLFile
from ExtensionClass import Base from ExtensionClass import Base
from OFS import bbb from OFS import bbb
from Persistence import Persistent from Persistence import Persistent
from Traversable import Traversable from Traversable import Traversable
from zExceptions import BadRequest from zExceptions import BadRequest
from zExceptions import Redirect
from ZPublisher.Converters import type_converters from ZPublisher.Converters import type_converters
if bbb.HAS_ZSERVER: if bbb.HAS_ZSERVER:
...@@ -319,13 +315,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin): ...@@ -319,13 +315,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
dict[p['id']] = p dict[p['id']] = p
return dict return dict
manage = DTMLFile('dtml/properties', globals())
security.declareProtected(manage_properties, 'manage_propertiesForm')
def manage_propertiesForm(self, URL1):
" "
raise Redirect(URL1 + '/manage')
security.declareProtected(manage_properties, 'manage_addProperty') security.declareProtected(manage_properties, 'manage_addProperty')
def manage_addProperty(self, id, value, type, REQUEST=None): def manage_addProperty(self, id, value, type, REQUEST=None):
"""Add a new property via the web. Sets a new property with """Add a new property via the web. Sets a new property with
...@@ -333,8 +322,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin): ...@@ -333,8 +322,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if type in type_converters: if type in type_converters:
value = type_converters[type](value) value = type_converters[type](value)
self._setProperty(id, value, type) self._setProperty(id, value, type)
if REQUEST is not None:
return self.manage(self, REQUEST)
security.declareProtected(manage_properties, 'manage_editProperties') security.declareProtected(manage_properties, 'manage_editProperties')
def manage_editProperties(self, REQUEST): def manage_editProperties(self, REQUEST):
...@@ -344,10 +331,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin): ...@@ -344,10 +331,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if 'w' in prop.get('mode', 'wd'): if 'w' in prop.get('mode', 'wd'):
value = REQUEST.get(name, '') value = REQUEST.get(name, '')
self._updateProperty(name, value) self._updateProperty(name, value)
return MessageDialog(
title='Success!',
message='Your changes have been saved',
action='manage')
security.declareProtected(manage_properties, 'manage_changeProperties') security.declareProtected(manage_properties, 'manage_changeProperties')
def manage_changeProperties(self, REQUEST=None, **kw): def manage_changeProperties(self, REQUEST=None, **kw):
...@@ -369,11 +352,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin): ...@@ -369,11 +352,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if 'w' not in propdict[name].get('mode', 'wd'): if 'w' not in propdict[name].get('mode', 'wd'):
raise BadRequest('%s cannot be changed' % escape(name)) raise BadRequest('%s cannot be changed' % escape(name))
self._updateProperty(name, value) self._updateProperty(name, value)
if REQUEST is not None:
return MessageDialog(
title='Success!',
message='Your changes have been saved.',
action='manage')
security.declareProtected(manage_properties, 'manage_delProperties') security.declareProtected(manage_properties, 'manage_delProperties')
def manage_delProperties(self, ids=None, REQUEST=None): def manage_delProperties(self, ids=None, REQUEST=None):
...@@ -384,14 +362,9 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin): ...@@ -384,14 +362,9 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
ids = None ids = None
ids = REQUEST.get('_ids', ids) ids = REQUEST.get('_ids', ids)
if ids is None: if ids is None:
return MessageDialog( raise BadRequest('No property specified.')
title='No property specified',
message='No properties were specified!',
action='./manage',)
for id in ids: for id in ids:
self._delProperty(id) self._delProperty(id)
if REQUEST is not None:
return self.manage(self, REQUEST)
InitializeClass(PropertySheet) InitializeClass(PropertySheet)
...@@ -482,7 +455,6 @@ class PropertySheets(Traversable, Implicit, Tabs): ...@@ -482,7 +455,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
if REQUEST is None: if REQUEST is None:
return ps return ps
ps = self.get(id) ps = self.get(id)
REQUEST.RESPONSE.redirect('%s/manage' % ps.absolute_url())
security.declareProtected(manage_properties, 'addPropertySheet') security.declareProtected(manage_properties, 'addPropertySheet')
def addPropertySheet(self, propset): def addPropertySheet(self, propset):
...@@ -516,8 +488,6 @@ class PropertySheets(Traversable, Implicit, Tabs): ...@@ -516,8 +488,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
raise BadRequest( raise BadRequest(
'attempt to delete undeletable property sheet: ' + id) 'attempt to delete undeletable property sheet: ' + id)
self.delPropertySheet(id) self.delPropertySheet(id)
if REQUEST is not None:
REQUEST.RESPONSE.redirect('%s/manage' % self.absolute_url())
def __len__(self): def __len__(self):
return len(self.__propsets__()) return len(self.__propsets__())
...@@ -525,9 +495,6 @@ class PropertySheets(Traversable, Implicit, Tabs): ...@@ -525,9 +495,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
def getId(self): def getId(self):
return self.id return self.id
security.declareProtected(view_management_screens, 'manage')
manage = DTMLFile('dtml/propertysheets', globals())
def manage_options(self): def manage_options(self):
"""Return a manage option data structure for me instance """Return a manage option data structure for me instance
""" """
......
<dtml-if management_page_charset>
<dtml-comment>
A site-global encoding specification in a property.
Note that this feature only works if there are no unicode objects
around. This means that this feature is not likely to be supported
in all future versions of zope.
</dtml-comment>
<dtml-call "REQUEST.set('management_page_charset',
_['management_page_charset'])">
<dtml-call "REQUEST.set('management_page_charset_tag','')">
<dtml-else>
<dtml-comment>
Thankfully no site-global encoding specification in a property.
We can set UTF-8, and unicode properties will work.
</dtml-comment>
<dtml-call "REQUEST.set('management_page_charset','UTF-8')">
<dtml-call "REQUEST.set('management_page_charset_tag','UTF-8:')">
</dtml-if>
<dtml-if "REQUEST.get('management_page_charset',None)=='UTF-8'">
<dtml-var "u' '">
</dtml-if>
<dtml-var manage_page_header>
<dtml-with "_(management_view='Properties')">
<dtml-var manage_tabs>
</dtml-with>
<form action="<dtml-var "REQUEST.URL1" html_quote>" method="post">
<dtml-if propertyMap>
<p class="form-help">
Properties allow you to assign simple values to Zope objects. To change
property values, edit the values and click &quot;Save Changes&quot;.
</p>
<table cellspacing="0" cellpadding="2" border="0">
<tr class="list-header">
<td align="left" valign="top" width="16">
&nbsp;
</td>
<td align="left" valign="top">
<div class="form-label">
Name
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
Value
</div>
</td>
<td align="left" valign="top">
<div class="form-label">
Type
</div>
</td>
</tr>
<dtml-in propertyMap mapping>
<dtml-let type="not _.has_key('type') and 'string' or type"
pdesc="propertyDescription(id)"
charset_tag="REQUEST['management_page_charset_tag']">
<tr title="&dtml-pdesc;">
<td align="left" valign="top" width="16">
<dtml-if "'d' in _['sequence-item'].get('mode', 'awd')">
<input type="checkbox" name="_ids:&dtml-charset_tag;string:list"
value="&dtml-id;" id="cb-&dtml-id;" />
<dtml-else>
</dtml-if>
</td>
<td align="left" valign="top">
<div class="form-label">
<dtml-if "'d' in _['sequence-item'].get('mode', 'awd')">
<label for="cb-&dtml-id;">
<dtml-else>
<label>
</dtml-if>
<dtml-var "propertyLabel(id)" html_quote></label>
</div>
</td>
<td align="left" valign="top">
<dtml-if "'w' in _['sequence-item'].get('mode', 'awd')">
<dtml-if "type == 'int'">
<input type="text" name="&dtml-id;:&dtml-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-id;:&dtml-type;" size="35"
value="<dtml-if "hasProperty(id)"><dtml-var
"('%s' % getProperty(id))" html_quote></dtml-if>" />
<dtml-elif "type == 'date' and not _.same_type(getProperty(id), '')
and getProperty(id).timezoneNaive()">
<input type="text" name="&dtml-id;:&dtml-charset_tag;&dtml-type;" size="35"
value="<dtml-var "str(getProperty(id)).rsplit(' ', 1)[0]" html_quote>" />
<dtml-elif "type in ['date', 'float', 'string', 'ustring']">
<input type="text" name="&dtml-id;:&dtml-charset_tag;&dtml-type;" size="35"
value="<dtml-var "getProperty(id)" html_quote>" />
<dtml-elif "type=='boolean'">
<input type="checkbox" name="&dtml-id;:&dtml-type;" size="35"
<dtml-if "getProperty(id)">checked="checked"</dtml-if> />
<dtml-elif "type in ['tokens','utokens']">
<input type="text" name="&dtml-id;:&dtml-charset_tag;&dtml-type;" size="35"
value="<dtml-in "getProperty(id)">&dtml-sequence-item; </dtml-in>" />
<dtml-elif "type in ['text','utext']">
<textarea class="form-element" name="&dtml-id;:&dtml-charset_tag;&dtml-type;"
rows="6" cols="35"><dtml-var "getProperty(id)" html_quote></textarea>
<dtml-elif "type in ['lines','ulines']">
<textarea class="form-element" name="&dtml-id;:&dtml-charset_tag;&dtml-type;"
rows="6" cols="35"><dtml-in "getProperty(id)">&dtml-sequence-item;<dtml-if
sequence-end><dtml-else><dtml-var "'\n'"></dtml-if></dtml-in></textarea>
<dtml-elif "type=='selection'">
<dtml-if "hasProperty(select_variable)">
<div class="form-element">
<select name="&dtml-id;:&dtml-charset_tag;text">
<dtml-in "getProperty(select_variable)">
<option
<dtml-if "_['sequence-item']==getProperty(id)">selected="selected"</dtml-if>
>&dtml-sequence-item;</option>
</dtml-in>
</select>
</div>
<dtml-elif "_.has_key(select_variable)">
<div class="form-element">
<select name="&dtml-id;:&dtml-charset_tag;text">
<dtml-in "_[select_variable]">
<option
<dtml-if "_['sequence-item']==getProperty(id)">selected="selected"</dtml-if>
>&dtml-sequence-item;</option>
</dtml-in>
</select>
</div>
<dtml-else>
<div class="form-text">
No value for &dtml-select_variable;.
</div>
</dtml-if>
<dtml-elif "type=='multiple selection'">
<dtml-if "hasProperty(select_variable)">
<div class="form-element">
<select name="&dtml-id;:&dtml-charset_tag;list:string" multiple="multiple"
size="<dtml-var "_.min(7, _.len(getProperty(select_variable)))">">
<dtml-in "getProperty(select_variable)">
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in getProperty(id))"
> selected="selected"</dtml-if
>>&dtml-sequence-item;</option>
</dtml-in>
</select>
</div>
<dtml-elif "_.has_key(select_variable)">
<div class="form-element">
<select name="&dtml-id;:&dtml-charset_tag;list:string" multiple="multiple"
size="<dtml-var "_.min(7, _.len(_[select_variable]))">">
<dtml-in "_[select_variable]">
<option<dtml-if
"getProperty(id) and (_['sequence-item'] in getProperty(id))"
> selected="selected"</dtml-if
>>&dtml-sequence-item;</option>
</dtml-in>
</select>
</div>
<dtml-else>
<div class="form-text">
No value for &dtml-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>
<td align="left" valign="top">
<div class="list-item">
&dtml-type;
</div>
</td>
<dtml-if "id=='title' and 'd' in _['sequence-item'].get('mode', 'awd')">
<td align="center" valign="top">
<div class="list-item"><b>Warning:</b> be aware that removing 'title'
without re-adding it might be dangerous.</div>
</td>
</dtml-if>
</tr>
</dtml-let>
</dtml-in>
<tr>
<td colspan="2">&nbsp;</td>
<td align="left" valign="top">
<div class="form-element">
<input name="manage_editProperties:method" type="submit"
class="form-element" value="Save Changes" />
<dtml-if property_extensible_schema__>
<input name="manage_delProperties:method" type="submit"
class="form-element" value="Delete" />
</div>
</td>
<td>
<dtml-comment>
This needs some community review before exposing it officially.
<input type="submit" name="manage_propertyTypeForm:method"
class="form-element" value="Change Names/Types" />
</dtml-comment>
</td>
<dtml-else>
</div>
</td>
<td>&nbsp;</td>
</dtml-if>
</tr>
</table>
<dtml-else>
<p class="form-help">
Properties allow you to assign simple values to Zope objects. There are
currently no properties defined for this item. <dtml-if
property_extensible_schema__>To add a property, enter a name, type
and value and click the &quot;Add&quot; button.
</dtml-if>
</p>
</dtml-if>
</form>
<dtml-if property_extensible_schema__>
<form action="<dtml-var "REQUEST.URL1" html_quote>/manage_addProperty"
method="post">
<p class="form-help">
To add a new property, enter a name, type and value for the new
property and click the &quot;Add&quot; button.
</p>
<table>
<tr>
<td align="left" valign="top">
<div class="form-label">
Name
</div>
</td>
<td align="left" valign="top">
<input type="text" name="id:<dtml-var
"REQUEST['management_page_charset_tag']">string"
size="30" value="" />
</td>
<td align="left" valign="top" class="form-label">
Type
</td>
<td align="left" valign="top">
<div class="form-element">
<select name="type">
<option>boolean</option>
<option>date</option>
<option>float</option>
<option>int</option>
<option>lines</option>
<option>long</option>
<option selected="selected">string</option>
<option>text</option>
<option>tokens</option>
<dtml-if "REQUEST['management_page_charset'] == 'UTF-8'">
<option>ulines</option>
<option>ustring</option>
<option>utext</option>
<option>utokens</option>
</dtml-if>
<option>selection</option>
<option>multiple selection</option>
</select>
</div>
</td>
</tr>
<tr>
<td align="left" valign="top">
<div class="form-label">
Value
</div>
</td>
<td colspan="2" align="left" valign="top">
<dtml-if "REQUEST['management_page_charset'] == 'UTF-8'">
<input type="text" name="value:UTF-8:ustring" size="30" />
<dtml-else>
<input type="text" name="value:string" size="30" />
</dtml-if>
</td>
<td align="right" valign="top">
<div class="form-element">
<input class="form-element" type="submit" name="submit" value=" Add " />
</div>
</td>
</tr>
</table>
</form>
</dtml-if>
<dtml-var manage_page_footer>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<title>Change Property Types</title>
</head>
<body bgcolor="#FFFFFF" link="#000099" vlink="#555555">
<dtml-var manage_tabs>
<dtml-unless props>
<dtml-if ids>
<dtml-call expr="REQUEST.set('props', [])">
<dtml-call expr="REQUEST.set('old_ids', ids)">
<dtml-in propertyMap mapping>
<dtml-if expr="id in ids">
<dtml-call expr="props.append({'new_id': propertyLabel(id),
'new_type': type, 'new_value': getProperty(id),
'was_seq': type in ('tokens', 'lines', 'multiple selection')})">
</dtml-if>
</dtml-in>
</dtml-if>
</dtml-unless>
<form action="<dtml-var "REQUEST.URL1" html_quote>" method="POST">
<dtml-if old_ids>
<p>
To change property names and values, edit them and click
&quot;Save Changes&quot;. To edit properties using their new type,
select the new types and click &quot;Edit with new Types&quot;
</p>
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td><b>Property Name</b></td>
<td><b>Value</b></td>
<td><b>New Type</b></td>
</tr>
<dtml-in old_ids>
<input type="hidden" name="old_ids:list" value="&dtml-sequence-item;">
</dtml-in>
<dtml-in props mapping>
<dtml-if expr="new_type in ('tokens', 'lines', 'multiple selection')">
<input type="hidden" name="props.was_seq:records" value="1">
<dtml-else>
<input type="hidden" name="props.was_seq:records" value="">
</dtml-if>
<dtml-let value_name="'props.new_value:' + {'multiple selection': 'list',
'selection': 'string'}.get(new_type, new_type) + ':records'">
<tr>
<td align="left" valign="top">
<input type="text" name="props.new_id:records" value="&dtml-new_id;">
</td>
<td align="left" valign="top">
<dtml-if expr="new_type in ('int', 'long', 'float', 'date', 'string', 'tokens')">
<input type="text" name="&dtml-value_name;" size="35"
<dtml-if was_seq>
value="<dtml-in new_value>&dtml-sequence-item; </dtml-in>"
<dtml-elif expr="new_type=='long'">
value="<dtml-var expr="_.str(getProperty(id))[:-1]" html_quote>"
<dtml-else>
value="&dtml-new_value;"
</dtml-if>>
<dtml-elif "new_type=='boolean'">
<input type="checkbox" name="&dtml-value_name;" size="35"
<dtml-if new_value>CHECKED</dtml-if>>
<dtml-elif "new_type in ('text', 'lines')">
<textarea name="&dtml-value_name;" rows="6" cols="35"><dtml-if was_seq><dtml-in
new_value>&dtml-sequence-item;<dtml-unless
sequence-end><dtml-var expr="'\n'"></dtml-unless></dtml-in><dtml-else>&dtml-new_value;</dtml-if></textarea>
<dtml-elif "new_type=='selection'">
<dtml-if "_.has_key(select_variable)">
<select name="&dtml-value_name;">
<dtml-in "_[select_variable]">
<option
<dtml-if "_['sequence-item']==new_value">SELECTED</dtml-if>
>&dtml-sequence-item;</option>
</dtml-in>
</select>
<dtml-else>
No value for &dtml-select_variable;.
</dtml-if>
<dtml-elif "new_type=='multiple selection'">
<dtml-if "_.has_key(select_variable)">
<select name="&dtml-value_name;" multiple
size="<dtml-var "_.min(7, _.len(_[select_variable]))">">
<dtml-in "_[select_variable]">
<option<dtml-if
"_['sequence-item'] in new_value"> SELECTED</dtml-if
>>&dtml-sequence-item;</option>
</dtml-in>
</select>
<dtml-else>
No value for &dtml-select_variable;.
</dtml-if>
<dtml-else>
<em>Unknown property type</em>
</dtml-if>
</td>
<td>
<select name="props.new_type:records">
<dtml-in expr="('boolean', 'date', 'float', 'int', 'lines', 'long', 'string'
, 'text', 'tokens', 'selection', 'multiple selection')">
<dtml-let SELECTED="('', 'SELECTED')[new_type==_['sequence-item']]">
<option &dtml-SELECTED;>&dtml-sequence-item;</option>
</dtml-let>
</dtml-in>
</select>
</dtml-let>
</td>
</tr>
</dtml-in>
<tr>
<td align="left" valign="top" width="16">
</td>
<td align="left" valign="top" colspan="2">
<input type="submit" name="manage_changePropertyTypes:method"
value="Save Changes">
<input type="submit" name="manage_propertyTypeForm:method"
value="Edit with new Types">
</td>
</tr>
</table>
<dtml-else>
<p>
No properties were selected for this item.
</p>
</dtml-if>
</form>
</body>
</html>
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<form action="<dtml-var "REQUEST.URL1" html_quote>" method="post">
<table cellspacing="0" cellpadding="2" border="0">
<dtml-in items sort>
<dtml-with "_(REQUEST=REQUEST, item=_['sequence-item'].aq_base, isDeletable=isDeletable)" only>
<dtml-with item>
<dtml-if id>
<tr>
<td align="left" valign="top">
<dtml-if expr="isDeletable(id)"><input type=checkbox name="ids:list" value="&dtml-id;"></dtml-if>
</td>
<td align="left" valign="top">
<a href="&dtml-id;/manage">&dtml-id; <dtml-if xml_namespace>(<dtml-var xml_namespace>)</dtml-if></a>
<dtml-if locked_in_session>
<dtml-if modified_in_session>
This item has been modified in this session
<dtml-else>
This item has been modified in another session
</dtml-if>
</dtml-if>
</td>
</tr>
</dtml-if>
</dtml-with>
</dtml-with>
</dtml-in>
<tr>
<td colspan=2>
<input type="submit" name="manage_delPropertySheets:method"
class="form-element" value="Delete">
</td>
</tr>
</table>
<table cellpadding=5>
<tr>
<td><span class="form-label">Name:</span> <input name="id"></td>
<td><span class="form-label">Namespace:</span> <input name="ns"></td>
<td>
<input type="submit" name="manage_addPropertySheet:method"
class="form-element" value="Add">
</td>
</tr>
</table>
</form>
<dtml-var manage_page_footer>
...@@ -798,27 +798,8 @@ class IPropertyManager(Interface): ...@@ -798,27 +798,8 @@ class IPropertyManager(Interface):
Entries in the _properties structure which do not have a 'mode' key Entries in the _properties structure which do not have a 'mode' key
are assumed to have the mode 'wd' (writeable and deleteable). are assumed to have the mode 'wd' (writeable and deleteable).
To fully support property management, including the system-provided
tabs and user interfaces for working with properties, an object which
inherits from PropertyManager should include the following entry in
its manage_options structure::
{'label':'Properties', 'action':'manage_propertiesForm',}
to ensure that a 'Properties' tab is displayed in its management
interface. Objects that inherit from PropertyManager should also
include the following entry in its __ac_permissions__ structure::
('Manage properties', ('manage_addProperty',
'manage_editProperties',
'manage_delProperties',
'manage_changeProperties',)),
""" """
manage_propertiesForm = Attribute(""" """)
manage_propertyTypeForm = Attribute(""" """)
title = BytesLine(title=u"Title") title = BytesLine(title=u"Title")
_properties = Tuple(title=u"Properties") _properties = Tuple(title=u"Properties")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment