FacetItem now takes req as first parameter of __init__, THIS IS BACKWARD INCOMPATIBLE
"""Some utilities for the CubicWeb server.:organization: Logilab:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr"""__docformat__="restructuredtext en"importsysimportstringfromthreadingimportTimer,Threadfromgetpassimportgetpassfromrandomimportchoicetry:fromcryptimportcryptexceptImportError:# crypt is not available (eg windows)fromcubicweb.md5cryptimportcryptdefgetsalt(chars=string.letters+string.digits):"""generate a random 2-character 'salt'"""returnchoice(chars)+choice(chars)defcrypt_password(passwd,salt=None):"""return the encrypted password using the given salt or a generated one """ifpasswdisNone:returnNoneifsaltisNone:salt=getsalt()returncrypt(passwd,salt)defcartesian_product(seqin):"""returns a generator which returns the cartesian product of `seqin` for more details, see : http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/302478 """defrloop(seqin,comb):"""recursive looping function"""ifseqin:# any more sequences to process?foriteminseqin[0]:newcomb=comb+[item]# add next item to current combination# call rloop w/ remaining seqs, newcombforiteminrloop(seqin[1:],newcomb):yielditem# seqs and newcombelse:# processing last sequenceyieldcomb# comb finished, add to listreturnrloop(seqin,[])defcleanup_solutions(rqlst,solutions):forsolinsolutions:forvnameinsol.keys():ifnot(vnameinrqlst.defined_varsorvnameinrqlst.aliases):delsol[vname]DEFAULT_MSG='we need a manager connection on the repository \(the server doesn\'t have to run, even should better not)'defmanager_userpasswd(user=None,passwd=None,msg=DEFAULT_MSG,confirm=False):ifnotuser:printmsgwhilenotuser:user=raw_input('login: ')passwd=getpass('password: ')ifconfirm:whileTrue:passwd2=getpass('confirm password: ')ifpasswd==passwd2:breakprint'password doesn\'t match'passwd=getpass('password: ')user=unicode(user,sys.stdin.encoding)elifnotpasswd:assertnotconfirmpasswd=getpass('password for %s: '%user)# XXX decode password using stdin encoding then encode it using appl'encodingreturnuser,passwdclassLoopTask(object):"""threaded task restarting itself once executed"""def__init__(self,interval,func):self.interval=intervaldefauto_restart_func(self=self,func=func):try:func()finally:self.start()self.func=auto_restart_funcself.name=func.__name__defstart(self):self._t=Timer(self.interval,self.func)self._t.start()defcancel(self):self._t.cancel()defjoin(self):self._t.join()classRepoThread(Thread):"""subclass of thread so it auto remove itself from a given list once executed """def__init__(self,target,running_threads):defauto_remove_func(self=self,func=target):try:func()finally:self.running_threads.remove(self)Thread.__init__(self,target=target)self.running_threads=running_threadsself._name=target.__name__defstart(self):self.running_threads.append(self)Thread.start(self)@propertydefname(self):return'%s(%s)'%(self._name,Thread.getName(self))fromlogilab.common.deprecationimportclass_movedfromcubicweb.serverimportpoolOperation=class_moved(pool.Operation)PreCommitOperation=class_moved(pool.PreCommitOperation)LateOperation=class_moved(pool.LateOperation)SingleLastOperation=class_moved(pool.SingleLastOperation)