diff --git a/product/ERP5Type/dynamic/component_package.py b/product/ERP5Type/dynamic/component_package.py index 7bd0c1536b50a6783d764113a0e2370543b7f1e4..a5dee3b07ad354a63c178296bf1120e969bf5b54 100644 --- a/product/ERP5Type/dynamic/component_package.py +++ b/product/ERP5Type/dynamic/component_package.py @@ -114,20 +114,15 @@ class ComponentDynamicPackage(ModuleType): # Only consider modified or validated states as state transition will # be handled by component_validation_workflow which will take care of # updating the registry - try: - validation_state_tuple = component.getValidationState() - except AttributeError: - # XXX: Accessors may have not been generated yet - pass - else: - if validation_state_tuple in ('modified', 'validated'): - version = component.getVersion(validated_only=True) - # The versions should have always been set on ERP5Site property - # beforehand - if version in version_priority_set: - reference = component.getReference(validated_only=True) - self.__registry_dict[reference][version] = (component.getId(), - component._p_oid) + validation_state_tuple = component.getValidationState() + if validation_state_tuple in ('modified', 'validated'): + version = component.getVersion(validated_only=True) + # The versions should have always been set on ERP5Site property + # beforehand + if version in version_priority_set: + reference = component.getReference(validated_only=True) + self.__registry_dict[reference][version] = (component.getId(), + component._p_oid) return self.__registry_dict diff --git a/product/ERP5Type/mixin/component.py b/product/ERP5Type/mixin/component.py index 6fbaba7b8956f772c7bd1d7fcd462997dd5e12ee..5cf6561897f2e4591ca088626849077ad2a3f4c4 100644 --- a/product/ERP5Type/mixin/component.py +++ b/product/ERP5Type/mixin/component.py @@ -37,6 +37,7 @@ from Products.ERP5.mixin.property_recordable import PropertyRecordableMixin from Products.ERP5Type import Permissions from Products.ERP5Type.Base import Base from Products.ERP5Type.Accessor.Constant import PropertyGetter as ConstantGetter +from Products.ERP5Type.Accessor import Base as BaseAccessor from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage from zExceptions import Forbidden @@ -78,7 +79,7 @@ class RecordablePropertyMetaClass(ExtensionClass): setter.__name__ = accessor_name return setter - def getterWrapper(accessor_name, property_name): + def getterWrapper(accessor_name, property_name, property_getter): dictionary['security'].declareProtected(Permissions.AccessContentsInformation, accessor_name) @@ -97,17 +98,19 @@ class RecordablePropertyMetaClass(ExtensionClass): except (AttributeError, KeyError): pass - return getattr(super(ComponentMixin, self), accessor_name)() + return property_getter(self) getter.__name__ = accessor_name return getter - for property_name in dictionary['_recorded_property_name_tuple']: + for (property_name, + property_getter) in dictionary['_recorded_property_name_getter_dict'].iteritems(): setter_name = '_set' + convertToUpperCase(property_name) dictionary[setter_name] = setterWrapper(setter_name, property_name) getter_name = 'get' + convertToUpperCase(property_name) - dictionary[getter_name] = getterWrapper(getter_name, property_name) + dictionary[getter_name] = getterWrapper(getter_name, property_name, + property_getter) # docstring required for publishing any object dictionary['__doc__'] = metacls.__doc__ @@ -159,10 +162,23 @@ class ComponentMixin(PropertyRecordableMixin, Base): 'TextDocument', 'Component') - _recorded_property_name_tuple = ( - 'reference', - 'version', - 'text_content') + _recorded_property_name_getter_dict = { + 'reference': BaseAccessor.Getter('getReference', + 'reference', + 'string', + storage_id='default_reference'), + 'version': BaseAccessor.Getter('getVersion', + 'version', + 'string', + default=''), + 'text_content': BaseAccessor.Getter('getTextContent', + 'text_content', + 'string'), + 'description': BaseAccessor.Getter('getDescription', + 'description', + 'string', + default='') + } _message_reference_not_set = "Reference must be set" _message_invalid_reference = "Reference cannot end with '_version' or "\ @@ -176,6 +192,15 @@ class ComponentMixin(PropertyRecordableMixin, Base): _message_text_content_not_set = "No source code" _message_text_content_error = "Error in Source Code: ${error_message}" + security.declareProtected(Permissions.AccessContentsInformation, + 'getValidationState') + def getValidationState(self): + """ + Needed for bootstrap when the WorkflowState Accessor is not defined yet + """ + return self.workflow_history[ + 'component_validation_workflow'][-1]['validation_state'] + security.declareProtected(Permissions.ModifyPortalContent, 'checkConsistency') def checkConsistency(self, *args, **kw): """ @@ -270,7 +295,7 @@ class ComponentMixin(PropertyRecordableMixin, Base): reference, version and text_content """ if not self.checkConsistency(): - for property_name in self._recorded_property_name_tuple: + for property_name in self._recorded_property_name_getter_dict: self.clearRecordedProperty(property_name) self.validate()