# HG changeset patch # User Aurelien Campeas # Date 1402568118 -7200 # Node ID 5ad1c3a9c4a1b82cfb955f5bea65c4e83604c867 # Parent 0a5890491ab311b932b6e137755090bf253d5db1 [web/request] use a picklable Counter object for tab index counters Related to #1381328. diff -r 0a5890491ab3 -r 5ad1c3a9c4a1 web/request.py --- a/web/request.py Tue Jul 15 18:07:31 2014 +0200 +++ b/web/request.py Thu Jun 12 12:15:18 2014 +0200 @@ -30,7 +30,6 @@ from datetime import date, datetime from urlparse import urlsplit import httplib -from itertools import count from warnings import warn from rql.utils import rqlvar_maker @@ -82,6 +81,24 @@ return [v for v in value if v != INTERNAL_FIELD_VALUE] +class Counter(object): + """A picklable counter object, usable for e.g. page tab index count""" + __slots__ = ('value',) + + def __init__(self, initialvalue=0): + self.value = initialvalue + + def __call__(self): + value = self.value + self.value += 1 + return value + + def __getstate__(self): + return {'value': self.value} + + def __setstate__(self, state): + self.value = state['value'] + class _CubicWebRequestBase(RequestSessionBase): """abstract HTTP request, should be extended according to the HTTP backend @@ -201,7 +218,7 @@ def next_tabindex(self): nextfunc = self.get_page_data('nexttabfunc') if nextfunc is None: - nextfunc = count(1).next + nextfunc = Counter(1) self.set_page_data('nexttabfunc', nextfunc) return nextfunc()