diff -r 46536daf9e04 -r 8d3ffd87cb0b de-cgi-bin/series.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/de-cgi-bin/series.py Wed Jan 16 14:58:03 2008 +0000 @@ -0,0 +1,214 @@ +#!/usr/bin/env python2.4 +# +# DeGAL - A pretty simple web image gallery +# Copyright (C) 2007 Tero Marttila +# http://marttila.de/~terom/degal/ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +import os +import cgi +import Cookie + +import inc +from lib import shorturl, template, utils, settings + +# +# load request params +# +vars = cgi.FieldStorage() + +# these are interpeted different ways, hence the generic naming +arg1 = vars["keys"].value +if 'index' in vars : + arg2 = vars["index"].value +else : + arg2 = None + +# the cookie with the user's current series +cookie = Cookie.SimpleCookie(os.environ.get('HTTP_COOKIE', None)) + +# a special action? +if arg1 and arg1 in ('add', 'del', 'clear', 'view') or arg2 == 'load' : + # load the keys from the cookie + if 'series' in cookie : + keys = cookie["series"].value.split() + else : + keys = [] + + if arg2 == 'load' : + # set the keys in the user's cookie to those in the URL + keys = arg1.split() + + elif arg1 == 'add' and arg2 not in keys : + # add a code to the list of keys + keys.append(arg2) + + elif arg1 == 'del' and arg2 in keys : + # remove a key from the list of keys + keys.remove(arg2) + + elif arg1 == 'clear' : + # clear out the set of keys + keys = [] + + elif arg1 == 'view' : + # just view them + pass + + # set the series cookie value + cookie['series'] = ' '.join(keys) + cookie['series']['path'] = '/' + + # if we have keys, redirect to them, otherwise, back to index we go + if keys : + redirect_to = "../%s/" % ('+'.join(keys)) + else : + redirect_to = "../.." + + # do the redirect + print "Status: 302" + print "Location: %s" % redirect_to + print cookie + print + print "Redirect..." +else : + # we're just viewing + keys = arg1.split() + + # is this "My Series"? + my_series = 'series' in cookie and cookie['series'].value.split() == keys + + index = fname = None + + if arg2 : + try : + index = int(arg2) + except ValueError : + fname = arg2 + + # load DB + db = shorturl.DB() + + # our custom Series/Image classes, because they do act slightly differently + + class Series (object) : + def __init__ (self, keys) : + self.images = [] + prev = None + + self.image_dict = dict() + + for index, key in enumerate(keys) : + dir, fname = db.image_info(key) + + img = Image(self, key, dir, fname, index) + self.images.append(img) + self.image_dict[fname] = img + + img.prev = prev + + if prev : + prev.next = img + + prev = img + + def render (self) : + if my_series : + descr = 'Clear your series' + else : + descr = 'Load as your series' + + return template.gallery.render( + stylesheet_url = utils.url("style.css", up=2), + + breadcrumb = [(utils.url(up=1), "Index"), (utils.url(), "Series")], + + dirs = None, + title = "Series", + + num_pages = 1, + cur_page = 0, + + images = self.images, + + description = descr, + + shorturl = None, + shorturl_code = None, + ) + + class Image (object) : + def __init__ (self, series, key, dir, fname, index) : + self.fname = fname + self.name = utils.url_join(dir, fname, abs=True) + self.html_name = utils.url(fname) + self.real_html_name = utils.url_join(dir, fname + ".html", abs=True) + + self.thumb_name = utils.url_join(dir, settings.THUMB_DIR, fname, abs=True) + self.preview_name = utils.url_join(dir, settings.PREVIEW_DIR, fname, abs=True) + + self.shorturl = key + + self.prev = self.next = None + + def render (self) : + descr = 'Standalone image' % self.real_html_name + + if my_series : + series_url = utils.url_join("del", self.shorturl, up=1) + series_verb = "Remove from" + else : + series_url = series_verb = "" + + return template.image.render( + stylesheet_url = utils.url("style.css", up=3), + + breadcrumb = [(utils.url(up=2), "Index"), (utils.url("."), "Series"), (self.html_name, self.fname)], + + title = self.fname, + + prev = self.prev, + img = self, + next = self.next, + + description = descr, + + img_size = None, + file_size = None, + timestamp = None, + + shorturl = utils.url_join("s", self.shorturl, abs=True), + shorturl_code = self.shorturl, + + series_url = series_url, + series_verb = series_verb, + ) + + series = Series(keys) + + if fname : + html = series.image_dict[fname].render() + elif index : + html = series.images[index - 1].render() + else : + html = series.render() + + print "Content-Type: text/html" + print + print html +