~nchohan/appscale/zk3.3.4

« back to all changes in this revision

Viewing changes to AppServer/lib/django/django/contrib/syndication/feeds.py

  • Committer: Navraj Chohan
  • Date: 2009-03-28 01:14:04 UTC
  • Revision ID: nchohan@cs.ucsb.edu-20090328011404-42m1w6yt60m6yfg3
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
 
2
from django.template import Context, loader, Template, TemplateDoesNotExist
 
3
from django.contrib.sites.models import Site
 
4
from django.utils import feedgenerator
 
5
from django.conf import settings
 
6
 
 
7
def add_domain(domain, url):
 
8
    if not url.startswith('http://'):
 
9
        url = u'http://%s%s' % (domain, url)
 
10
    return url
 
11
 
 
12
class FeedDoesNotExist(ObjectDoesNotExist):
 
13
    pass
 
14
 
 
15
class Feed(object):
 
16
    item_pubdate = None
 
17
    item_enclosure_url = None
 
18
    feed_type = feedgenerator.DefaultFeed
 
19
    title_template = None
 
20
    description_template = None
 
21
 
 
22
    def __init__(self, slug, feed_url):
 
23
        self.slug = slug
 
24
        self.feed_url = feed_url
 
25
        self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
 
26
        self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
 
27
 
 
28
    def item_link(self, item):
 
29
        try:
 
30
            return item.get_absolute_url()
 
31
        except AttributeError:
 
32
            raise ImproperlyConfigured, "Give your %s class a get_absolute_url() method, or define an item_link() method in your Feed class." % item.__class__.__name__
 
33
 
 
34
    def __get_dynamic_attr(self, attname, obj, default=None):
 
35
        try:
 
36
            attr = getattr(self, attname)
 
37
        except AttributeError:
 
38
            return default
 
39
        if callable(attr):
 
40
            # Check func_code.co_argcount rather than try/excepting the
 
41
            # function and catching the TypeError, because something inside
 
42
            # the function may raise the TypeError. This technique is more
 
43
            # accurate.
 
44
            if hasattr(attr, 'func_code'):
 
45
                argcount = attr.func_code.co_argcount
 
46
            else:
 
47
                argcount = attr.__call__.func_code.co_argcount
 
48
            if argcount == 2: # one argument is 'self'
 
49
                return attr(obj)
 
50
            else:
 
51
                return attr()
 
52
        return attr
 
53
 
 
54
    def get_feed(self, url=None):
 
55
        """
 
56
        Returns a feedgenerator.DefaultFeed object, fully populated, for
 
57
        this feed. Raises FeedDoesNotExist for invalid parameters.
 
58
        """
 
59
        if url:
 
60
            try:
 
61
                obj = self.get_object(url.split('/'))
 
62
            except (AttributeError, ObjectDoesNotExist):
 
63
                raise FeedDoesNotExist
 
64
        else:
 
65
            obj = None
 
66
 
 
67
        current_site = Site.objects.get_current()
 
68
        link = self.__get_dynamic_attr('link', obj)
 
69
        link = add_domain(current_site.domain, link)
 
70
 
 
71
        feed = self.feed_type(
 
72
            title = self.__get_dynamic_attr('title', obj),
 
73
            link = link,
 
74
            description = self.__get_dynamic_attr('description', obj),
 
75
            language = settings.LANGUAGE_CODE.decode(),
 
76
            feed_url = add_domain(current_site, self.__get_dynamic_attr('feed_url', obj)),
 
77
            author_name = self.__get_dynamic_attr('author_name', obj),
 
78
            author_link = self.__get_dynamic_attr('author_link', obj),
 
79
            author_email = self.__get_dynamic_attr('author_email', obj),
 
80
            categories = self.__get_dynamic_attr('categories', obj),
 
81
            feed_copyright = self.__get_dynamic_attr('feed_copyright', obj),
 
82
        )
 
83
 
 
84
        try:
 
85
            title_tmp = loader.get_template(self.title_template_name)
 
86
        except TemplateDoesNotExist:
 
87
            title_tmp = Template('{{ obj }}')
 
88
        try:
 
89
            description_tmp = loader.get_template(self.description_template_name)
 
90
        except TemplateDoesNotExist:
 
91
            description_tmp = Template('{{ obj }}')
 
92
 
 
93
        for item in self.__get_dynamic_attr('items', obj):
 
94
            link = add_domain(current_site.domain, self.__get_dynamic_attr('item_link', item))
 
95
            enc = None
 
96
            enc_url = self.__get_dynamic_attr('item_enclosure_url', item)
 
97
            if enc_url:
 
98
                enc = feedgenerator.Enclosure(
 
99
                    url = enc_url.decode('utf-8'),
 
100
                    length = str(self.__get_dynamic_attr('item_enclosure_length', item)).decode('utf-8'),
 
101
                    mime_type = self.__get_dynamic_attr('item_enclosure_mime_type', item).decode('utf-8'),
 
102
                )
 
103
            author_name = self.__get_dynamic_attr('item_author_name', item)
 
104
            if author_name is not None:
 
105
                author_email = self.__get_dynamic_attr('item_author_email', item)
 
106
                author_link = self.__get_dynamic_attr('item_author_link', item)
 
107
            else:
 
108
                author_email = author_link = None
 
109
            feed.add_item(
 
110
                title = title_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
 
111
                link = link,
 
112
                description = description_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
 
113
                unique_id = link,
 
114
                enclosure = enc,
 
115
                pubdate = self.__get_dynamic_attr('item_pubdate', item),
 
116
                author_name = author_name,
 
117
                author_email = author_email,
 
118
                author_link = author_link,
 
119
                categories = self.__get_dynamic_attr('item_categories', item),
 
120
                item_copyright = self.__get_dynamic_attr('item_copyright', item),
 
121
            )
 
122
        return feed