[rset] support for delitem on repeat list (may be necessary in pyro source)
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""provide class to do Apache rewrite rules'job inside cubicweb (though functionnalitiesare much more limited for the moment)"""__docformat__="restructuredtext en"fromreimportcompilefromcubicweb.webimportRedirectfromcubicweb.web.componentimportComponentclassRewriteCond(object):def__init__(self,condition,match='host',rules=(),action='rewrite'):self.condition=compile(condition)assertmatchin('host','path'),matchself.match_part=matchself.rules=[]forrule,replaceinrules:rulergx=compile(rule)self.rules.append((rulergx,replace))assertactionin('rewrite','redirect','stop'),actionself.process=getattr(self,'action_%s'%action)defmatch(self,**kwargs):self._match=self.condition.match(kwargs[self.match_part])returnnotself._matchisNonedefaction_rewrite(self,path):forrgx,replaceinself.rules:ifnotrgx.match(path)isNone:matchdict=self._match.groupdict()orNoneifnotmatchdictisNone:replace=replace%matchdictreturnrgx.sub(replace,path)returnpathdefaction_redirect(self,path):url=self.action_rewrite(path)raiseRedirect(url)defaction_stop(self,path):returnpathclassApacheURLRewrite(Component):"""inherit from this class with actual rules to activate apache style rewriting rules should have the form : [('condition pattern 1', [('rule1 pattern', 'replace expression'), ('rule2 pattern', 'replace expression')], ('condition pattern 2', [('rule1 pattern', 'replace expression'), ('rule2 pattern', 'replace expression')] ] for instance the equivalent of the following apache rules: RewriteCond %{HTTP_HOST} ^logilab\.fr RewriteRule ^/(.*) http://www.logilab.fr/$1 [L,R=301] RewriteCond %{HTTP_HOST} ^www\.logilab\.fr RewriteRule ^/(.*) http://localhost:8080/$1 [L,P] RewriteCond %{HTTP_HOST} ^(.+)\.logilab\.fr RewriteRule ^/(data/.*) http://localhost:8080/$1 [L,P] RewriteRule ^/(json.*) http://localhost:8080/$1 [L,P] RewriteRule ^/(.*) http://localhost:8080/m_%1/$1 [L,P] could be written (considering that no "host rewritting" is necessary): class MyAppRules(ApacheURLRewrite): rules = [ RewriteCond('logilab\.fr', match='host', rules=[('/(.*)', r'http://www.logilab.fr/\1')], action='redirect'), RewriteCond('(www)\.logilab\.fr', match='host', action='stop'), RewriteCond('/(data|json)/', match='path', action='stop'), RewriteCond('(?P<cat>.*)\.logilab\.fr', match='host', rules=[('/(.*)', r'/m_%(cat)s/\1')]), ] """__abstract__=True__regid__='urlrewriter'rules=[]defget_rules(self,req):returnself.rulesdefrewrite(self,host,path,req):forcondinself.get_rules(req):ifcond.match(host=host,path=path):returncond.process(path)returnpath