Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / utils / urls.py @ dcb8545f

History | View | Annotate | Download (4 kB)

1 b657485d Kostas Papadimitriou
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 b657485d Kostas Papadimitriou
#
3 b657485d Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 b657485d Kostas Papadimitriou
# without modification, are permitted provided that the following
5 b657485d Kostas Papadimitriou
# conditions are met:
6 b657485d Kostas Papadimitriou
#
7 b657485d Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 b657485d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 b657485d Kostas Papadimitriou
#      disclaimer.
10 b657485d Kostas Papadimitriou
#
11 b657485d Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 b657485d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 b657485d Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 b657485d Kostas Papadimitriou
#      provided with the distribution.
15 b657485d Kostas Papadimitriou
#
16 b657485d Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 b657485d Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 b657485d Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 b657485d Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 b657485d Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 b657485d Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 b657485d Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 b657485d Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 b657485d Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 b657485d Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 b657485d Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 b657485d Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 b657485d Kostas Papadimitriou
#
29 b657485d Kostas Papadimitriou
# The views and conclusions contained in the software and
30 b657485d Kostas Papadimitriou
# documentation are those of the authors and should not be
31 b657485d Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 b657485d Kostas Papadimitriou
# or implied, of GRNET S.A.
33 b657485d Kostas Papadimitriou
34 b657485d Kostas Papadimitriou
35 b657485d Kostas Papadimitriou
from django.conf.urls.defaults import url, patterns
36 b657485d Kostas Papadimitriou
from snf_django.lib.api.utils import prefix_pattern
37 347b2ba1 Giorgos Korfiatis
from synnefo.lib.services import get_service_path
38 b657485d Kostas Papadimitriou
from synnefo.lib import join_urls
39 b657485d Kostas Papadimitriou
40 b657485d Kostas Papadimitriou
41 347b2ba1 Giorgos Korfiatis
def extend_path_with_slash(patterns_obj, path):
42 347b2ba1 Giorgos Korfiatis
    if not path.endswith('/'):
43 347b2ba1 Giorgos Korfiatis
        pattern = prefix_pattern(path, append_slash=False) + '$'
44 347b2ba1 Giorgos Korfiatis
        entry = url(pattern, 'redirect_to', {'url': path + '/'})
45 347b2ba1 Giorgos Korfiatis
        patterns_obj += patterns('django.views.generic.simple', entry)
46 347b2ba1 Giorgos Korfiatis
47 347b2ba1 Giorgos Korfiatis
48 347b2ba1 Giorgos Korfiatis
def extend_endpoint_with_slash(patterns_obj, filled_services, service_type,
49 347b2ba1 Giorgos Korfiatis
                               version=None):
50 347b2ba1 Giorgos Korfiatis
    path = get_service_path(filled_services, service_type, version)
51 347b2ba1 Giorgos Korfiatis
    extend_path_with_slash(patterns_obj, path)
52 347b2ba1 Giorgos Korfiatis
53 347b2ba1 Giorgos Korfiatis
54 b657485d Kostas Papadimitriou
def extend_with_root_redirects(patterns_obj, filled_services, service_type,
55 347b2ba1 Giorgos Korfiatis
                               base_path, with_slash=True):
56 b657485d Kostas Papadimitriou
    """
57 b657485d Kostas Papadimitriou
    Append additional redirect url entries for `/` and `/<base_path>` paths.
58 b657485d Kostas Papadimitriou

59 b657485d Kostas Papadimitriou
    `/` redirects to `/<base_path>` and `/<base_path>` to the resolved service
60 b657485d Kostas Papadimitriou
    type url.
61 b657485d Kostas Papadimitriou

62 b657485d Kostas Papadimitriou
    This is used in synnefo components root urlpatterns to append sane default
63 b657485d Kostas Papadimitriou
    redirects to the chosen service url.
64 b657485d Kostas Papadimitriou

65 b657485d Kostas Papadimitriou
    """
66 347b2ba1 Giorgos Korfiatis
    service_path = get_service_path(filled_services, service_type)
67 347b2ba1 Giorgos Korfiatis
    if with_slash:
68 347b2ba1 Giorgos Korfiatis
        service_path = service_path.rstrip('/') + '/'
69 347b2ba1 Giorgos Korfiatis
70 67c10753 Kostas Papadimitriou
    root_url_entry = None
71 67c10753 Kostas Papadimitriou
    if base_path and base_path != '/':
72 67c10753 Kostas Papadimitriou
        # redirect slash to /<base_path>/
73 67c10753 Kostas Papadimitriou
        root_url_entry = url('^$', 'redirect_to',
74 67c10753 Kostas Papadimitriou
                             {'url': join_urls('/', base_path.rstrip('/'),
75 67c10753 Kostas Papadimitriou
                                               '/')})
76 67c10753 Kostas Papadimitriou
77 67c10753 Kostas Papadimitriou
    base_path_pattern = prefix_pattern(base_path) + '$'
78 67c10753 Kostas Papadimitriou
    base_path_pattern_no_slash = prefix_pattern(base_path).rstrip('/') + '$'
79 67c10753 Kostas Papadimitriou
80 347b2ba1 Giorgos Korfiatis
    # redirect /<base_path> and /<base_path>/ to service_path public endpoint
81 67c10753 Kostas Papadimitriou
    base_url_entry = url(base_path_pattern, 'redirect_to', {'url':
82 347b2ba1 Giorgos Korfiatis
                                                            service_path})
83 67c10753 Kostas Papadimitriou
    base_url_entry_no_slash = url(base_path_pattern_no_slash,
84 347b2ba1 Giorgos Korfiatis
                                  'redirect_to', {'url': service_path})
85 b657485d Kostas Papadimitriou
    # urls order matter. Setting base_url_entry first allows us to avoid
86 b657485d Kostas Papadimitriou
    # redirect loops when base_path is empty or `/`
87 b657485d Kostas Papadimitriou
    patterns_obj += patterns('django.views.generic.simple',
88 67c10753 Kostas Papadimitriou
                             base_url_entry, base_url_entry_no_slash)
89 67c10753 Kostas Papadimitriou
    if root_url_entry:
90 67c10753 Kostas Papadimitriou
        # register root entry only for non root base_path deployments
91 67c10753 Kostas Papadimitriou
        patterns_obj += patterns('django.views.generic.simple', root_url_entry)