[Grok-dev] Upgrade problem "type object 'IRole' has no attribute
'__iro__'"
Sebastian Ware
sebastian at urbantalk.se
Wed May 28 09:51:48 EDT 2008
Catching the exception was a temporary solution:
def add_extendor(self, provided):
_extendors = self._extendors
try:
for i in provided.__iro__:
extendors = _extendors.get(i, ())
_extendors[i] = (
[e for e in extendors if provided.isOrExtends(e)]
+
[provided]
+
[e for e in extendors if not
provided.isOrExtends(e)]
)
except AttributeError:
pass
But, I am guessing there are other problems connected to this because
I get other failures when I have logged in (cookieLifetime was one of
them).
Anyway, I hope there is a solution to this problem. Fortunately I am
not too pressed for time, but the work around (exporting all the data
an reimporting it into a fresh application) isn't a great option.
Mvh Sebastian
28 maj 2008 kl. 15.32 skrev Sebastian Ware:
> This is the code where the problem occurs:
>
> def init_extendors(self):
> self._extendors = {}
> for p in self._registry._provided:
> self.add_extendor(p)
>
> def add_extendor(self, provided):
> _extendors = self._extendors
> for i in provided.__iro__: <======= THIS IS WHERE THE ERROR
> OCCURS!
> extendors = _extendors.get(i, ())
> _extendors[i] = (
> [e for e in extendors if provided.isOrExtends(e)]
> +
> [provided]
> +
> [e for e in extendors if not provided.isOrExtends(e)]
> )
>
> def remove_extendor(self, provided):
> _extendors = self._extendors
> for i in provided.__iro__:
> _extendors[i] = [e for e in _extendors.get(i, ())
> if e != provided]
>
> I have tracked down the code that should set this in [class
> Specification] (zope/interface/interface.py). Maybe I could solve
> this problem if I somehow could tell all the offending objects that
> they have changed (I am guessing the problem is related to more than
> one object). But how?
>
> class Specification(SpecificationBase):
>
> [snip]
>
> def changed(self, originally_changed):
> """We, or something we depend on, have changed
> """
>
> implied = self._implied
> implied.clear()
>
> ancestors = ro(self)
>
> try:
> if Interface not in ancestors:
> ancestors.append(Interface)
> except NameError:
> pass # defining Interface itself
>
> self.__sro__ = tuple(ancestors)
> self.__iro__ = tuple([ancestor for ancestor in ancestors
> if isinstance(ancestor, InterfaceClass)
> ])
>
> for ancestor in ancestors:
> # We directly imply our ancestors:
> implied[ancestor] = ()
>
> # Now, advise our dependents of change:
> for dependent in self.dependents.keys():
> dependent.changed(originally_changed)
>
>
> Mvh Sebastian
>
> 28 maj 2008 kl. 12.43 skrev Sebastian Ware:
>
>> My problem is that this prevents me from updating my customers
>> project without exporting and importing all the data, something
>> that isn't very easy at the current state of Grok.
>>
>> I hope someone can give me some hints on this.
>>
>> Mvh Sebastian
>>
>> 28 maj 2008 kl. 12.02 skrev Wichert Akkerman:
>>
>>> Previously Sebastian Ware wrote:
>>>> When upgrading a live grok-0.10 app to grok-0.12 I get the
>>>> following
>>>> error:
>>>>
>>>> AttributeError: type object 'IRole' has no attribute '__iro__'
>>>>
>>>> I am guessing it has to do with the move of zope.securitypolicy,
>>>> but
>>>> how do I resolve this?
>>>
>>> The last few times I've seen that __iro__ error it apparently had
>>> something to do with persisted interface. I've never been able to
>>> find a
>>> fix for it, or reliably reproduce it.
>>>
>>> Wichert.
>>>
>>> --
>>> Wichert Akkerman <wichert at wiggy.net> It is simple to make things.
>>> http://www.wiggy.net/ It is hard to make things
>>> simple.
>>
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> http://mail.zope.org/mailman/listinfo/grok-dev
>
More information about the Grok-dev
mailing list