| 1 | from nevow.rend import Page |
|---|
| 2 | from nevow.inevow import IRequest |
|---|
| 3 | |
|---|
| 4 | from eridanus.atom import tostring, Feed, Entry, Link, Author, Content, E |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | class FeedPage(Page): |
|---|
| 8 | maxItems = 50 |
|---|
| 9 | feedId = None |
|---|
| 10 | |
|---|
| 11 | def __init__(self): |
|---|
| 12 | super(FeedPage, self).__init__() |
|---|
| 13 | |
|---|
| 14 | def getFeed(self): |
|---|
| 15 | raise NotImplementedError() |
|---|
| 16 | |
|---|
| 17 | def renderHTTP(self, ctx): |
|---|
| 18 | req = IRequest(ctx) |
|---|
| 19 | req.setHeader('Content-Type', 'application/atom+xml') |
|---|
| 20 | data = tostring(self.getFeed().serialize()) |
|---|
| 21 | req.write(data) |
|---|
| 22 | return '' |
|---|
| 23 | |
|---|
| 24 | |
|---|
| 25 | class ChannelFeed(FeedPage): |
|---|
| 26 | feedId = 'http://linkdb.slipgate.za.net/' |
|---|
| 27 | |
|---|
| 28 | def __init__(self, manager, **kw): |
|---|
| 29 | super(ChannelFeed, self).__init__(**kw) |
|---|
| 30 | self.manager = manager |
|---|
| 31 | |
|---|
| 32 | def entryContent(self, entry): |
|---|
| 33 | initialComment = entry.initialComment |
|---|
| 34 | if initialComment is not None: |
|---|
| 35 | initialComment = E('span')[u' \u2013 \u201c%s\u201d' % (entry.initialComment.comment,)] |
|---|
| 36 | |
|---|
| 37 | comments = entry.comments |
|---|
| 38 | if comments is not None: |
|---|
| 39 | comments = E('ul')[ |
|---|
| 40 | [E('li')[u'\u201c%s\u201d \u2013 %s' % (c.comment, c.nick)] for c in comments]] |
|---|
| 41 | |
|---|
| 42 | network = self.manager.config.service.serviceID |
|---|
| 43 | channel = entry.channel.strip('#') |
|---|
| 44 | href = '/Eridanus/%s/%s/%s' % (network, channel, entry.eid) |
|---|
| 45 | |
|---|
| 46 | return E('div', xmlns='http://www.w3.org/1999/xhtml')[ |
|---|
| 47 | E('a', href=href)['#%s' % (entry.eid,)], |
|---|
| 48 | E('span')[u': Posted by %s.' % (entry.nick,)], |
|---|
| 49 | initialComment, |
|---|
| 50 | comments] |
|---|
| 51 | |
|---|
| 52 | |
|---|
| 53 | def entryFromEntry(self, entry): |
|---|
| 54 | content = self.entryContent(entry) |
|---|
| 55 | return Entry(id=unicode(entry.eid), |
|---|
| 56 | title=entry.displayTitle, |
|---|
| 57 | updated=entry.modified, |
|---|
| 58 | links=[Link(rel='alternate', href=entry.url)], |
|---|
| 59 | authors=[Author(name=entry.nick)], |
|---|
| 60 | content=Content(content, type='xhtml')) |
|---|
| 61 | |
|---|
| 62 | def getFeed(self): |
|---|
| 63 | entries = list(self.manager.getEntries(limit=self.maxItems)) |
|---|
| 64 | atomEntries = (self.entryFromEntry(e) for e in entries) |
|---|
| 65 | |
|---|
| 66 | title = u'%s links' % (self.manager.channel,) |
|---|
| 67 | href = '/Eridanus/feeds/%s' % (self.manager.channel.strip('#'),) |
|---|
| 68 | return Feed(id=self.feedId, |
|---|
| 69 | title=title, |
|---|
| 70 | updated=entries[0].modified, |
|---|
| 71 | links=[Link(rel='self', href=href)], |
|---|
| 72 | entries=atomEntries) |
|---|