Commit 4196f160 authored by Jim Fulton's avatar Jim Fulton

Many cleanups and additions

parent b7c2b37e
......@@ -93,7 +93,7 @@ class ZClassBasicSheet(OFS.PropertySheets.PropertySheet,
"""Provide management view for item classes
"""
index_html=Globals.HTMLFile('itemProp', globals())
manage=Globals.HTMLFile('itemProp', globals())
def manage_edit(self, meta_type='', icon='', file='', REQUEST=None):
"""Set basic item properties.
"""
......@@ -114,10 +114,10 @@ class ZClassBasicSheet(OFS.PropertySheets.PropertySheet,
if icon: self.setClassAttr('icon', icon)
self.setClassAttr('icon', icon)
if REQUEST is not None:
return self.index_html(
return self.manage(
self, REQUEST,
manage_tabs_message='Basic properties changed')
......@@ -134,38 +134,97 @@ class ZClassViewsSheet(OFS.PropertySheets.PropertySheet,
"""
def data(self):
klass=self.aq_inner.aq_parent.aq_parent._zclass_
return map(lambda d: (d['label'], (d['action'],)),
klass.manage_options)
index_html=Globals.HTMLFile('method_select', globals(),
selectops='')
def manage_edit(self, REQUEST, names=[], newname='', newmethods=[]):
" "
data=[]
for i in range(len(names)):
name=names[i]
methods=REQUEST.get('methods%s' % i, None)
if methods: data.append((name, tuple(methods)))
if newname and newmethods:
data.append((newname, tuple(newmethods)))
__traceback_info__=data
ddata=map(lambda i:
{'label': i[0], 'action': i[1][0]},
data)
self.setClassAttr('manage_options', ddata)
return self.getClassAttr('manage_options',(),1)
manage=Globals.HTMLFile('views', globals())
def manage_edit(self, actions=[], REQUEST=None):
"Change view actions"
options=self.data()
changed=0
if len(actions)!=len(options):
raise 'Bad Request', 'wrong number of actions'
for i in range(len(actions)):
if options[i]['action'] != actions[i]:
options[i]['action'] = actions[i]
changed=1
if changed:
self.setClassAttr('manage_options', options)
message='The changes were saved.'
else:
message='No changes were required.'
if REQUEST is not None:
return self.manage(
self, REQUEST, manage_tabs_message=message)
def manage_delete(self, selected=[], REQUEST=None):
"Delete one or more views"
options=self.data()
newoptions=filter(
lambda d, selected=selected:
d['label'] not in selected,
options)
if len(options) != len(newoptions):
self.setClassAttr('manage_options', tuple(newoptions))
message='Views deleted'
else:
message='No views were selected for deletion'
if REQUEST is not None:
return self.manage(
self, REQUEST, manage_tabs_message=message)
def manage_add(self, label, action, REQUEST=None):
"Add a view"
options=self.data()
for option in options:
if option['label']==label:
raise 'Bad Request', (
'Please provide a <strong>new</strong> label.'
)
self.setClassAttr('manage_options',
tuple(options)+({'label': label, 'action': action},))
if REQUEST is not None:
return self.manage(
self, REQUEST,
manage_tabs_message='View %s has been added' % label)
def manage_first(self, selected=[], REQUEST=None):
"Make some views first"
options=self.data()
if not selected:
message="No views were selected to be made first."
elif len(selected)==len(options):
message="Making all views first has no effect."
else:
options=self.data()
options=tuple(
filter(lambda option, selected=selected:
option['label'] in selected,
options)
+
filter(lambda option, selected=selected:
option['label'] not in selected,
options)
)
self.setClassAttr('manage_options', options)
message="Views were rearranged as requested."
if REQUEST is not None:
return self.manage(
self, REQUEST, manage_tabs_message=message)
return self.index_html(self, REQUEST)
class ZClassPermissionsSheet(OFS.PropertySheets.PropertySheet,
OFS.PropertySheets.View):
"Manage class permissions"
index_html=Globals.HTMLFile('classPermissions', globals())
manage=Globals.HTMLFile('classPermissions', globals())
def manage_edit(self, REQUEST, selected=[], newPermission=''):
def manage_delete(self, selected=[], REQUEST=None):
"Remove some permissions"
perms=self.classDefinedPermissions()
changed=0
......@@ -175,6 +234,24 @@ class ZClassPermissionsSheet(OFS.PropertySheets.PropertySheet,
perms.remove(s)
changed=1
else: message.append('Invalid permission: %s' % s)
if changed:
self.setClassAttr(
'__ac_permissions__',
tuple(map(lambda p: (p,()), perms))
)
else:
message.append('Permissions are unchanged.')
if message: message=join(message, '<br>\n')
return self.manage(self, REQUEST, manage_tabs_message=message)
def manage_add(self, REQUEST, newPermission=''):
"Remove some permissions"
perms=self.classDefinedPermissions()
changed=0
message=[]
newPermission=strip(newPermission)
if newPermission:
......@@ -192,7 +269,6 @@ class ZClassPermissionsSheet(OFS.PropertySheets.PropertySheet,
else:
message.append('Permissions are unchanged.')
if message: message=join(message, '<br>\n')
return self.index_html(self, REQUEST, manage_tabs_message=message)
return self.manage(self, REQUEST, manage_tabs_message=message)
......@@ -107,7 +107,7 @@ class ZClassMethodsSheet(OFS.PropertySheets.PropertySheet,
def meta_type(self):
return self.aq_inner.aq_parent.aq_parent.meta_type
def index_html(self, REQUEST):
def manage(self, REQUEST):
" "
return self.manage_main(self, REQUEST)
......
"""Object-manager mix-in for ZClasses
"""
import OFS.ObjectManager, Globals
class SubobjectsSheet(OFS.PropertySheets.PropertySheet,
OFS.PropertySheets.View):
"""Provide management view for selecting sub-objects.
"""
manage=Globals.HTMLFile('subobjects', globals())
def possible_meta_types(self):
return self.aq_acquire('_product_meta_types')
def selected_meta_types(self):
return map(lambda v: v['name'], self.getClassAttr('meta_types',()))
def manage_edit(self, meta_types=(), isFolderish=None, REQUEST=None):
"Edit object management properties"
self.setClassAttr('meta_types', filter(
lambda d, m=meta_types: d['name'] in m,
self.possible_meta_types()
))
self.setClassAttr('isPrincipiaFolderish', isFolderish)
if REQUEST is not None:
return self.manage(
self, REQUEST,
manage_tabs_message='Changes were applied'
)
def isFolderish(self): return self.getClassAttr('isPrincipiaFolderish', 0)
class ZObjectManagerPropertySheets(OFS.PropertySheets.PropertySheets):
subobjects=SubobjectsSheet('subobjects')
class ObjectManager(OFS.ObjectManager.ObjectManager):
def all_meta_types(self):
return self.meta_types
class ZObjectManager:
"""Mix-in for Object Management
"""
_zclass_=ObjectManager
propertysheets=ZObjectManagerPropertySheets()
manage_options=(
{'label': 'Subobjects', 'action' :'propertysheets/subobjects'},
)
......@@ -105,7 +105,7 @@ class ZCommonSheet(OFS.PropertySheets.PropertySheet, OFS.SimpleItem.Item):
_properties=()
manage_options=(
{'label':'Properties', 'action':'manage_propertiesForm'},
{'label':'Properties', 'action':'manage'},
)
def __init__(self, id, title):
......@@ -159,7 +159,7 @@ class ZInstanceSheetsSheet(OFS.PropertySheets.View,
action='manage_addCommonSheetForm'),
)
index_html=Globals.HTMLFile('OFS/main')
manage=Globals.HTMLFile('OFS/main')
manage_addCommonSheetForm=Globals.HTMLFile('addCommonSheet', globals())
def manage_addCommonSheet(self, id, title, REQUEST=None):
......
......@@ -85,7 +85,7 @@
"""Zope Classes
"""
import Globals, string, OFS.SimpleItem, OFS.PropertySheets
import Method, Basic, Property
import Method, Basic, Property, ObjectManager, AccessControl.Role
from ZPublisher.mapply import mapply
from ExtensionClass import Base
......@@ -93,7 +93,8 @@ from App.FactoryDispatcher import FactoryDispatcher
from ComputedAttribute import ComputedAttribute
builtins=(
#('OFS.SimpleItem Item', 'Minimal Item', ZItem.ZItem),
('ObjectManager ObjectManager', 'Object Manager',
ObjectManager.ZObjectManager),
)
builtin_classes={}
builtin_names={}
......@@ -107,11 +108,11 @@ class PersistentClass(Base):
manage_addZClassForm=Globals.HTMLFile(
'addZClass', globals(), default_class_='OFS.SimpleItem Item')
def manage_addZClass(self, id, title='', base=[], REQUEST=None):
def manage_addZClass(self, id, title='', baseclasses=[], REQUEST=None):
"""Add a Z Class
"""
bases=[]
for b in base:
for b in baseclasses:
if builtin_classes.has_key(b): bases.append(builtin_classes[b])
else: bases.append(getattr(self, b))
......@@ -120,7 +121,7 @@ def manage_addZClass(self, id, title='', base=[], REQUEST=None):
def manage_subclassableClassNames(self):
r={}
#r.update(builtin_names)
r.update(builtin_names)
while 1:
if not hasattr(self, 'objectItems'): break
......@@ -183,8 +184,10 @@ class ZClass(OFS.SimpleItem.SimpleItem):
for z in bases:
args.append(z._zclass_)
zbases.append(z)
zsheets_classes.append(z.propertysheets.__class__)
csheets_classes.append(z._zclass_.propertysheets.__class__)
try: zsheets_classes.append(z.propertysheets.__class__)
except AttributeError: pass
try: csheets_classes.append(z._zclass_.propertysheets.__class__)
except AttributeError: pass
args.append(OFS.SimpleItem.SimpleItem)
zsheets_classes.append(ZClassSheets)
......@@ -194,8 +197,8 @@ class ZClass(OFS.SimpleItem.SimpleItem):
if len(zsheets_classes) > 2:
zsheets_class=type(PersistentClass)(
id+'_ZPropertySheetsClass',
tuple(zsheets_classes),
PersistentClassDict())
tuple(zsheets_classes)+(Globals.Persistent,),
PersistentClassDict(id+'_ZPropertySheetsClass'))
else: zsheets_class=zsheets_classes[1]
self.propertysheets=sheets=zsheets_class()
......@@ -239,7 +242,7 @@ class ZClass(OFS.SimpleItem.SimpleItem):
"""Create Z instance
"""
i=mapply(self._zclass_, (), REQUEST)
if not hasattr(i, 'id'): i.id=id
if not hasattr(i, 'id') or not i.id: i.id=id
folder=durl=None
if hasattr(self, 'Destination'):
......@@ -259,10 +262,6 @@ class ZClass(OFS.SimpleItem.SimpleItem):
__call__=index_html
def zclass_builtins(self):
r=find_builtins(self._zclass_).keys()
r.sort()
def zclass_candidate_view_actions(self):
r={}
......@@ -278,17 +277,20 @@ class ZClass(OFS.SimpleItem.SimpleItem):
# OK, now add our property sheets.
for id in self.propertysheets.common.objectIds():
r['propertysheets/%s/manage_propertiesForm' % id]=1
r['propertysheets/%s/manage' % id]=1
r=r.keys()
r.sort()
return r
def getClassAttr(self, name, default=_marker):
if default is _marker: return self._zclass_.__dict__[name]
try: return self._zclass_.__dict__[name]
except KeyError: return default
def getClassAttr(self, name, default=_marker, inherit=0):
if default is _marker:
if inherit: return getattr(self._zclass_, name)
else: return self._zclass_.__dict__[name]
try:
if inherit: return getattr(self._zclass_, name)
else: return self._zclass_.__dict__[name]
except: return default
def setClassAttr(self, name, value):
c=self._zclass_
......@@ -308,7 +310,17 @@ class ZClass(OFS.SimpleItem.SimpleItem):
c=self._zclass_
r=[]
a=r.append
for name, who_cares in c.__ac_permissions__: a(name)
for p in c.__ac_permissions__: a(p[0])
r.sort()
return r
def classInheritedPermissions(self):
c=self._zclass_
d={}
for p in c.__ac_permissions__: d[p[0]]=None
r=[]
a=r.append
for p in AccessControl.Role.gather_permissions(c, [], d): a(p[0])
r.sort()
return r
......@@ -331,11 +343,12 @@ class ZClassSheets(OFS.PropertySheets.PropertySheets):
class ZStandardSheets:
manage_options=(
{'label': 'Basic', 'action' :'propertysheets/basic'},
{'label': 'Methods', 'action' :'propertysheets/methods'},
{'label': 'Views', 'action' :'propertysheets/views'},
{'label': 'Property Sheets', 'action' :'propertysheets/common'},
{'label': 'Permissions', 'action' :'propertysheets/permissions'},
{'label': 'Basic', 'action' :'propertysheets/basic/manage'},
{'label': 'Methods', 'action' :'propertysheets/methods/manage'},
{'label': 'Views', 'action' :'propertysheets/views/manage'},
{'label': 'Property Sheets', 'action' :'propertysheets/common/manage'},
{'label': 'Permissions',
'action' :'propertysheets/permissions/manage'},
{'label': 'Security', 'action' :'manage_access'},
)
......@@ -346,15 +359,3 @@ def findActions(klass, found):
found[d['action']]=1
findActions(b, found)
except: pass
def find_builtins(klass, found=None):
if found is None: found={}
for b in klass.__bases__:
try:
for pname, actions in b.__ac_permissions__:
for action in actions:
found['action']=1
find_builtins(b, found)
except: pass
return found
......@@ -21,7 +21,7 @@
)"-->
<!--#with "_(unselected=_.reorder(all, without=selected))"-->
<FORM ACTION="." METHOD="POST"><TABLE CELLSPACING="2">
<FORM ACTION="." METHOD="GET"><TABLE CELLSPACING="2">
<TR>
<TH ALIGN="LEFT" VALIGN="TOP">Id</TH>
......
......@@ -4,27 +4,34 @@
<!--#var manage_tabs-->
<!--#/if manage_tabs-->
<form action=manage_edit>
<form action=.>
<table>
<tr><td></td><th>Permission</th></tr>
<!--#in classDefinedPermissions-->
<tr><td></td><th align=left>Permissions:</th></tr>
<!--#in classDefinedPermissions sort-->
<tr>
<td><input type=checkbox name=selected:list
value="<!--#var sequence-item-->"></td>
<td><!--#var sequence-item--></td>
</tr>
<!--#/in-->
<tr>
<td></td>
<td>New permission: <input name=newPermission></td>
</tr>
<tr>
<td></td>
<td>
<input type=submit value=" Change ">
</td>
</tr>
<tr><td></td><td>
<input type=submit value=" Delete " name="manage_delete:method">
</td></tr>
</table>
</form>
<form action=manage_add>
Add a new permission:<br>
<input name=newPermission>
<input type=submit value=" Add ">
</form>
<table>
<tr><th align=left>Inherited Permissions:</th></tr>
<!--#in classInheritedPermissions sort-->
<tr><td><em><!--#var sequence-item--></em></td></tr>
<!--#/in-->
</table>
</body></html>
<html><head><title><!--#var title_or_id--></title></head>
<body bgcolor="#FFFFFF" link="#000099" vlink="#555555">
<!--#var manage_tabs-->
<form action="manage_edit">
<table>
<tr>
<td valign=top>
Select the kinds of things<br>
that can be added to objects<br>
of this kind:
</td>
<td>
<select name="meta_types:list" size=10 multiple>
<!--#with "_(selected=selected_meta_types())"-->
<!--#in possible_meta_types mapping-->
<option
<!--#if "name in selected"-->selected<!--#/if-->
><!--#var name--></option>
<!--#/in-->
<!--#/with-->
</select>
</td>
</tr>
<tr><td colspan=2>
Objects should appear in folder lists?
<input type=checkbox name=isFolderish value="Y"
<!--#if isFolderish-->CHECKED<!--#/if-->
></td></tr>
</tr>
<tr><td colspan=2 align=center>
<input type=submit value=" Change "></td></tr>
</tr>
</table></form>
</body></html>
......@@ -2,38 +2,44 @@
<body bgcolor="#FFFFFF" link="#000099" vlink="#555555">
<!--#var manage_tabs-->
<form action="manage_edit">
<form action=".">
<table>
<!--#in data-->
<tr>
<th align=left valign=top>
<!--#var sequence-key-->
<input type=hidden name="names:list" value="<!--#var sequence-key-->">
</th>
<!--#in data mapping-->
<tr>
<td><input type=checkbox name="selected:list"
value="<!--#var label-->"></td>
<th align=left valign=top><!--#var label--></th>
<td align=left valign=top>
<!--#with "_.namespace(methods=_['sequence-item'])"-->
<select name="<!--#var "'methods%s:list' % _['sequence-index']"-->"
<!--#var selectops-->>
<!--#in zclass_candidate_view_actions-->
<option
<!--#if "_['sequence-item'] in methods"-->SELECTED
<!--#/if-->><!--#var sequence-item--></option>
<!--#/in-->
</select></td>
<!--#/with-->
</tr>
<select name="actions:list">
<!--#in zclass_candidate_view_actions-->
<option
<!--#if "_['sequence-item'] == action"-->SELECTED
<!--#/if-->><!--#var sequence-item--></option>
<!--#/in-->
</select></td>
</tr>
<!--#/in-->
<tr><td colspan=3 align=center>
<input type=submit value=" Change " name="manage_edit:method">
<input type=submit value=" Delete " name="manage_delete:method">
<input type=submit value=" First " name="manage_first:method">
</td></tr>
</table></form>
<form action=manage_add><table>
<tr>
<th align=left valign=top>New: <input type=text name="newname" size=20></th>
<th align=left valign=top>New: <input type=text name="label" size=20></th>
<td align=left valign=top>
<select name=newmethods:list <!--#var selectops-->>
<select name=action>
<!--#in zclass_candidate_view_actions-->
<option><!--#var sequence-item--></option>
<!--#/in-->
</select></td>
</tr>
<tr><td colspan=2 align=center>
<input type=submit value=" Change "></td></tr>
<input type=submit value=" Add ">
</td></tr>
</table></form>
</body></html>
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