from django.contrib.syndication.feeds import Feed, FeedDoesNotExist
from django.utils import feedgenerator
from models import FlatPageHistory
from django.contrib.sites.models import Site
from pycon.core import safe_ascii_encode

class RecentChangesFeed(Feed):
    def __init__(self, slug, request, query, url=None,
                 title=None, description=None, limit=-1):
        super(RecentChangesFeed, self).__init__(slug, request)
        if url is not None: self.feed_url = url
        self.site_name = safe_ascii_encode(Site.objects.get_current().name)
        if title is not None:
            self.title = title
        if description is not None:
            self.description = description
        self.query = query
        self.limit=limit
    def title(self, obj):
        """
        Returns the feed's title as a normal Python string.
        """
        return 'Recent Changes to ' + self.site_name
    def description(self, obj):
        """
        Returns the feed's description as a normal Python string.
        """
        return ''
    def link(self):
        """
        Returns the feed's link as a normal Python string.
        """
        return safe_ascii_encode(self.request.path)
    def get_object(self, bits):
        """
        Takes a list of strings gleaned from the URL and returns an object
        represented by this feed. Raises
        django.core.exceptions.ObjectDoesNotExist on error.
        """
        return self.query
    
    def items(self, obj):
        """
        Takes the object returned by get_object() and returns a list of
        items to publish in this feed.
        """
        if self.limit < 1:
            return obj
        if self.limit >= obj.count():
            return obj
        return obj[:self.limit]
    #def item_link(self, item):
    #    """
    #    Takes an item, as returned by items(), and returns the item's URL.
    #    """
    #    return safe_ascii_encode(self.request.path) + '?ver=' + str(item.id)
    def item_guid(self, item):
        """
        Takes an item, as return by items(), and returns the item's ID.
        """
        return self.slug + str(item.id)
    def item_author_name(self, item):
        """
        Takes an item, as returned by items(), and returns the item's
        author's name as a normal Python string.
        """
        return item.changed_by
    #def item_author_email(self, item):
    #    """
    #    Takes an item, as returned by items(), and returns the item's
    #    author's e-mail as a normal Python string.
    #    """
    #    if item.user and item.user.email:
    #        return item.user.email
    #    return ''
    def item_pubdate(self, item):
        """
        Takes an item, as returned by items(), and returns the item's
        pubdate.
        """
        return item.changed

class PageHistoryFeed(RecentChangesFeed):
    def __init__(self, slug, request, query, page, *args, **kwdargs):
        self.page = page
        super(PageHistoryFeed, self).__init__(slug, request, query,
                                              *args, **kwdargs)
    def title(self, obj):
        """
        Takes the object returned by get_object() and returns the feed's
        title as a normal Python string.
        """
        page_title = safe_ascii_encode(self.page.title)
        page_url = safe_ascii_encode(self.page.url)
        return 'Recent Changes to "' + page_title + '" [' + page_url + ']'
    def feed_guid(self, obj):
        """
        Takes the object returned by get_object() and returns the globally
        unique ID for the feed as a normal Python string.
        """
        return self.slug + str(self.page.id)
