[Zope3-Users] list woes

Marco Mariani marco at sferacarta.com
Mon Jun 12 18:16:53 EDT 2006


I'm having this stripped-down use case.



class IToy(Interface):
    name = TextLine(title=u"Toy")

class Toy(Persistent):
    name = FieldProperty(IToy['name'])


class IGadget(Interface):
    name = TextLine(title=u"Gadget")

class Gadget(Persistent):
    name = FieldProperty(IGadget['name'])

    def __init__(self,toy):
        super(Person, self).__init__(self)
        self.name = toy.name



class IBaby(Interface):
    name = TextLine(title=u"Name")
    toys = List(title=u"toys",value_type=Object(schema=IToy,title=u"toy")

class IPerson(Interface):
    name = TextLine(title=u"Name")
    gadgets =
List(title=u"toys",value_type=Object(schema=IGadget,title=u"toy")


class Baby(Persistent):
    name = FieldProperty(IBaby['name'])
    toys = FieldProperty(IBaby['toys'])

class Person(Persistent):
    name = FieldProperty(IBaby['name'])
    gadgets = FieldProperty(IPerson['gadgets'])

    def __init__(self,baby):
        super(Person, self).__init__(self)
        self.name = baby.name



When IBaby is at the end of its workflow, it should be replaced by an
IPerson.

So I've made a view that creates a new IPerson based on data from the
old IBaby, and replaces the baby with the person on its container.

class BabyView(BrowserView):

    def growup(self):
        baby = self.context
        parentfolder = baby.__parent__
        id = baby.__name__
        person = Person(baby)
        del parentfolder[id]
        parentfolder[id] = person
       
self.request.response.redirect(zapi.absoluteURL(person,self.request)+'/@@edit.html')


It works, and I see the new object with the name I passed over from IBaby.

The trouble is when I add the following to growup()

        person.gadgets = [ Gadget(toy) for toy in baby.toys ]

This creates the gadgets (one per each toy) but the Gadget.name
attributes, altough being created, are not persisted.

The @@edit and @@index views show the Gadget.name attributes are
missing. I did not @@introspect the gadgets because I cannot traverse to
them.


Is this the right place for a PersistentList? Using it in growup() and
__init__ in place of FieldProperty does not make it work.




More information about the Zope3-users mailing list