Skip to content

Instantly share code, notes, and snippets.

@CRImier
Last active December 27, 2015 13:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CRImier/7330722 to your computer and use it in GitHub Desktop.
Save CRImier/7330722 to your computer and use it in GitHub Desktop.
This Python program is used to manage scanning directories while batch-scanning so that all the files get automatically sorted. Its main objective is to provide path to current chosen directory when called like "pybssort dir" and let users choose, create and manage directories using "pybssort [list|add|del|set]". It requires python-webpy solely …
#!/usr/bin/env python
import os
import sys
import web
web.config.debug = False
from web import database
BASEPATH = "/home/user/Scans"
DIR = "/var/lib/pybssort/"
DB_NAME = os.path.join(DIR, "pybssort.db")
F_NAME = os.path.join(DIR, "pybssort.ini")
def list_contexts():
contexts = db.select('contexts')
return contexts
def get_names():
return [context['name'] for context in list_contexts()]
def print_contexts():
for context in list_contexts():
print context['name']+"\t"+return_path(context['folder'])
def add_context(name, folder):
name = name.strip()
folder = folder.strip('/')
folder += "/"
if name in get_names() or name == '':
return False
db.insert('contexts', name=name, folder=folder)
set_current_context(name)
try:
os.mkdir(return_path(folder))
os.chmod(return_path(folder), 0777)
except OSError as e:
if e.errno == 17:
pass
else:
return False
return True
def return_path(folder_name):
folder = os.path.join(BASEPATH, folder_name)
return folder
def return_current_path():
folder_name = return_current_context()['folder']
return return_path(folder_name)
def del_context(name):
names = get_names()
if name == 'default' or name not in names:
return False
if return_current_context()['name'] == name:
set_current_context('default')
db.delete('contexts', where="name=$name", vars=locals())
return True
def set_current_context(name):
if name not in get_names():
return False
f = open(F_NAME, 'w')
f.write(name)
f.close()
return True
def return_current_context():
f = open(F_NAME, 'r')
context_name = f.read().strip('\n')
f.close()
for entry in list_contexts():
if entry['name'] == context_name:
return entry
def first_run():
create_dir()
create_table()
create_file()
add_context('default', '')
def create_dir():
try:
os.mkdir(DIR)
except OSError as e:
if e.errno == 17:
pass
else:
print "For first time you must run this program as root"
sys.exit(1)
os.chmod(DIR, 0777)
def create_table():
query = "CREATE TABLE contexts(name TEXT PRIMARY KEY, folder TEXT NOT NULL);"
db.query(query)
def create_file():
f = open(F_NAME, 'w')
f.close()
os.chmod(F_NAME, 0777)
if not os.path.isfile(DB_NAME):
db = database(dbn='sqlite', db=DB_NAME)
first_run()
os.chmod(DB_NAME, 0777)
else:
db = database(dbn='sqlite', db=DB_NAME)
if __name__ == "__main__":
arguments = ['add', 'list', 'del', 'set', 'dir']
try:
assert(len(sys.argv) > 1 and sys.argv[1] in arguments)
if sys.argv[1] == 'list':
#Usage is 'script list'
print_contexts()
sys.exit(0)
elif sys.argv[1] == 'add':
#Usage is 'script add $name $folder_name'
assert(len(sys.argv) == 4)
if add_context(sys.argv[2], sys.argv[3]):
print "OK"
sys.exit(0)
else:
print "Incorrect name or folder name"
sys.exit(1)
elif sys.argv[1] == 'del':
#Usage is 'script del $name'
assert(len(sys.argv) == 3)
if del_context(sys.argv[2]):
print "OK"
sys.exit(0)
else:
print "Incorrect name (you can't delete 'default'!)"
sys.exit(1)
elif sys.argv[1] == 'set':
#Usage is 'script set $name'
assert(len(sys.argv) == 3)
if set_current_context(sys.argv[2]):
print "Default scanning directory is now "+return_current_path()
sys.exit(0)
else:
print "Incorrect name"
sys.exit(1)
elif sys.argv[1] == 'dir':
#Usage is 'script dir'
print return_current_path()
sys.exit(0)
except (AssertionError, KeyError, ValueError):
print "Usage examples:"
print ">pybssort list"
print "default /home/user/Scans/"
print ">pybssort add math Math"
print ">pybssort list"
print "default /home/user/Scans/"
print "math /home/user/Scans/Math/"
print ">pybssort set math"
print "Default scanning directory is now /home/user/Scans/Math/"
print ">pybssort dir"
print "/home/user/scans/Math/"
print ">pybssort add phys Physics"
print "Default scanning directory is now /home/user/Scans/Physics/"
print ">pybssort set phys"
print "Default scanning directory is now /home/user/Scans/Physics/"
print ">pybssort dir"
print "/home/user/Scans/Physics/ "
print ">pybssort list"
print "default /home/user/Scans/"
print "math /home/user/Scans/Math/"
print "phys /home/user/Scans/Physics/"
print ">pybssort del math"
print "OK"
print ">pybssort list"
print "default /home/user/Scans/"
print "phys /home/user/Scans/Physics/"
sys.exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment