[gen] Ensure the tool can't be deleted. [gen] Wrapper.sort can now sort according to param field.insert if sortKey is None.

This commit is contained in:
Gaetan Delannay 2015-01-08 13:18:14 +01:00
parent 90657e0faf
commit bccc9c8320
4 changed files with 26 additions and 10 deletions

View file

@ -1020,7 +1020,7 @@ class Ref(Field):
'''This method links p_value (which can be a list of objects) to p_obj '''This method links p_value (which can be a list of objects) to p_obj
through this Ref field. When linking 2 objects via a Ref, through this Ref field. When linking 2 objects via a Ref,
p_linkObject must be called twice: once on the forward Ref and once p_linkObject must be called twice: once on the forward Ref and once
on the backward ref. p_back indicates if we are calling it on the on the backward Ref. p_back indicates if we are calling it on the
forward or backward Ref. If p_noSecurity is True, we bypass security forward or backward Ref. If p_noSecurity is True, we bypass security
checks (has the logged user the right to modify this Ref field?). checks (has the logged user the right to modify this Ref field?).
If p_executeMethods is False, we do not execute methods that If p_executeMethods is False, we do not execute methods that
@ -1040,7 +1040,7 @@ class Ref(Field):
if refs == None: if refs == None:
refs = zobj.getProductConfig().PersistentList() refs = zobj.getProductConfig().PersistentList()
setattr(zobj, self.name, refs) setattr(zobj, self.name, refs)
# Insert p_value into it. # Insert p_value into it
uid = value.o.id uid = value.o.id
if uid in refs: return if uid in refs: return
# Execute self.beforeLink if present # Execute self.beforeLink if present

View file

@ -767,4 +767,8 @@ class ToolWrapper(AbstractWrapper):
'''Show this button only if a LDAP connection exists and is enabled.''' '''Show this button only if a LDAP connection exists and is enabled.'''
cfg = self.o.getProductConfig(True).ldap cfg = self.o.getProductConfig(True).ldap
if cfg and cfg.enabled: return 'view' if cfg and cfg.enabled: return 'view'
def mayDelete(self):
'''No one can delete the tool.'''
return
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View file

@ -276,7 +276,7 @@ class UserWrapper(AbstractWrapper):
def mayDelete(self): def mayDelete(self):
'''No one can delete users "system", "anon" and "admin".''' '''No one can delete users "system", "anon" and "admin".'''
if self.o.id in self.specialUsers: return if self.o.id in self.specialUsers: return
# Call custom "mayDelete" when present. # Call custom "mayDelete" when present
custom = self._getCustomMethod('mayDelete') custom = self._getCustomMethod('mayDelete')
if custom: return self._callCustom('mayDelete') if custom: return self._callCustom('mayDelete')
return True return True
@ -292,7 +292,7 @@ class UserWrapper(AbstractWrapper):
(for local users only).''' (for local users only).'''
if self.source == 'zodb': del self.o.acl_users.data[self.login] if self.source == 'zodb': del self.o.acl_users.data[self.login]
self.log('user %s deleted.' % self.login) self.log('user %s deleted.' % self.login)
# Call a custom "onDelete" if any. # Call a custom "onDelete" if any
return self._callCustom('onDelete') return self._callCustom('onDelete')
def getLogins(self, groupsOnly=False): def getLogins(self, groupsOnly=False):

View file

@ -850,15 +850,27 @@ class AbstractWrapper(object):
def sort(self, fieldName, sortKey='title', reverse=False): def sort(self, fieldName, sortKey='title', reverse=False):
'''Sorts referred elements linked to p_self via p_fieldName according '''Sorts referred elements linked to p_self via p_fieldName according
to a given p_sortKey which must be an attribute set on referred to a given p_sortKey which must be an attribute set on referred
objects ("title", by default).''' objects ("title", by default) or None. If None, default sorting will
occur, using the method stored in field.insert.'''
refs = getattr(self.o, fieldName, None) refs = getattr(self.o, fieldName, None)
if not refs: return if not refs: return
tool = self.tool tool = self.tool
# refs is a PersistentList: param "key" is not available. So perform the # refs is a PersistentList: param "key" is not available for method
# sort on the real list and then indicate that the persistent list has # "sort". So perform the sort on the real list and then indicate that
# changed (the ZODB way). # the persistent list has changed (the ZODB way).
refs.data.sort(key=lambda x: getattr(tool.getObject(x), sortKey), if not sortKey:
reverse=reverse) # Sort according to field.insert
field = self.getField(fieldName)
insertMethod = field.insert
if not insertMethod:
raise Exception('Param "insert" for Ref field %s is None.' % \
fieldName)
if not callable(insertMethod): insertMethod = insertMethod[1]
keyMethod = lambda uid: insertMethod(self, tool.getObject(uid))
else:
# Sort according to p_sortKey
keyMethod = lambda uid: getattr(tool.getObject(uid), sortKey)
refs.data.sort(key=keyMethod, reverse=reverse)
refs._p_changed = 1 refs._p_changed = 1
def create(self, fieldNameOrClass, noSecurity=False, def create(self, fieldNameOrClass, noSecurity=False,