series.cgi
changeset 1 740133ab6353
child 3 9637b8f24005
equal deleted inserted replaced
0:5dbdcb79024b 1:740133ab6353
       
     1 #!/usr/bin/env python2.4
       
     2 
       
     3 import dbm
       
     4 import cgi
       
     5 import Cookie
       
     6 import os, os.path
       
     7 #import pprint
       
     8 
       
     9 import degal
       
    10 
       
    11 #
       
    12 # load request params
       
    13 #
       
    14 vars = cgi.FieldStorage()
       
    15 
       
    16 # keys = what photos are in the series
       
    17 keys = vars["keys"].value.split()
       
    18 
       
    19 # index = what photo to show, or the index
       
    20 if 'index' in vars :
       
    21     index = vars["index"].value
       
    22 else :
       
    23     index = None
       
    24 
       
    25 if keys and keys[0] in ('add', 'del', 'clear', 'view') or index == 'load' :
       
    26     cookie = Cookie.SimpleCookie(os.environ.get('HTTP_COOKIE', None))
       
    27     act = keys[0]
       
    28     _keys = keys
       
    29 
       
    30     if 'series' in cookie :
       
    31         keys = cookie["series"].value.split()
       
    32     else :
       
    33         keys = []
       
    34     
       
    35     if index == 'load' :
       
    36         keys = _keys
       
    37     elif act == 'add' and index not in keys :
       
    38         keys.append(index)
       
    39     elif act == 'del' :
       
    40         keys.remove(index)
       
    41     elif act == 'clear' :
       
    42         keys = []
       
    43     elif act == 'view' :
       
    44         pass
       
    45     
       
    46     cookie['series'] = ' '.join(keys)
       
    47     cookie['series']['path'] = '/'
       
    48 
       
    49     if keys :
       
    50         redirect_to = "../%s/" % ('+'.join(keys))
       
    51     else :
       
    52         redirect_to = "../.."
       
    53 
       
    54     print "Status: 302"
       
    55     print "Location: %s" % redirect_to
       
    56     print cookie
       
    57     print
       
    58     print "Redirect..."
       
    59 else :
       
    60     cookie = Cookie.SimpleCookie(os.environ.get('HTTP_COOKIE', None))
       
    61 
       
    62     my_series = 'series' in cookie and cookie['series'].value.split() == keys 
       
    63         
       
    64     if index :
       
    65         index = int(index)
       
    66 
       
    67     #
       
    68     # load DB
       
    69     #
       
    70     db = dbm.open('shorturls', 'r')
       
    71 
       
    72     #
       
    73     # get the Image objects
       
    74     #
       
    75     photos = []
       
    76 
       
    77     INDEX_URL = "/series/%s/"
       
    78     IMAGE_URL = "/series/%s/%d"
       
    79 
       
    80     # monkey-patch the templates
       
    81     rendered_templates = []
       
    82 
       
    83     def _myRenderTo (self, path, **vars) :
       
    84         rendered_templates.append(self.render(**vars))
       
    85 
       
    86     degal.Template.renderTo = _myRenderTo
       
    87 
       
    88     # our own version of Folder
       
    89     class Series (degal.Folder) :
       
    90         def __init__ (self) :
       
    91             super(Series, self).__init__()
       
    92             
       
    93             self.alive = True
       
    94             self.filtered = False
       
    95             self.subdirs = {}
       
    96             self.images = {}
       
    97             self.sorted_images = []
       
    98             self.title = "Series"
       
    99 
       
   100             if my_series :
       
   101                 self.descr = '<a href="../clear/">Clear your series</a>'
       
   102             else :
       
   103                 self.descr = '<a href="load">Load as your series</a>'
       
   104 
       
   105             self.shorturl_code = ''
       
   106         
       
   107         def breadcrumb (self) :
       
   108             return [('../..', 'Gallery'), ('.', 'Series')]
       
   109 
       
   110         def inRoot (self, *fnames) :
       
   111             return os.path.join('../..', *fnames)
       
   112 
       
   113     #    def pathFor (self, *fnames) :
       
   114     #        return os.path.join(fnames)
       
   115 
       
   116     class Image (degal.Image) :
       
   117         def __init__ (self, series, key, i) :
       
   118             path = db[key]
       
   119             path = path.rstrip(".html")
       
   120             self.dir_name, self.image_name = os.path.split(path)
       
   121 
       
   122             super(Image, self).__init__(series, self.image_name)
       
   123             
       
   124             self.path = path
       
   125             self.shorturl_code = key
       
   126             self.html_path = self.html_name = str(i + 1)
       
   127             self.title = 'Image %d' % (i + 1, )
       
   128             self.descr = '<span style="font-size: x-small">Standalone image: <a href="%s.html">%s</a></span>' % (self._path(), self._path().lstrip('./'))
       
   129             self.img_size = (-1, -1)
       
   130             self.filesize = 0
       
   131             self.timestamp = 0
       
   132 
       
   133             if my_series :
       
   134                 self.series_act = "del"
       
   135                 self.series_verb = "Remove from"
       
   136             else :
       
   137                 self.series_act = self.series_verb = ""
       
   138 
       
   139         def breadcrumb (self) :
       
   140             return [('../..', 'Gallery'), ('.', 'Series'), (self.html_name, self.title)]
       
   141 
       
   142         def _path (self, blaa='') :
       
   143             return os.path.join('../..', self.dir_name, blaa, self.image_name)
       
   144 
       
   145         def thumbImgTag (self) :
       
   146             return degal.link(self.html_name, "<img src='%s' alt='%s' title='%s'>" % (os.path.join('../..', self.dir_name, degal.THUMB_DIR, self.image_name), '', self.title))
       
   147 
       
   148         def previewImgTag (self) :
       
   149             return degal.link(os.path.join('../..', self.dir_name, self.image_name), "<img src='%s' alt='%s' title='%s'>" % (os.path.join('../..', self.dir_name, degal.PREVIEW_DIR, self.image_name), '', self.title))
       
   150 
       
   151            
       
   152 
       
   153     series = Series()
       
   154 
       
   155     try :
       
   156         prev = None
       
   157 
       
   158         for i, key in enumerate(keys) :
       
   159             img = Image(series, key, i)
       
   160 
       
   161             if prev :
       
   162                 prev.next = img
       
   163 
       
   164             img.prev = prev
       
   165             prev = img
       
   166 
       
   167     #        series.images[str(i + 1)] = img
       
   168             series.sorted_images.append(img)
       
   169     finally :
       
   170         db.close()
       
   171 
       
   172     if index :
       
   173         img = series.sorted_images[index - 1]
       
   174 
       
   175         img.render()
       
   176     else :
       
   177         series.render()
       
   178 
       
   179     print "Content-Type: text/html"
       
   180     print
       
   181     print rendered_templates[0]
       
   182