[Zope] Products and clases with new attributes
Max M
maxm@mxm.dk
Mon, 07 Oct 2002 13:47:26 +0200
Antonio Beamud Montero wrote:
> Long time ago I started to develop a big product, it's under development
> now, but with some stable releases in a client. My problem is that new
> releases of a Product adds new attributes and when I upgrade de Product,
> I need to create another instance and recreate all the system, because
> old instances in the zobd haven't that attributes...
> Now, it's no problem, but when this system is in production, with
> hundred of objects... buff... How I can solve this problem...?
####################
# put this external method in the root
new_default_value = ''
objects = self.ZopeFind(self,
obj_metatypes=['big_product'], search_sub=1)
for path, obj in objects:
obj.newAttr = new_default_value
####################
If you are updating a lot of objects you should probably do partial
commits along the way or it can be rather slow. You can do it like that
new_default_value = ''
objects = self.ZopeFind(self,
obj_metatypes=['big_product'], search_sub=1)
transaction = get_transaction() # magical built in function
i = 0
for path, obj in objects:
obj.newAttr = new_default_value
if i != 0 and not i % 100: # partial commit for ever 100
transaction.commit(1)
i += 1
####################
# naturally you can generalize it a bit
def update(meta_type, updater):
"""
Finds all the objects, sub-commits and calls the updater function
on every object
"""
objects = self.ZopeFind(self, obj_metatypes=[meta_type],
search_sub=1)
transaction = get_transaction() # magical built in function
i = 0
for path, obj in objects:
updater(obj)
if i != 0 and not i % 100: # partial commit for ever 100
transaction.commit(1)
i += 1
def updater(obj):
"This updates the objects"
new_default_value = ''
obj.newAttr = new_default_value
update('big_product', updater)
regards Max M
><evolve>
> >