Commit bb15a06f authored by Yoshinori Okuji's avatar Yoshinori Okuji

Add support for TALES expressions in _properties, _categories and...

Add support for TALES expressions in _properties, _categories and _constraints. Remove registerBaseCategories because no portal object is available at boot time.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@1838 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 821515ff
...@@ -33,7 +33,11 @@ from ZPublisher.HTTPRequest import FileUpload ...@@ -33,7 +33,11 @@ from ZPublisher.HTTPRequest import FileUpload
from Acquisition import aq_base, aq_inner, aq_parent, aq_self from Acquisition import aq_base, aq_inner, aq_parent, aq_self
from Products.CMFCore import utils from Products.CMFCore import utils
from Products.CMFCore.Expression import Expression
from Products.CMFCore.DirectoryView import registerDirectory from Products.CMFCore.DirectoryView import registerDirectory
from Products.CMFCore.utils import getToolByName
from Products.PageTemplates.Expressions import getEngine
from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.ERP5Type import Permissions from Products.ERP5Type import Permissions
from Products.ERP5Type import Constraint from Products.ERP5Type import Constraint
...@@ -325,14 +329,6 @@ def importLocalPropertySheet(class_id, path = None): ...@@ -325,14 +329,6 @@ def importLocalPropertySheet(class_id, path = None):
f = open(path) f = open(path)
module = imp.load_source(class_id, path, f) module = imp.load_source(class_id, path, f)
setattr(Products.ERP5Type.PropertySheet, class_id, getattr(module, class_id)) setattr(Products.ERP5Type.PropertySheet, class_id, getattr(module, class_id))
# Register base categories
registerBaseCategories(getattr(module, class_id))
base_category_dict = {}
def registerBaseCategories(property_sheet):
global base_category_dict
for bc in getattr(property_sheet, '_categories', ()):
base_category_dict[bc] = 1
def importLocalInterface(class_id, path = None): def importLocalInterface(class_id, path = None):
import Products.ERP5Type.Interface import Products.ERP5Type.Interface
...@@ -757,16 +753,78 @@ def setDefaultConstructor(klass): ...@@ -757,16 +753,78 @@ def setDefaultConstructor(klass):
setattr(klass, 'add' + klass.__name__, Constructor(klass)) setattr(klass, 'add' + klass.__name__, Constructor(klass))
# Creation of default property accessors and values # Creation of default property accessors and values
def initializeDefaultProperties(klasses): def initializeDefaultProperties(klasses, object=None):
""" """
Creates class attributes with a default value. Creates class attributes with a default value.
""" """
for klass in klasses: for klass in klasses:
if getattr(klass, 'isRADContent', 0): if getattr(klass, 'isRADContent', 0):
setDefaultClassProperties(klass) setDefaultClassProperties(klass)
setDefaultProperties(klass) setDefaultProperties(klass, object=object)
def createExpressionContext(object):
"""
Return a context used for evaluating a TALES expression.
"""
if object is not None:
portal = object.getPortalObject()
else:
portal = None
if object is None or not hasattr(object, 'aq_base'):
folder = portal
else:
folder = object
# Search up the containment hierarchy until we find an
# object that claims it's a folder.
while folder is not None:
if getattr(aq_base(folder), 'isPrincipiaFolderish', 0):
# found it.
break
else:
folder = aq_parent(aq_inner(folder))
if portal is not None:
pm = getToolByName(portal, 'portal_membership')
if pm.isAnonymousUser():
member = None
else:
member = pm.getAuthenticatedMember()
else:
member = None
if object is None:
object_url = ''
else:
object_url = object.absolute_url()
def setDefaultProperties(klass): if folder is None:
folder_url = ''
else:
folder_url = folder.absolute_url()
if portal is None:
portal_url = ''
else:
portal_url = portal.absolute_url()
data = {
'object_url': object_url,
'folder_url': folder_url,
'portal_url': portal_url,
'object': object,
'folder': folder,
'portal': portal,
'nothing': None,
'request': getattr( object, 'REQUEST', None ),
'modules': SecureModuleImporter,
'member': member,
}
return getEngine().getContext(data)
def setDefaultProperties(klass, object=None):
""" """
This methods sets default accessors for this object as well This methods sets default accessors for this object as well
as consistency checkers, based on the definition as consistency checkers, based on the definition
...@@ -787,6 +845,7 @@ def setDefaultProperties(klass): ...@@ -787,6 +845,7 @@ def setDefaultProperties(klass):
Set default attributes in current object for all properties in '_properties' Set default attributes in current object for all properties in '_properties'
""" """
econtext = createExpressionContext(object)
legalTypes = type_definition.keys() legalTypes = type_definition.keys()
# First build the property list from the property sheet # First build the property list from the property sheet
# and the class properties # and the class properties
...@@ -797,9 +856,35 @@ def setDefaultProperties(klass): ...@@ -797,9 +856,35 @@ def setDefaultProperties(klass):
for base in klass.property_sheets: for base in klass.property_sheets:
prop_list += base._properties prop_list += base._properties
if hasattr(base, '_categories'): if hasattr(base, '_categories'):
if type(base._categories) in (type(()), type([])):
cat_list += base._categories cat_list += base._categories
else:
cat_list += [base._categories]
if hasattr(base, '_constraints'): if hasattr(base, '_constraints'):
constraint_list += base._constraints constraint_list += base._constraints
# Evaluate TALES expressions.
for prop in prop_list:
for key,value in prop.items():
if isinstance(value, Expression):
prop[key] = value(econtext)
LOG('setDefaultProperties', 0, 'key = %r, value = %r, prop[key] = %r' % (key, value, prop[key]))
new_cat_list = []
for cat in cat_list:
if isinstance(cat, Expression):
result = cat(econtext)
if type(result) in (type(()), type([])):
new_cat_list.extend(result)
else:
new_cat_list.append(result)
else:
new_cat_list.append(cat)
cat_list = new_cat_list
for const in constraint_list:
for key,value in const.items():
if isinstance(value, Expression):
const[key] = value(econtext)
# Create default accessors for property sheets # Create default accessors for property sheets
converted_prop_list = [] converted_prop_list = []
converted_prop_keys = {} converted_prop_keys = {}
...@@ -816,9 +901,8 @@ def setDefaultProperties(klass): ...@@ -816,9 +901,8 @@ def setDefaultProperties(klass):
for cat in cat_list: for cat in cat_list:
createCategoryAccessors(klass, cat) createCategoryAccessors(klass, cat)
createValueAccessors(klass, cat) createValueAccessors(klass, cat)
if klass.__name__ == "Base": # XXX use if possible is and real class if object is not None and klass.__name__ == "Base": # XXX use if possible is and real class
global base_category_dict for cat in object.getBaseCategoryList():
for cat in base_category_dict.keys():
createRelatedValueAccessors(klass, cat) createRelatedValueAccessors(klass, cat)
# Create the constraint method list - always check type # Create the constraint method list - always check type
klass.constraints = [Constraint.PropertyTypeValidity(id='type_check')] klass.constraints = [Constraint.PropertyTypeValidity(id='type_check')]
......
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