# HG changeset patch # User paulo # Date 1370244624 25200 # Node ID 496714f2fd8cb54bf47e166f870a952e51cb8474 # Parent 0482bffd7d7f0fefe85849481ca118cee9658679 first live version of pics2 diff -r 0482bffd7d7f -r 496714f2fd8c pics2/pics_app.py --- a/pics2/pics_app.py Sat Jun 01 20:43:00 2013 -0700 +++ b/pics2/pics_app.py Mon Jun 03 00:30:24 2013 -0700 @@ -2,6 +2,9 @@ import re import glob import traceback +import datetime +import random +import urlparse import html @@ -14,14 +17,19 @@ -def _get_pics_url(environ, dirpath): - script_name = environ.get("SCRIPT_NAME", '') - return os.path.normpath(os.path.join(os.path.dirname(script_name), dirpath)) +def _is_pics_dir(dirpath): + return os.path.exists(os.path.join(dirpath, "_picsroot")) -def _get_app_url(environ, dirpath): - script_name = environ.get("SCRIPT_NAME", '') - return os.path.normpath(os.path.join(script_name, dirpath)) +def _get_dir_dt(dirpath): + if _is_pics_dir(dirpath): + dirpath = os.path.join(dirpath, "_picsroot") + + return datetime.datetime.fromtimestamp(os.stat(dirpath).st_mtime) + + +def _format_dt(dt): + return dt.strftime("%Y-%m-%d") def _parse_path_info(path_info): @@ -32,18 +40,6 @@ return ppi -def _get_standard_html_doc(title): - root = html.HTML("html") - - header = root.header - header.title(title) - - body = root.body - body.h1(title) - - return (root, header, body) - - def _numeric_pad_basename(path, maxdigits=20): return os.path.basename(path).zfill(maxdigits) @@ -57,98 +53,170 @@ logging.debug("browse_fns = %s" % browse_fns) return zip(thumb_fns, browse_fns) - - -def _go_thumbnail_links_to_browse_imgs_html_body(environ, body, t, b): - thumb_img_url = _get_pics_url(environ, t) - browse_url = _get_app_url(environ, b) - body.a(href=browse_url).img(src=thumb_img_url) - - -def main(environ): - page_func = None - - logging.debug("environ['PATH_INFO'] = %s" % environ["PATH_INFO"]) - logging.debug("environ['SCRIPT_NAME'] = %s" % environ["SCRIPT_NAME"]) - - pi = environ["PATH_INFO"] - ppi = _parse_path_info(pi) - logging.debug("ppi = %s" % ppi) - - if len(ppi) < 1 or ppi[0] != '': - raise AssertionError("Parsed path length must start empty: " + pi) - - if len(ppi) >= 2 and os.path.exists(os.path.join(ppi[1], "_picsroot")): - if len(ppi) == 2: - page_func = page_thumbs - elif len(ppi) >= 4 and ppi[2] == "browse" and os.path.exists(os.path.join(*ppi)): - page_func = page_browse - elif len(ppi) == 1: - page_func = page_index - - if page_func is None: - raise RuntimeError("Cannot find path: " + pi) - - return unicode(page_func(environ)).encode("utf-8") -def page_index(environ): - (html_root, html_header, html_body) = _get_standard_html_doc("pics index") +class Main: + def _get_pics_url(self, dirpath): + script_name = self._environ.get("SCRIPT_NAME", '') + return os.path.normpath(os.path.join(os.path.dirname(script_name), dirpath)) + + + def _get_app_url(self, dirpath): + script_name = self._environ.get("SCRIPT_NAME", '') + return os.path.normpath(os.path.join(script_name, dirpath)) + + + def _get_standard_html_doc(self, title): + root = html.HTML("html") + + header = root.header + header.link(rel="stylesheet", type="text/css", href=self._get_pics_url("index.css")) + header.title(title) + + body = root.body + body.h1(title) + + return (root, header, body) + + + def _go_thumbnail_links_to_browse_imgs_html_body(self, body, t, b, selclass=None): + thumb_img_url = self._get_pics_url(t) + browse_url = self._get_app_url(b) - return html_root + a = body.a(href=browse_url) + if selclass is not None: + a.img(src=thumb_img_url, klass=selclass) + else: + a.img(src=thumb_img_url) -def page_thumbs(environ): - ppi = _parse_path_info(environ["PATH_INFO"]) - d = os.path.join(*ppi) - (html_root, html_header, html_body) = _get_standard_html_doc(d) + body.text(' ') + + + def __init__(self, environ): + self._environ = environ + self._page_func = None + + #logging.debug("environ = %s" % (sorted(self._environ.items(), key=lambda x: x[0]),)) + logging.debug("environ['PATH_INFO'] = %s" % self._environ["PATH_INFO"]) + logging.debug("environ['SCRIPT_NAME'] = %s" % self._environ["SCRIPT_NAME"]) + logging.debug("environ['QUERY_STRING'] = %s" % self._environ["QUERY_STRING"]) + + pi = self._environ["PATH_INFO"] + ppi = _parse_path_info(pi) + logging.debug("ppi = %s" % ppi) + + if len(ppi) < 1 or ppi[0] != '': + raise AssertionError("Parsed path length must start empty: " + pi) + + if len(ppi) >= 2 and _is_pics_dir(ppi[1]): + if len(ppi) == 2: + self._page_func = self.page_thumbs + elif len(ppi) >= 4 and ppi[2] == "browse" and os.path.exists(os.path.join(*ppi)): + self._page_func = self.page_browse + elif len(ppi) == 1: + self._page_func = self.page_index + + if self._page_func is None: + raise RuntimeError("Cannot find path: " + pi) + - html_p = html_body.p - for (t, b) in _get_images(d): - _go_thumbnail_links_to_browse_imgs_html_body(environ, html_p, t, b) + def page(self): + return unicode(self._page_func()).encode("utf-8") + - return html_root + def page_index(self): + n = 5 # number of thumbnails to display + (html_root, html_header, html_body) = self._get_standard_html_doc("Pictures") + + pics_dirs = [] + for i in os.listdir('.'): + if _is_pics_dir(i): + pics_dirs.append((i, _get_dir_dt(i))) + + pics_dirs.sort(key=lambda x: x[1], reverse=True) + + for (d, dt) in pics_dirs: + html_body.h2.a(d, href=self._get_app_url(d)) + html_body.h3(_format_dt(dt)) + + imgs = _get_images(d) + imgs_idx = [(i, img) for (i, img) in enumerate(imgs)] + + sampled_imgs_idx = random.sample(imgs_idx, min(len(imgs_idx), n)) + sampled_imgs_idx.sort(key=lambda x: x[0]) + + html_p = html_body.p + for (i, (t, b)) in sampled_imgs_idx: + self._go_thumbnail_links_to_browse_imgs_html_body(html_p, t, b) + + return html_root + + + def page_thumbs(self): + ppi = _parse_path_info(self._environ["PATH_INFO"]) + d = os.path.join(*ppi) + (html_root, html_header, html_body) = self._get_standard_html_doc(d) -def page_browse(environ): - ppi = _parse_path_info(environ["PATH_INFO"]) - d = os.path.join(*ppi[:2]) - imgs = _get_images(d) - img = os.path.join(*ppi) - - # thumbnail preview ribbon - w = 7 # must be odd - v = w/2 - imgs_circ = [None] * w - x = None - n = len(imgs) - for (i, (t, b)) in enumerate(imgs): - if b == img: - x = i + 1 - imgs_circ[v] = (t, b) - for j in range(1, v + 1): - if (i + j) < n: imgs_circ[v + j] = imgs[i + j] - if (i - j) >= 0: imgs_circ[v - j] = imgs[i - j] - - break - - if x is None: - raise AssertionError - - (html_root, html_header, html_body) = _get_standard_html_doc(u"%s \u2014 %s of %s" % (d, x, len(imgs))) - - browse_img_url = _get_pics_url(environ, img) - html_body.p.img(src=browse_img_url) - - logging.debug("imgs_circ = %s" % imgs_circ) - - html_p_ribbon = html_body.p - for i in imgs_circ: - if i is not None: - (t, b) = i - _go_thumbnail_links_to_browse_imgs_html_body(environ, html_p_ribbon, t, b) - - return html_root + qs = urlparse.parse_qs(self._environ["QUERY_STRING"]) + from_img = None + if "from" in qs: + from_img = qs["from"][0] + + html_p = html_body.p + for (t, b) in _get_images(d): + if from_img is not None and b == from_img: + self._go_thumbnail_links_to_browse_imgs_html_body(html_p, t, b, "sel2") + else: + self._go_thumbnail_links_to_browse_imgs_html_body(html_p, t, b) + + html_body.a("(Other pictures)", href=self._get_app_url('')) + return html_root + + + def page_browse(self): + ppi = _parse_path_info(self._environ["PATH_INFO"]) + d = os.path.join(*ppi[:2]) + imgs = _get_images(d) + img = os.path.join(*ppi) + + # thumbnail preview ribbon + w = 7 # must be odd + v = w/2 + imgs_circ = [None] * w + x = None + n = len(imgs) + for (i, (t, b)) in enumerate(imgs): + if b == img: + x = i + 1 + imgs_circ[v] = (t, b) + for j in range(1, v + 1): + if (i + j) < n: imgs_circ[v + j] = imgs[i + j] + if (i - j) >= 0: imgs_circ[v - j] = imgs[i - j] + + break + + if x is None: + raise AssertionError + + (html_root, html_header, html_body) = self._get_standard_html_doc(u"%s \u2014 %s of %s" % (d, x, len(imgs))) + + browse_img_url = self._get_pics_url(img) + html_body.p.img(src=browse_img_url) + + logging.debug("imgs_circ = %s" % imgs_circ) + + html_p = html_body.p + for i in imgs_circ: + if i is not None: + (t, b) = i + if b == img: + self._go_thumbnail_links_to_browse_imgs_html_body(html_p, t, d + "?from=" + img, "sel") + else: + self._go_thumbnail_links_to_browse_imgs_html_body(html_p, t, b) + + return html_root def app(environ, start_response): @@ -156,7 +224,7 @@ response_type = "text/plain; charset=UTF-8" try: - response_body = main(environ) + response_body = Main(environ).page() response_code = "200 OK" response_type = "text/html; charset=UTF-8" except: