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

Remove property management ZMI screens.

parent cab094bb
......@@ -30,6 +30,8 @@ Features Added
Restructuring
+++++++++++++
- Remove property management ZMI screens.
- Remove ZMI copy/cut/paste and re-ordering features.
- Drop `OFS.History` functionality.
......
......@@ -21,8 +21,6 @@ from AccessControl.Permissions import manage_properties
from AccessControl.SecurityInfo import ClassSecurityInfo
from Acquisition import aq_base
from ExtensionClass import Base
from App.special_dtml import DTMLFile
from App.Dialogs import MessageDialog
from zExceptions import BadRequest
from zope.interface import implements
from ZPublisher.Converters import type_converters
......@@ -77,22 +75,6 @@ class PropertyManager(Base):
Entries in the _properties structure which do not have a 'mode' key
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)
......@@ -102,15 +84,7 @@ class PropertyManager(Base):
security.setPermissionDefault(access_contents_information,
('Anonymous', 'Manager'))
manage_options = (
{'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())
manage_options = tuple()
title = ''
_properties = (
......@@ -280,8 +254,6 @@ class PropertyManager(Base):
if type in type_converters:
value = type_converters[type](value)
self._setProperty(id.strip(), value, type)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
security.declareProtected(manage_properties, 'manage_editProperties')
def manage_editProperties(self, REQUEST):
......@@ -300,10 +272,6 @@ class PropertyManager(Base):
else:
value = REQUEST.form.get(name, '')
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')
def manage_changeProperties(self, REQUEST=None, **kw):
......@@ -327,10 +295,6 @@ class PropertyManager(Base):
if 'w' not in propdict[name].get('mode', 'wd'):
raise BadRequest('%s cannot be changed' % escape(name))
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')
def manage_changePropertyTypes(self, old_ids, props, REQUEST=None):
......@@ -348,8 +312,6 @@ class PropertyManager(Base):
return
for prop in props:
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')
def manage_delProperties(self, ids=None, REQUEST=None):
......@@ -360,10 +322,7 @@ class PropertyManager(Base):
ids = None
ids = REQUEST.get('_ids', ids)
if ids is None:
return MessageDialog(
title='No property specified',
message='No properties were specified!',
action='./manage_propertiesForm')
raise BadRequest('No propery specified.')
propdict = self.propdict()
nd = self._reserved_names
for id in ids:
......@@ -371,14 +330,7 @@ class PropertyManager(Base):
raise BadRequest(
'The property <em>%s</em> does not exist' % escape(id))
if ('d' not in propdict[id].get('mode', 'wd')) or (id in nd):
return MessageDialog(
title='Cannot delete %s' % id,
message='The property <em>%s</em> '
'cannot be deleted.' % escape(id),
action='manage_propertiesForm')
raise BadRequest('Cannot delete %s' % id)
self._delProperty(id)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
InitializeClass(PropertyManager)
......@@ -19,20 +19,16 @@ import sys
from AccessControl.class_init import InitializeClass
from AccessControl.Permissions import access_contents_information
from AccessControl.Permissions import manage_properties
from AccessControl.Permissions import view_management_screens
from AccessControl.SecurityInfo import ClassSecurityInfo
from Acquisition import aq_base
from Acquisition import aq_parent
from Acquisition import Implicit
from App.Dialogs import MessageDialog
from App.Management import Tabs
from App.special_dtml import DTMLFile
from ExtensionClass import Base
from OFS import bbb
from Persistence import Persistent
from Traversable import Traversable
from zExceptions import BadRequest
from zExceptions import Redirect
from ZPublisher.Converters import type_converters
if bbb.HAS_ZSERVER:
......@@ -319,13 +315,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
dict[p['id']] = p
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')
def manage_addProperty(self, id, value, type, REQUEST=None):
"""Add a new property via the web. Sets a new property with
......@@ -333,8 +322,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if type in type_converters:
value = type_converters[type](value)
self._setProperty(id, value, type)
if REQUEST is not None:
return self.manage(self, REQUEST)
security.declareProtected(manage_properties, 'manage_editProperties')
def manage_editProperties(self, REQUEST):
......@@ -344,10 +331,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if 'w' in prop.get('mode', 'wd'):
value = REQUEST.get(name, '')
self._updateProperty(name, value)
return MessageDialog(
title='Success!',
message='Your changes have been saved',
action='manage')
security.declareProtected(manage_properties, 'manage_changeProperties')
def manage_changeProperties(self, REQUEST=None, **kw):
......@@ -369,11 +352,6 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
if 'w' not in propdict[name].get('mode', 'wd'):
raise BadRequest('%s cannot be changed' % escape(name))
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')
def manage_delProperties(self, ids=None, REQUEST=None):
......@@ -384,14 +362,9 @@ class PropertySheet(Traversable, Persistent, Implicit, DAVPropertySheetMixin):
ids = None
ids = REQUEST.get('_ids', ids)
if ids is None:
return MessageDialog(
title='No property specified',
message='No properties were specified!',
action='./manage',)
raise BadRequest('No property specified.')
for id in ids:
self._delProperty(id)
if REQUEST is not None:
return self.manage(self, REQUEST)
InitializeClass(PropertySheet)
......@@ -482,7 +455,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
if REQUEST is None:
return ps
ps = self.get(id)
REQUEST.RESPONSE.redirect('%s/manage' % ps.absolute_url())
security.declareProtected(manage_properties, 'addPropertySheet')
def addPropertySheet(self, propset):
......@@ -516,8 +488,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
raise BadRequest(
'attempt to delete undeletable property sheet: ' + id)
self.delPropertySheet(id)
if REQUEST is not None:
REQUEST.RESPONSE.redirect('%s/manage' % self.absolute_url())
def __len__(self):
return len(self.__propsets__())
......@@ -525,9 +495,6 @@ class PropertySheets(Traversable, Implicit, Tabs):
def getId(self):
return self.id
security.declareProtected(view_management_screens, 'manage')
manage = DTMLFile('dtml/propertysheets', globals())
def manage_options(self):
"""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):
Entries in the _properties structure which do not have a 'mode' key
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")
_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