1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 from six
.moves
.urllib
.parse
import urlparse
22 from werkzeug
.routing
import Map
, Rule
24 from mediagoblin
.tools
.common
import import_component
27 _log
= logging
.getLogger(__name__
)
33 def __init__(self
, endpoint
, url
, controller
, match_slash
=True):
34 Rule
.__init
__(self
, url
, endpoint
=endpoint
)
35 self
.gmg_controller
= controller
36 self
.match_slash
= match_slash
39 new_rule
= Rule
.empty(self
)
40 new_rule
.gmg_controller
= self
.gmg_controller
43 def match(self
, path
, *args
, **kwargs
):
44 if not (self
.match_slash
or path
.endswith("/")):
47 return super(MGRoute
, self
).match(path
, *args
, **kwargs
)
50 def endpoint_to_controller(rule
):
51 endpoint
= rule
.endpoint
52 view_func
= rule
.gmg_controller
54 _log
.debug('endpoint: {0} view_func: {1}'.format(endpoint
, view_func
))
56 # import the endpoint, or if it's already a callable, call that
57 if isinstance(view_func
, six
.string_types
):
58 view_func
= import_component(view_func
)
59 rule
.gmg_controller
= view_func
64 def add_route(endpoint
, url
, controller
, *args
, **kwargs
):
66 Add a route to the url mapping
68 url_map
.add(MGRoute(endpoint
, url
, controller
, *args
, **kwargs
))
71 def mount(mountpoint
, routes
):
73 Mount a bunch of routes to this mountpoint
75 for endpoint
, url
, controller
in routes
:
76 url
= "%s/%s" % (mountpoint
.rstrip('/'), url
.lstrip('/'))
77 add_route(endpoint
, url
, controller
)
79 def extract_url_arguments(url
, urlmap
):
81 This extracts the URL arguments from a given URL
83 parsed_url
= urlparse(url
)
84 map_adapter
= urlmap
.bind(
85 server_name
=parsed_url
.netloc
,
86 script_name
=parsed_url
.path
,
87 url_scheme
=parsed_url
.scheme
,
88 path_info
=parsed_url
.path
91 return map_adapter
.match()[1]