# HG changeset patch # User terom # Date 1198271941 0 # Node ID 0fe851a29bc680f6785f384ad061242f1bd50f94 # Parent 4b5478da585054bfe56ffcb63d91ece28a22effe detool.py, meant to be a collection of utility operations, currently lets you move images and their html/thumb/preview files at the same time diff -r 4b5478da5850 -r 0fe851a29bc6 detool.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/detool.py Fri Dec 21 21:19:01 2007 +0000 @@ -0,0 +1,106 @@ +#!/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. +# + +from lib import settings +from lib.log import misc as log +from lib.utils import path_join +import os, os.path, logging + +def move (options, args) : + if len(args) < 2 : + raise Exception("Must give one or more source files, and a destination dir") + + dest = args.pop(-1) + srcs = args + + if not os.path.isdir(dest) : + raise Exception("Given destination '%s' is not a directory" % dest) + + for subdir in (settings.THUMB_DIR, settings.PREVIEW_DIR) : + path = os.path.join(dest, subdir) + + if not os.path.exists(path) : + log.info("mkdir %s" % path) + os.mkdir(path) + + for src in srcs : + if not os.path.isfile(src) : + raise Exception("Given source file '%s' is not a valid file" % src) + + for (pre, post) in ( + (None, None), + (settings.THUMB_DIR, None), + (settings.PREVIEW_DIR, None), + (None, '.html'), + ) : + dir, fname = os.path.split(src) + + if post : + fname += post + + src_path = path_join(dir, pre, fname) + dst_path = path_join(dest, pre, fname) + + if os.path.isfile(src_path) : + if not options.overwite and os.path.exists(dst_path) : + log.warning("%s exists; skipping %s" % (dst_path, src_path)) + log.info("%s -> %s" % (src_path, dst_path)) + os.rename(src_path, dst_path) + +def help (options, args) : + print "Available commands:" + + for name, func in COMMANDS.iteritems() : + print "\t%s" % name + +COMMANDS = dict( + move = move, + mv = move, + help = help, +) + +if __name__ == '__main__' : + from optparse import OptionParser + + parser = OptionParser(usage="usage: %prog [options] [args ...]", version=settings.VERSION) + + parser.add_option("-q", "--quiet", dest="verbose", default=True) + parser.add_option("-i", "--careful", dest="overwrite", help="Do not overwrite files", default=True) + + options, args = parser.parse_args() + + if options.verbose : + log.setLevel(logging.INFO) + else : + log.setLevel(logging.ERROR) + + if not args : + parser.error("Must supply a command. See `detool.py help` for a list of commands") + + command = args.pop(0).lower() + + if command not in COMMANDS : + parser.error("Unknown command '%s'. Try `detool.py help`" % command) + + func = COMMANDS[command] + + func(options, args) \ No newline at end of file diff -r 4b5478da5850 -r 0fe851a29bc6 lib/log.py --- a/lib/log.py Fri Dec 21 20:49:04 2007 +0000 +++ b/lib/log.py Fri Dec 21 21:19:01 2007 +0000 @@ -31,4 +31,6 @@ render = logging.getLogger('render') template = logging.getLogger('template') +misc = logging.getLogger('misc') + template.setLevel(logging.ERROR) diff -r 4b5478da5850 -r 0fe851a29bc6 lib/utils.py --- a/lib/utils.py Fri Dec 21 20:49:04 2007 +0000 +++ b/lib/utils.py Fri Dec 21 21:19:01 2007 +0000 @@ -46,6 +46,9 @@ def url_join (*parts) : return '/'.join(parts) + +def path_join (*parts) : + return os.path.join(*[part for part in parts if part is not None]) from optparse import OptionParser