~dosage-dev/dosage/test-mode

« back to all changes in this revision

Viewing changes to dosage/events.py

  • Committer: ns
  • Date: 2009-12-01 06:48:02 UTC
  • Revision ID: ns@ww1aviationlinks.cjb.net-20091201064802-vu1ln6jdnn11gzks
repair for LookinForGroup

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import os.path
2
 
import time
3
 
import rss
4
 
import urllib
5
 
import util
6
 
 
7
 
class EventHandler(object):
8
 
    def __init__(self, basepath, baseurl):
9
 
        self.basepath = basepath
10
 
        self.baseurl = baseurl or self.getBaseUrl()
11
 
 
12
 
    def getBaseUrl(self):
13
 
        '''Return a file: URL that probably points to the basedir.
14
 
 
15
 
        This is used as a halfway sane default when the base URL is not
16
 
        provided; not perfect, but should work in most cases.'''
17
 
        components = util.splitpath(os.path.abspath(self.basepath))
18
 
        url = '/'.join([urllib.quote(component, '') for component in components])
19
 
        return 'file:///' + url + '/'
20
 
 
21
 
    def getUrlFromFilename(self, filename):
22
 
        components = util.splitpath(util.getRelativePath(self.basepath, filename))
23
 
        url = '/'.join([urllib.quote(component, '') for component in components])
24
 
        return self.baseurl + url
25
 
 
26
 
    def start(self):
27
 
        pass
28
 
 
29
 
    def comicDownloaded(self, comic, filename):
30
 
        pass
31
 
 
32
 
    def end(self):
33
 
        pass
34
 
 
35
 
class TextEventHandler(EventHandler):
36
 
    pass
37
 
 
38
 
class RSSEventHandler(EventHandler):
39
 
    def RFC822Date(self, indate):
40
 
        return time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(indate))
41
 
 
42
 
    def getFilename(self):
43
 
        return os.path.abspath(os.path.join(self.basepath, 'dailydose.rss'))
44
 
 
45
 
    def start(self):
46
 
        today = time.time()
47
 
        yesterday = today - 86400
48
 
        today = time.localtime(today)
49
 
        yesterday = time.localtime(yesterday)
50
 
 
51
 
        link = 'http://slipgate.za.net/dosage/'
52
 
 
53
 
        self.rssfn = self.getFilename()
54
 
 
55
 
        if os.path.exists(self.rssfn):
56
 
            self.newfile = False
57
 
            self.rss = rss.parseFeed(self.rssfn, yesterday)
58
 
        else:
59
 
            self.newfile = True
60
 
            self.rss = rss.Feed('Daily Dosage', link, 'Comics for %s' % time.strftime('%Y/%m/%d', today))
61
 
 
62
 
    def comicDownloaded(self, comic, filename):
63
 
        url = self.getUrlFromFilename(filename)
64
 
        args = (
65
 
            '%s - %s' % (comic, os.path.basename(filename)),
66
 
            url,
67
 
            '<a href="%s">View Comic</a>' % (url,),
68
 
            self.RFC822Date(time.time())
69
 
        )
70
 
 
71
 
        if self.newfile:
72
 
            self.newfile = False
73
 
            self.rss.addItem(*args)
74
 
        else:
75
 
            self.rss.insertHead(*args)
76
 
 
77
 
    def end(self):
78
 
        self.rss.write(self.rssfn)
79
 
 
80
 
class HtmlEventHandler(EventHandler):
81
 
    def fnFromDate(self, date):
82
 
        fn = time.strftime('comics-%Y%m%d.html', date)
83
 
        fn = os.path.join(self.basepath, 'html', fn)
84
 
        fn = os.path.abspath(fn)
85
 
        return fn
86
 
 
87
 
    def start(self):
88
 
        today = time.time()
89
 
        yesterday = today - 86400
90
 
        tomorrow = today + 86400
91
 
        today = time.localtime(today)
92
 
        yesterday = time.localtime(yesterday)
93
 
        tomorrow = time.localtime(tomorrow)
94
 
 
95
 
        fn = self.fnFromDate(today)
96
 
        assert not os.path.exists(fn), 'Comic page for today already exists!'
97
 
 
98
 
        d = os.path.dirname(fn)
99
 
        if not os.path.isdir(d):
100
 
            os.makedirs(d)
101
 
 
102
 
        yesterdayUrl = self.getUrlFromFilename(self.fnFromDate(yesterday))
103
 
        tomorrowUrl = self.getUrlFromFilename(self.fnFromDate(tomorrow))
104
 
 
105
 
        self.html = file(fn, 'w')
106
 
        self.html.write('''<html>
107
 
<head>
108
 
<title>Comics for %s</title>
109
 
</head>
110
 
<body>
111
 
<a href="%s">Previous Day</a> | <a href="%s">Next Day</a>
112
 
<ul>
113
 
''' % (time.strftime('%Y/%m/%d', today), yesterdayUrl, tomorrowUrl))
114
 
 
115
 
        self.lastComic = None
116
 
 
117
 
    def comicDownloaded(self, comic, filename):
118
 
        if self.lastComic != comic:
119
 
            self.newComic(comic)
120
 
        url = self.getUrlFromFilename(filename)
121
 
        self.html.write('        <li><a href="%s">%s</a></li>\n' % (url, os.path.basename(filename)))
122
 
 
123
 
    def newComic(self, comic):
124
 
        if self.lastComic is not None:
125
 
            self.html.write('    </ul>\n')
126
 
        self.lastComic = comic
127
 
        self.html.write('''    <li>%s</li>
128
 
    <ul>
129
 
''' % (comic,))
130
 
 
131
 
    def end(self):
132
 
        if self.lastComic is not None:
133
 
            self.html.write('    </ul>\n')
134
 
        self.html.write('''</ul>
135
 
</body>
136
 
</html>''')
137
 
        self.html.close()
138
 
 
139
 
 
140
 
handlers = {
141
 
    'text': TextEventHandler,
142
 
    'html': HtmlEventHandler,
143
 
    'rss': RSSEventHandler,
144
 
}
145
 
 
146
 
def getHandlers():
147
 
    l = handlers.keys()
148
 
    l.sort()
149
 
    return l
150
 
 
151
 
def installHandler(name=None, basepath=None, baseurl=None):
152
 
    global handler
153
 
    if name is None:
154
 
        name = 'text'
155
 
    if basepath is None:
156
 
        basepath = '.'
157
 
    handler = handlers[name](basepath, baseurl)
158
 
 
159
 
installHandler()