import py from templess import templess from lxml import etree from PIL import Image from cStringIO import StringIO import helpers class _screenshots(object): """screenshots page""" extensions = ['.gif', '.png', '.jpg'] def get_images(self, serverroot, siteroot): ipath = py.path.svnwc(serverroot) / siteroot / 'screenshots' imagedata = [] for f in ipath.listdir(): if not f.basename.startswith('_') and f.ext in self.extensions: filename = f.basename filepath = '%sscreenshots/%s' % (siteroot, filename) imagedata.append({ 'filepath': filepath, 'filename': filename, 'size': f.size(), 'comment': f.propget('shot:comment').strip(), 'application': f.propget('shot:application').strip(), 'url': f.propget('shot:url').strip(), 'thumbsrc': '?image=%s' % (filename,), }) imagedata.sort(lambda a, b: cmp(a['application'], b['application'])) return imagedata def render(self, context): if context['form'].has_key('image'): return self.render_image(context) else: return self.render_page(context) mimetypes = { '.jpg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif', } imagecache = {} def render_image(self, context): request = context['request'] options = request.get_options() filename = context['form']['image'].value fpath = py.path.local(options['serverroot']) / options['siteroot'] /\ 'screenshots' / filename context['headers']['content-type'] = self.mimetypes[fpath.ext] if self.imagecache.has_key(str(fpath)): mtime, data = self.imagecache[str(fpath)] if mtime == fpath.mtime(): return data image = Image.open(str(fpath)) ts = int(options['thumbsize']) image.thumbnail((ts, ts), Image.ANTIALIAS) temppath = py.test.ensuretemp('screenshot_thumbnails') fp = temppath / filename image.save(str(fp)) data = fp.read() self.imagecache[str(fpath)] = (fp.mtime(), data) temppath.remove() return data def render_page(self, context): request = context['request'] options = request.get_options() env = { 'images': self.get_images(options['serverroot'], options['siteroot']), } f = helpers.templatepath(request) / 'screenshots.html' t = templess.template(f, options.get('charset', 'UTF-8')) return t.render(env).xpath('//body')[0] screenshots = _screenshots()