114 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			114 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # ------------------------------------------------------------------------------ | ||
|  | import appy.gen | ||
|  | from appy.gen.plone25.mixins import AbstractMixin | ||
|  | from appy.gen.plone25.descriptors import ArchetypesClassDescriptor | ||
|  | 
 | ||
|  | # ------------------------------------------------------------------------------ | ||
|  | class FlavourMixin(AbstractMixin): | ||
|  |     _appy_meta_type = 'flavour' | ||
|  |     def getPortalType(self, metaTypeOrAppyType): | ||
|  |         '''Returns the name of the portal_type that is based on
 | ||
|  |            p_metaTypeOrAppyType in this flavour.'''
 | ||
|  |         res = metaTypeOrAppyType | ||
|  |         isPredefined = False | ||
|  |         isAppy = False | ||
|  |         appName = self.getProductConfig().PROJECTNAME | ||
|  |         if not isinstance(res, basestring): | ||
|  |             res = ArchetypesClassDescriptor.getClassName(res) | ||
|  |             isAppy = True | ||
|  |         if res.find('Extensions_appyWrappers') != -1: | ||
|  |             isPredefined = True | ||
|  |             elems = res.split('_') | ||
|  |             res = '%s%s' % (elems[1], elems[4]) | ||
|  |         elif isAppy and issubclass(metaTypeOrAppyType, appy.gen.Tool): | ||
|  |             # This is the custom tool | ||
|  |             isPredefined = True | ||
|  |             res = '%sTool' % appName | ||
|  |         elif isAppy and issubclass(metaTypeOrAppyType, appy.gen.Flavour): | ||
|  |             # This is the custom Flavour | ||
|  |             isPredefined = True | ||
|  |             res = '%sFlavour' % appName | ||
|  |         if not isPredefined: | ||
|  |             if self.getNumber() != 1: | ||
|  |                 res = '%s_%d' % (res, self.number) | ||
|  |         return res | ||
|  | 
 | ||
|  |     def registerPortalTypes(self): | ||
|  |         '''Registers, into portal_types, the portal types which are specific
 | ||
|  |            to this flavour.'''
 | ||
|  |         i = -1 | ||
|  |         registeredFactoryTypes = self.portal_factory.getFactoryTypes().keys() | ||
|  |         factoryTypesToRegister = [] | ||
|  |         appName = self.getProductConfig().PROJECTNAME | ||
|  |         for metaTypeName in self.allMetaTypes: | ||
|  |             i += 1 | ||
|  |             portalTypeName = '%s_%d' % (metaTypeName, self.number) | ||
|  |             # If the portal type corresponding to the meta type is | ||
|  |             # registered in portal_factory (in the model: | ||
|  |             # use_portal_factory=True), we must also register the new | ||
|  |             # portal_type we are currently creating. | ||
|  |             if metaTypeName in registeredFactoryTypes: | ||
|  |                 factoryTypesToRegister.append(portalTypeName) | ||
|  |             if not hasattr(self.portal_types, portalTypeName) and \ | ||
|  |                hasattr(self.portal_types, metaTypeName): | ||
|  |                 # Indeed abstract meta_types have no associated portal_type | ||
|  |                 typeInfoName = "%s: %s (%s)" % (appName, metaTypeName, | ||
|  |                                                 metaTypeName) | ||
|  |                 self.portal_types.manage_addTypeInformation( | ||
|  |                     getattr(self.portal_types, metaTypeName).meta_type, | ||
|  |                     id=portalTypeName, typeinfo_name=typeInfoName) | ||
|  |                 # Set the human readable title explicitly | ||
|  |                 portalType = getattr(self.portal_types, portalTypeName) | ||
|  |                 portalType.title = portalTypeName | ||
|  |                 # Associate a workflow for this new portal type. | ||
|  |                 pf = self.portal_workflow | ||
|  |                 workflowChain = pf.getChainForPortalType(metaTypeName) | ||
|  |                 pf.setChainForPortalTypes([portalTypeName],workflowChain) | ||
|  |                 # Copy actions from the base portal type | ||
|  |                 basePortalType = getattr(self.portal_types, metaTypeName) | ||
|  |                 portalType._actions = tuple(basePortalType._cloneActions()) | ||
|  |                 # Copy aliases from the base portal type | ||
|  |                 portalType.setMethodAliases(basePortalType.getMethodAliases()) | ||
|  |         # Update the factory tool with the list of types to register | ||
|  |         self.portal_factory.manage_setPortalFactoryTypes( | ||
|  |             listOfTypeIds=factoryTypesToRegister+registeredFactoryTypes) | ||
|  | 
 | ||
|  |     def getClassFolder(self, className): | ||
|  |         '''Return the folder related to p_className.''' | ||
|  |         return getattr(self, className) | ||
|  | 
 | ||
|  |     def getAvailablePodTemplates(self, obj, phase='main'): | ||
|  |         '''Returns the POD templates which are available for generating a
 | ||
|  |            document from p_obj.'''
 | ||
|  |         appySelf = self._appy_getWrapper() | ||
|  |         fieldName = 'podTemplatesFor%s' % obj.meta_type | ||
|  |         res = [] | ||
|  |         podTemplates = getattr(appySelf, fieldName, []) | ||
|  |         if not isinstance(podTemplates, list): | ||
|  |             podTemplates = [podTemplates] | ||
|  |         res = [r.o for r in podTemplates if r.phase==phase] | ||
|  |         hasParents = True | ||
|  |         klass = obj.__class__ | ||
|  |         while hasParents: | ||
|  |             parent = klass.__bases__[-1] | ||
|  |             if hasattr(parent, 'wrapperClass'): | ||
|  |                 fieldName = 'podTemplatesFor%s' % parent.meta_type | ||
|  |                 podTemplates = getattr(appySelf, fieldName, []) | ||
|  |                 if not isinstance(podTemplates, list): | ||
|  |                     podTemplates = [podTemplates] | ||
|  |                 res += [r.o for r in podTemplates if r.phase==phase] | ||
|  |                 klass = parent | ||
|  |             else: | ||
|  |                 hasParents = False | ||
|  |         return res | ||
|  | 
 | ||
|  |     def getMaxShownTemplates(self, obj): | ||
|  |         attrName = 'podMaxShownTemplatesFor%s' % obj.meta_type | ||
|  |         return getattr(self, attrName) | ||
|  | 
 | ||
|  |     def getAttr(self, attrName): | ||
|  |         '''Gets on this flavour attribute named p_attrName. Useful because we
 | ||
|  |            can't use getattr directly in Zope Page Templates.''' | ||
|  |         return getattr(self, attrName, None) | ||
|  | # ------------------------------------------------------------------------------ |