From: Philippe E. <phi...@ph...> - 2005-07-26 09:58:41
|
Martin Aspeli a écrit : > Hi, > >> I'm trying to implement an auto-increment id field in my Archetype >> product. >> >> The base value is set by a configlet and stored in portal_properties. >> >> I faced those problems : >> - The default property in the schema is a value that I can't changed >> (seems to be impossible to a function as a default value) ; > > > You can set default_method, but this won't work (see below) > >> - I couldn't acces my portal_properties value within the __init__ >> method of my Archetype class ; > > > No, try manage_afterAdd() or initializeArchetype() instead; in > __init__() the object isn't yet in the ZODB, so you don't have an > acqusition context from which to find the tool. > >> I think I took wrong ways. What is the best one to do this ? > > > The id doesn't quite work this way. The object gets created in the ZODB > and needs an id for this to work. This happens before all the AT > machinery gets hold of the object, so setting a default value won't work. > > The key is generateUniqueId.py. You can either customise this script > and check the portal_type parameter to check, or add a method > generateUniqueId(portal_type) to the parent class if you have control > over this. We use this pattern in PloneSoftwareCenter, for example, to > generate version-numbers as ids for new releases. > > Martin > I customised generateUniqueId.py and It works fine. Thanks. This is my customised version (if it can help someone) : ## Script (Python) "generateUniqueId" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=type_name=None ##title= ## from DateTime import DateTime from random import random from Products.CMFCore.utils import getToolByName now=DateTime() time='%s.%s' % (now.strftime('%Y-%m-%d'), str(now.millis())[7:]) rand=str(random())[2:6] prefix='' suffix='' if type_name == "Bulletin": prefix = "BulleTin" portal = getToolByName(context, 'portal_url').getPortalObject() properties = portal.portal_properties.BaCoCe_properties id = str(properties.nobulletin) properties.manage_changeProperties( {'nobulletin':properties.nobulletin+1}) elif type_name is not None: prefix = type_name.replace(' ', '_')+'.' prefix=prefix.lower() id = prefix+time+rand+suffix return id |