Author: lukeplant
Date: 2010-10-11 09:34:42 -0500 (Mon, 11 Oct 2010)
New Revision: 14141

Modified:
   django/trunk/django/contrib/gis/sitemaps/georss.py
   django/trunk/django/contrib/gis/sitemaps/kml.py
   django/trunk/django/contrib/gis/sitemaps/views.py
   django/trunk/django/contrib/sitemaps/__init__.py
   django/trunk/django/contrib/sitemaps/tests/basic.py
   django/trunk/django/contrib/sitemaps/views.py
Log:
Fixed #14433 - replaced a thread-unsafe solution to #10235 introduced in [13980]

This patch also addresses sitemap code found in contrib/gis, which [13980]
did not.

Thanks to gabrielhurley for the initial patch.

Refs #10235, #14386

Modified: django/trunk/django/contrib/gis/sitemaps/georss.py
===================================================================
--- django/trunk/django/contrib/gis/sitemaps/georss.py  2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/gis/sitemaps/georss.py  2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -36,12 +36,12 @@
             else:
                 self.locations.append(section)
  
-    def get_urls(self, page=1):
+    def get_urls(self, page=1, site=None):
         """
         This method is overrridden so the appropriate `geo_format` attribute
         is placed on each URL element.
         """
-        urls = Sitemap.get_urls(self, page=page)
+        urls = Sitemap.get_urls(self, page=page, site=site)
         for url in urls: url['geo_format'] = 'georss'
         return urls
 

Modified: django/trunk/django/contrib/gis/sitemaps/kml.py
===================================================================
--- django/trunk/django/contrib/gis/sitemaps/kml.py     2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/gis/sitemaps/kml.py     2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -40,12 +40,12 @@
                 raise TypeError('KML Sources must be a model or a 3-tuple.')
         return kml_sources
 
-    def get_urls(self, page=1):
+    def get_urls(self, page=1, site=None):
         """
         This method is overrridden so the appropriate `geo_format` attribute
         is placed on each URL element.
         """
-        urls = Sitemap.get_urls(self, page=page)
+        urls = Sitemap.get_urls(self, page=page, site=site)
         for url in urls: url['geo_format'] = self.geo_format
         return urls
 

Modified: django/trunk/django/contrib/gis/sitemaps/views.py
===================================================================
--- django/trunk/django/contrib/gis/sitemaps/views.py   2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/gis/sitemaps/views.py   2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -46,12 +46,13 @@
         maps = sitemaps.values()
 
     page = request.GET.get("p", 1)
+    current_site = get_current_site(request)
     for site in maps:
         try:
             if callable(site):
-                urls.extend(site().get_urls(page))
+                urls.extend(site().get_urls(page=page, site=current_site))
             else:
-                urls.extend(site.get_urls(page))
+                urls.extend(site.get_urls(page=page, site=current_site))
         except EmptyPage:
             raise Http404("Page %s empty" % page)
         except PageNotAnInteger:

Modified: django/trunk/django/contrib/sitemaps/__init__.py
===================================================================
--- django/trunk/django/contrib/sitemaps/__init__.py    2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/sitemaps/__init__.py    2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -1,5 +1,6 @@
-from django.contrib.sites.models import get_current_site
+from django.contrib.sites.models import Site, get_current_site
 from django.core import urlresolvers, paginator
+from django.core.exceptions import ImproperlyConfigured
 import urllib
 
 PING_URL = "http://www.google.com/webmasters/tools/ping";
@@ -60,11 +61,19 @@
         return self._paginator
     paginator = property(_get_paginator)
 
-    def get_urls(self, page=1):
-        current_site = get_current_site(self.request)
+    def get_urls(self, page=1, site=None):
+        if site is None:
+            if Site._meta.installed:
+                try:
+                    site = Site.objects.get_current()
+                except Site.DoesNotExist:
+                    pass
+            if site is None:
+                raise ImproperlyConfigured("In order to use Sitemaps you must 
either use the sites framework or pass in a Site or RequestSite object in your 
view code.")
+
         urls = []
         for item in self.paginator.page(page).object_list:
-            loc = "http://%s%s"; % (current_site.domain, self.__get('location', 
item))
+            loc = "http://%s%s"; % (site.domain, self.__get('location', item))
             priority = self.__get('priority', item, None)
             url_info = {
                 'location':   loc,
@@ -77,11 +86,8 @@
 
 class FlatPageSitemap(Sitemap):
     def items(self):
-        current_site = get_current_site(self.request)
-        if hasattr(current_site, "flatpage_set"):
-            return 
current_site.flatpage_set.filter(registration_required=False)
-        else:
-            return ()
+        current_site = Site.objects.get_current()
+        return current_site.flatpage_set.filter(registration_required=False)
 
 class GenericSitemap(Sitemap):
     priority = None

Modified: django/trunk/django/contrib/sitemaps/tests/basic.py
===================================================================
--- django/trunk/django/contrib/sitemaps/tests/basic.py 2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/sitemaps/tests/basic.py 2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -2,7 +2,9 @@
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.contrib.flatpages.models import FlatPage
+from django.contrib.sitemaps import Sitemap
 from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
 from django.test import TestCase
 from django.utils.formats import localize
 from django.utils.translation import activate, deactivate
@@ -92,3 +94,22 @@
 
<url><loc>http://testserver/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
 </urlset>
 """ % date.today().strftime('%Y-%m-%d'))
+
+    def test_sitemap_get_urls_no_site_1(self):
+        """
+        Check we get ImproperlyConfigured if we don't pass a site object to
+        Sitemap.get_urls and no Site objects exist
+        """
+        Site._meta.installed = True
+        Site.objects.all().delete()
+        self.assertRaises(ImproperlyConfigured, Sitemap().get_urls)
+
+    def test_sitemap_get_urls_no_site_2(self):
+        """
+        Check we get ImproperlyConfigured when we don't pass a site object to
+        Sitemap.get_urls if Site objects exists, but the sites framework is not
+        actually installed.
+        """
+        Site.objects.get_current()
+        Site._meta.installed = False
+        self.assertRaises(ImproperlyConfigured, Sitemap().get_urls)

Modified: django/trunk/django/contrib/sitemaps/views.py
===================================================================
--- django/trunk/django/contrib/sitemaps/views.py       2010-10-11 13:18:00 UTC 
(rev 14140)
+++ django/trunk/django/contrib/sitemaps/views.py       2010-10-11 14:34:42 UTC 
(rev 14141)
@@ -32,13 +32,13 @@
     else:
         maps = sitemaps.values()
     page = request.GET.get("p", 1)
+    current_site = get_current_site(request)
     for site in maps:
-        site.request = request
         try:
             if callable(site):
-                urls.extend(site().get_urls(page))
+                urls.extend(site().get_urls(page=page, site=current_site))
             else:
-                urls.extend(site.get_urls(page))
+                urls.extend(site.get_urls(page=page, site=current_site))
         except EmptyPage:
             raise Http404("Page %s empty" % page)
         except PageNotAnInteger:

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to