cubicweb/web/views/urlrewrite.py
changeset 12567 26744ad37953
parent 11057 0b59724cb3f2
equal deleted inserted replaced
12566:6b3523f81f42 12567:26744ad37953
    16 # You should have received a copy of the GNU Lesser General Public License along
    16 # You should have received a copy of the GNU Lesser General Public License along
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 """Rules based url rewriter component, to get configurable RESTful urls"""
    18 """Rules based url rewriter component, to get configurable RESTful urls"""
    19 
    19 
    20 import re
    20 import re
    21 
       
    22 from six import string_types, add_metaclass
       
    23 
    21 
    24 from cubicweb.uilib import domid
    22 from cubicweb.uilib import domid
    25 from cubicweb.appobject import AppObject
    23 from cubicweb.appobject import AppObject
    26 
    24 
    27 
    25 
    51                 inputs.add(input)
    49                 inputs.add(input)
    52         classdict['rules'] = rules
    50         classdict['rules'] = rules
    53         return super(metarewriter, mcs).__new__(mcs, name, bases, classdict)
    51         return super(metarewriter, mcs).__new__(mcs, name, bases, classdict)
    54 
    52 
    55 
    53 
    56 @add_metaclass(metarewriter)
    54 class URLRewriter(AppObject, metaclass=metarewriter):
    57 class URLRewriter(AppObject):
       
    58     """Base class for URL rewriters.
    55     """Base class for URL rewriters.
    59 
    56 
    60     Url rewriters should have a `rules` dict that maps an input URI
    57     Url rewriters should have a `rules` dict that maps an input URI
    61     to something that should be used for rewriting.
    58     to something that should be used for rewriting.
    62 
    59 
   122             except ValueError:
   119             except ValueError:
   123                 inputurl, infos = data
   120                 inputurl, infos = data
   124                 required_groups = None
   121                 required_groups = None
   125             if required_groups and not req.user.matching_groups(required_groups):
   122             if required_groups and not req.user.matching_groups(required_groups):
   126                 continue
   123                 continue
   127             if isinstance(inputurl, string_types):
   124             if isinstance(inputurl, str):
   128                 if inputurl == uri:
   125                 if inputurl == uri:
   129                     req.form.update(infos)
   126                     req.form.update(infos)
   130                     break
   127                     break
   131             elif inputurl.match(uri): # it's a regexp
   128             elif inputurl.match(uri): # it's a regexp
   132                 # XXX what about i18n? (vtitle for instance)
   129                 # XXX what about i18n? (vtitle for instance)
   133                 for param, value in infos.items():
   130                 for param, value in infos.items():
   134                     if isinstance(value, string_types):
   131                     if isinstance(value, str):
   135                         req.form[param] = inputurl.sub(value, uri)
   132                         req.form[param] = inputurl.sub(value, uri)
   136                     else:
   133                     else:
   137                         req.form[param] = value
   134                         req.form[param] = value
   138                 break
   135                 break
   139         else:
   136         else:
   222             except ValueError:
   219             except ValueError:
   223                 inputurl, callback = data
   220                 inputurl, callback = data
   224                 required_groups = None
   221                 required_groups = None
   225             if required_groups and not req.user.matching_groups(required_groups):
   222             if required_groups and not req.user.matching_groups(required_groups):
   226                 continue
   223                 continue
   227             if isinstance(inputurl, string_types):
   224             if isinstance(inputurl, str):
   228                 if inputurl == uri:
   225                 if inputurl == uri:
   229                     return callback(inputurl, uri, req, self._cw.vreg.schema)
   226                     return callback(inputurl, uri, req, self._cw.vreg.schema)
   230             elif inputurl.match(uri): # it's a regexp
   227             elif inputurl.match(uri): # it's a regexp
   231                 return callback(inputurl, uri, req, self._cw.vreg.schema)
   228                 return callback(inputurl, uri, req, self._cw.vreg.schema)
   232         else:
   229         else: