Tres Seaver wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Vladislav Vorobiev wrote:
Thierry Florac wrote:
Le vendredi 29 janvier 2010, Vladislav Vorobiev <vavvav@mykniga.de> a écrit : ====================================================================== ...
Thierry thank you for answer but it doesn't help.
I implement all what you sad. I tried with normal “list” and than swiched to “PersistentList”
code looks like that:
from persistent.list import PersistentList import transaction
<snip>
myList=PersistentList([self.context.pfad, 'object]) myList[0] = PersistentList([self.context.pfad, 'object])[0] #hope I anderstud you right
ob.refList= myList ob._p_changed = True ob.refList._p_changed = True self.context._setObject(id, ob)
After add I call again:
ob._p_changed = True ob.refList._p_changed = True transaction.commit()
I see the commitet trunsactions in ZMI
The same problem. After restart ist the Attribut not in context.
For example return's
Before restart: ***1 ob.refList[0].objectValues()[0].absolute_url() /pfad/object/FirstObjectOfReferencedObject
After restart only the id of the object: ob.refList[0].objectValues()[0].absolute_url() FirstObjectOfReferencedObject
Here is a place for an other question:
Normaly self.absolute_url() returns url with hostname, (http://localhost/bla/bla) but already befor restart I get without http://localhost/... see ***1
It seem's that I forgot something. I would be glad to if somebody explain me this problem.
======================================================================
In fact I'm not really sure to understand your data structure and it's goals... Could you explain me what you want to do ??
Thierry
I want to set some references from object to another object through. I try to explain this with example classes.
Example with two classes:
#Create classes
class School: pass
class People: pass
#Create objects
p=People()
s0=School() s0.name="Konrad School"
s1=School s1.name="Leopold School"
Now I set the referece
p.school1=s0 p.school2=s1
Now I can access through the attribut to s0 and s1 objects:
p.school1.name “Konrad School“
This construction works persistent without problems.
The idea is to put the references in a list.
p.schools=[s0,s1]
to access them
p.schools[0].name “Konrad School“
s1.name="Leo School" p.schools[1].name “Leo School“
type(p.schools[1]) <type 'classobj'>
It works in zope without restart. If the server was restartet I get some unwanted results. See my previews posts. The same effects I get with PersistentLists...
I hope it is more understandable.
You can't expect to use a simple list as an attribute of a persistent object without taking special precautions. Either you have methods which mutate the list, and then set the '_p_changed' attribute to 1:
def addSchool(self, school): self.schools.append(school) self._p_changed = 1
or re-assign the list attribute:
def addSchool(self, school): schools = self.schools schools.append(school) self.schools = schools
You shoule be able to use a PersistentList instead of a "plain" Python list to avoid the need for one of those two problems:
from persistent.list import PersistentList ... class Person: def __init__(self): self.schools = PersistentList()
Thank you for resonse but it doesn't help. I post my implementation with results. #my method def addFotoalbom(self): #test with PersistentList self.ref_=PersistentList() nb=getattr(self.BoxingCategoryContainer, 'Kat 1').FOTOCAT self.ref_.append(nb) #test without List self.ref=getattr(self.BoxingCategoryContainer, 'Kat 1').FOTOCAT return 'ok' Results without restarting the server 1. #absolue_url() method of of context context.absolute_url() 'http://localhost/CategoryContainer/Kat%201/x1' x1 is my self-object. 2. #accessing attribute through the list list(context.ref_[0].objectValues())[0].absolute_url() '/testpath/CategoryContainer/Kat%201/FOTOCAT/asa' 'asa' is the first object in FOTOCAT but where is http://localhost and why is the URL without x1/FOTOCAT? 3. #accessing attribute without list context.ref.objectValues()[0].absolute_url() 'http://localhost/CategoryContainer/Kat%201/x1/FOTOCAT/asa' Thats ok. After RESTART the Server 1. context.absolute_url() 'http://boxapp.localhost/BoxingCategoryContainer/Kat%201/x1' 2. list(context.ref_[0].objectValues())[0].absolute_url() 'asa' What happaning here? 3. #accessing attribute without list context.ref.objectValues()[1].absolute_url() 'http://localhost/CategoryContainer/Kat%201/x1/FOTOCAT/asa' ok You see attributes without PersistentList survives the restart, PersistentList not. Why I get some results without "http://localhost" for context.absolute_url() befor restart? Its '/testpath/CategoryContainer/Kat%201/FOTOCAT/asa' must be 'http://localhost/CategoryContainer/Kat%201/FOTOCAT/asa'. Any Ideas? Thanks Vlad