2
2
from cms .exceptions import NoHomeFound
3
3
from cms .models .pagemodel import Page
4
4
5
+ from django .utils .translation import ugettext_lazy as _
5
6
from django .conf import settings
6
7
from django .contrib .sites .models import Site
8
+ from django .core .exceptions import ValidationError
7
9
from django .core .urlresolvers import reverse
8
10
from django .db .models .query_utils import Q
9
11
import urllib
10
12
import re
13
+ from cms .utils .urlutils import any_path_re
11
14
12
15
ADMIN_PAGE_RE_PATTERN = ur'cms/page/(\d+)'
13
16
ADMIN_PAGE_RE = re .compile (ADMIN_PAGE_RE_PATTERN )
14
17
15
18
16
- def get_page_from_path (path , preview = False ):
19
+ def get_page_queryset_from_path (path , preview = False ):
20
+ """ Returns a queryset of pages corresponding to the path given
21
+ In may returns None or a single page is no page is present or root path is given
22
+ """
17
23
if 'django.contrib.admin' in settings .INSTALLED_APPS :
18
24
admin_base = reverse ('admin:index' ).lstrip ('/' )
19
25
else :
@@ -43,7 +49,7 @@ def get_page_from_path(path, preview=False):
43
49
pages = pages .published ()
44
50
45
51
pages = pages .filter (site = site )
46
-
52
+
47
53
# Check if there are any pages
48
54
if not pages .all_root ().exists ():
49
55
return None
@@ -65,13 +71,25 @@ def get_page_from_path(path, preview=False):
65
71
query = Q (title_set__slug = path )
66
72
else :
67
73
query = Q (title_set__path = path )
68
- try :
69
- page = pages .filter (query ).distinct ().get ()
70
- except Page .DoesNotExist :
74
+ return pages .filter (query ).distinct ()
75
+
76
+
77
+ def get_page_from_path (path , preview = False ):
78
+ """ Resolves a url path to a single page object.
79
+ Raises exceptions is page does not exist or multiple pages are found
80
+ """
81
+ page_qs = get_page_queryset_from_path (path ,preview )
82
+ if page_qs is not None :
83
+ if isinstance (page_qs ,Page ):
84
+ return page_qs
85
+ try :
86
+ page = page_qs .get ()
87
+ except Page .DoesNotExist :
88
+ return None
89
+ return page
90
+ else :
71
91
return None
72
-
73
- return page
74
-
92
+
75
93
76
94
def get_page_from_request (request , use_path = None ):
77
95
"""
@@ -111,3 +129,21 @@ def get_page_from_request(request, use_path=None):
111
129
112
130
request ._current_page_cache = page
113
131
return page
132
+
133
+
134
+ def is_valid_overwrite_url (url ,instance ):
135
+ if url :
136
+ if not any_path_re .match (url ):
137
+ raise ValidationError (_ ('Invalid URL, use /my/url format.' ))
138
+ page_qs = get_page_queryset_from_path (url .strip ('/' ))
139
+ url_clashes = []
140
+ if page_qs is not None :
141
+ if isinstance (page_qs ,Page ):
142
+ pages = [page_qs ]
143
+ for page in page_qs :
144
+ if page and page .pk != instance .pk :
145
+ url_clashes .append ("'%s'" % page )
146
+ if url_clashes :
147
+ url_clashes .append ("'%s'" % instance )
148
+ raise ValidationError (_ ('Pages %(pages)s has the same url \' %(url)s\' .' ) % {'pages' :", " .join (url_clashes ),'url' :url })
149
+ return True
0 commit comments