Corrected penfield BlogView handling of tags, particularly related to feed links...
[philo.git] / contrib / penfield / models.py
index c018247..a616faa 100644 (file)
@@ -1,7 +1,9 @@
 from django.conf import settings
 from django.conf.urls.defaults import url, patterns, include
+from django.contrib.sites.models import Site, RequestSite
+from django.contrib.syndication.views import add_domain
 from django.db import models
-from django.http import Http404
+from django.http import Http404, HttpResponse
 from django.template import RequestContext, Template as DjangoTemplate
 from django.utils import feedgenerator, tzinfo
 from django.utils.datastructures import SortedDict
@@ -62,7 +64,9 @@ class FeedView(MultiView):
                if self.feeds_enabled:
                        feed_reverse_name = "%s_feed" % reverse_name
                        urlpatterns += patterns('',
-                               url(r'^%s$' % self.feed_suffix, self.feed_view(get_items_attr, feed_reverse_name), name=feed_reverse_name),
+                               # include an optional slash at the beginning in case someone uses an include
+                               # with a base that doesn't include a slash.
+                               url(r'^/?%s$' % self.feed_suffix, self.feed_view(get_items_attr, feed_reverse_name), name=feed_reverse_name),
                        )
                return urlpatterns
        
@@ -79,6 +83,7 @@ class FeedView(MultiView):
                        obj = self.get_object(request, *args, **kwargs)
                        feed = self.get_feed(obj, request, reverse_name)
                        items, xxx = get_items(request, extra_context=extra_context, *args, **kwargs)
+                       self.populate_feed(feed, items, request)
                        
                        response = HttpResponse(mimetype=feed.mime_type)
                        feed.write(response, 'utf-8')
@@ -138,6 +143,11 @@ class FeedView(MultiView):
                """
                Returns an unpopulated feedgenerator.DefaultFeed object for this object.
                """
+               try:
+                       current_site = Site.objects.get_current()
+               except Site.DoesNotExist:
+                       current_site = RequestSite(request)
+               
                feed_type = self.get_feed_type(request)
                node = request.node
                link = node.get_absolute_url(with_domain=True, request=request, secure=request.is_secure())
@@ -148,7 +158,11 @@ class FeedView(MultiView):
                        link = link,
                        description = self.__get_dynamic_attr('description', obj),
                        language = settings.LANGUAGE_CODE.decode(),
-                       feed_url = node.construct_url(self.reverse(reverse_name), with_domain=True, request=request, secure=request.is_secure()),
+                       feed_url = add_domain(
+                               current_site.domain,
+                               self.__get_dynamic_attr('feed_url', obj) or node.construct_url(node.subpath, with_domain=True, request=request, secure=request.is_secure()),
+                               request.is_secure()
+                       ),
                        author_name = self.__get_dynamic_attr('author_name', obj),
                        author_link = self.__get_dynamic_attr('author_link', obj),
                        author_email = self.__get_dynamic_attr('author_email', obj),
@@ -162,15 +176,19 @@ class FeedView(MultiView):
        
        def populate_feed(self, feed, items, request):
                if self.item_title_template:
-                       title_template = Template(self.item_title_template.code)
+                       title_template = DjangoTemplate(self.item_title_template.code)
                else:
                        title_template = None
                if self.item_description_template:
-                       description_template = Template(self.item_description_template.code)
+                       description_template = DjangoTemplate(self.item_description_template.code)
                else:
                        description_template = None
                
                node = request.node
+               try:
+                       current_site = Site.objects.get_current()
+               except Site.DoesNotExist:
+                       current_site = RequestSite(request)
                
                for item in items:
                        if title_template is not None:
@@ -188,7 +206,11 @@ class FeedView(MultiView):
                        enc_url = self.__get_dynamic_attr('item_enclosure_url', item)
                        if enc_url:
                                enc = feedgenerator.Enclosure(
-                                       url = smart_unicode(enc_url),
+                                       url = smart_unicode(add_domain(
+                                                       current_site.domain,
+                                                       enc_url,
+                                                       request.is_secure()
+                                       )),
                                        length = smart_unicode(self.__get_dynamic_attr('item_enclosure_length', item)),
                                        mime_type = smart_unicode(self.__get_dynamic_attr('item_enclosure_mime_type', item))
                                )
@@ -313,6 +335,7 @@ class BlogView(FeedView):
        
        index_page = models.ForeignKey(Page, related_name='blog_index_related')
        entry_page = models.ForeignKey(Page, related_name='blog_entry_related')
+       # TODO: entry_archive is misleading. Rename to ymd_page or timespan_page.
        entry_archive_page = models.ForeignKey(Page, related_name='blog_entry_archive_related', null=True, blank=True)
        tag_page = models.ForeignKey(Page, related_name='blog_tag_related')
        tag_archive_page = models.ForeignKey(Page, related_name='blog_tag_archive_related', null=True, blank=True)
@@ -339,7 +362,7 @@ class BlogView(FeedView):
                                                if self.entry_permalink_style == 'D':
                                                        kwargs.update({'day': str(obj.date.day).zfill(2)})
                                return self.entry_view, [], kwargs
-               elif isinstance(obj, Tag) or (isinstance(obj, models.QuerySet) and obj.model == Tag and obj):
+               elif isinstance(obj, Tag) or (isinstance(obj, models.query.QuerySet) and obj.model == Tag and obj):
                        if isinstance(obj, Tag):
                                obj = [obj]
                        slugs = [tag.slug for tag in obj if tag in self.get_tag_queryset()]
@@ -490,10 +513,11 @@ class BlogView(FeedView):
                        obj = self.get_object(request, *args, **kwargs)
                        feed = self.get_feed(obj, request, reverse_name)
                        items, extra_context = get_items(request, extra_context=extra_context, *args, **kwargs)
+                       self.populate_feed(feed, items, request)
                        
                        if 'tags' in extra_context:
                                tags = extra_context['tags']
-                               feed.feed['link'] = request.node.construct_url(self.reverse(tags), with_domain=True, request=request, secure=request.is_secure())
+                               feed.feed['link'] = request.node.construct_url(self.reverse(obj=tags), with_domain=True, request=request, secure=request.is_secure())
                        else:
                                tags = obj.entry_tags
                        
@@ -512,7 +536,7 @@ class BlogView(FeedView):
                        item_context = {
                                'paginator': paginator,
                                'paginated_page': paginated_page,
-                               self.item_context_var: objects
+                               self.item_context_var: items
                        }
                else:
                        item_context = {