22from cms .exceptions import NoHomeFound
33from cms .models .pagemodel import Page
44
5+ from django .utils .translation import ugettext_lazy as _
56from django .conf import settings
67from django .contrib .sites .models import Site
8+ from django .core .exceptions import ValidationError
79from django .core .urlresolvers import reverse
810from django .db .models .query_utils import Q
911import urllib
1012import re
13+ from cms .utils .urlutils import any_path_re
1114
1215ADMIN_PAGE_RE_PATTERN = ur'cms/page/(\d+)'
1316ADMIN_PAGE_RE = re .compile (ADMIN_PAGE_RE_PATTERN )
1417
1518
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+ """
1723 if 'django.contrib.admin' in settings .INSTALLED_APPS :
1824 admin_base = reverse ('admin:index' ).lstrip ('/' )
1925 else :
@@ -43,7 +49,7 @@ def get_page_from_path(path, preview=False):
4349 pages = pages .published ()
4450
4551 pages = pages .filter (site = site )
46-
52+
4753 # Check if there are any pages
4854 if not pages .all_root ().exists ():
4955 return None
@@ -65,13 +71,25 @@ def get_page_from_path(path, preview=False):
6571 query = Q (title_set__slug = path )
6672 else :
6773 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 :
7191 return None
72-
73- return page
74-
92+
7593
7694def get_page_from_request (request , use_path = None ):
7795 """
@@ -111,3 +129,21 @@ def get_page_from_request(request, use_path=None):
111129
112130 request ._current_page_cache = page
113131 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