comparison bitsyblog/blog.py @ 84:e5a23f5ea14e

make cooked bodies depend on file mtime
author Jeff Hammel <jhammel@mozilla.com>
date Thu, 17 Nov 2011 13:18:51 -0800
parents 666f3051ce31
children c7495fb71045
comparison
equal deleted inserted replaced
83:666f3051ce31 84:e5a23f5ea14e
1 """blog interfaces to data for bitsy""" 1 """blog interfaces to data for bitsy"""
2 2
3 import datetime
3 import os 4 import os
4 import utils 5 import utils
5 6
6 from cStringIO import StringIO 7 from cStringIO import StringIO
7 from glob import glob 8 from glob import glob
8 from pkg_resources import iter_entry_points 9 from pkg_resources import iter_entry_points
9 10
10 class BlogEntry(object): 11 class BlogEntry(object):
11 """interface class for a blog entry""" 12 """interface class for a blog entry"""
12 def __init__(self, date, body, privacy, user): 13 def __init__(self, date, body, privacy, user, modified=None):
13 self.date = date 14 self.date = date
14 self.body = body 15 self.body = body
15 self.privacy = privacy 16 self.privacy = privacy
17 self._modified = modified
16 if user is not None: 18 if user is not None:
17 self.user = user 19 self.user = user
18 20
19 def title(self, characters=80): 21 def title(self, characters=80):
20 22
46 return self.body 48 return self.body
47 return '' 49 return ''
48 50
49 def datestamp(self): 51 def datestamp(self):
50 return utils.datestamp(self.date) 52 return utils.datestamp(self.date)
53
54 def modified(self):
55 """returns the last modification date"""
56 return self._modified or self.datestamp()
57
51 58
52 class Blog(object): 59 class Blog(object):
53 """abstract class for a users' blog""" 60 """abstract class for a users' blog"""
54 61
55 def __call__(self, user, permissions=('public',), number=None): 62 def __call__(self, user, permissions=('public',), number=None):
100 107
101 def body(self, user, datestamp, permission): 108 def body(self, user, datestamp, permission):
102 return file(self.location(user, permission, datestamp)).read() 109 return file(self.location(user, permission, datestamp)).read()
103 110
104 def get_entry(self, user, datestamp, permission): 111 def get_entry(self, user, datestamp, permission):
105 return BlogEntry(utils.date(datestamp), 112 modified = datetime.datetime.fromtimestamp(os.path.getmtime(self.location(user, permission, datestamp)))
113 return BlogEntry(utils.date(datestamp),
106 self.body(user, datestamp, permission), 114 self.body(user, datestamp, permission),
107 permission, user) 115 permission, user, modified=modified)
108 116
109 ### interfaces from Blog 117 ### interfaces from Blog
110 118
111 def blog(self, user, permissions, number=None): 119 def blog(self, user, permissions, number=None):
112 entries = [] 120 entries = []
113 for permission in permissions: 121 for permission in permissions:
114 entries.extend([ (entry, permission) 122 entries.extend([(entry, permission)
115 for entry in os.listdir(self.location(user, permission)) ]) 123 for entry in os.listdir(self.location(user, permission)) ])
116 entries.sort(key=lambda x: x[0], reverse=True) 124 entries.sort(key=lambda x: x[0], reverse=True)
117 125
118 if number is not None: 126 if number is not None:
119 entries = entries[:number] 127 entries = entries[:number]
120 128
121 return [ self.get_entry(user, x[0], x[1]) for x in entries ] 129 return [ self.get_entry(user, x[0], x[1]) for x in entries ]
122 130
142 index += 1 150 index += 1
143 151
144 # get the blog entries 152 # get the blog entries
145 entries = [] 153 entries = []
146 for permission in permissions: 154 for permission in permissions:
147 entries.extend([ (os.path.split(entry)[-1], permission) 155 entries.extend([(os.path.split(entry)[-1], permission)
148 for entry in glob(os.path.join(self.location(user, permission), glob_expr)) ]) 156 for entry in glob(os.path.join(self.location(user, permission), glob_expr))])
149 entries.sort(key=lambda x: x[0], reverse=True) 157 entries.sort(key=lambda x: x[0], reverse=True)
150 return [ self.get_entry(user, x[0], x[1]) for x in entries ] 158 return [ self.get_entry(user, x[0], x[1]) for x in entries ]
151 159
152 def post(self, user, datestamp, body, privacy): 160 def post(self, user, datestamp, body, privacy):
153 blog = file(self.location(user, privacy, datestamp), 'w') 161 blog = file(self.location(user, privacy, datestamp), 'w')