equal
deleted
inserted
replaced
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: |