# encoding: utf-8
import os
import shutil
from django.core.management.base import NoArgsCommand
# given that a management command belongs in an app, the base dir containing all
# apps is three levels down (/apps/some-app/management/commands/this-file)
APP_DIR = os.path.realpath(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../../../'))
SHORTCUTS_DIR = './shortcuts'
TRACKED_FILENAMES = ["views", "models", "admin", "urls", "util", "ajax"]
TRACKED_DIRS = ["templates", "templatetags", "management"]
def ascertain_type_of_file(filename):
if not filename.endswith('.py'):
return None
for type in TRACKED_FILENAMES:
if filename.startswith(type):
return type
return None
class Command(NoArgsCommand):
help = """creates a bunch of symlinks in ./shortcuts to make browsing of your
code by type (views, models, admin, ...) easier"""
def handle_noargs(self, **options):
# we recreate the directory every time this command is called
# that way we're sure we'll never have any symlinks to files
# that have since been deleted
if os.path.exists(SHORTCUTS_DIR):
shutil.rmtree(SHORTCUTS_DIR)
os.mkdir(SHORTCUTS_DIR)
for kind in TRACKED_FILENAMES + TRACKED_DIRS:
pad = SHORTCUTS_DIR + '/' + kind
os.mkdir(pad)
# app code
counter = 0
for root, subdirs, files in os.walk(APP_DIR):
for file in files:
type = ascertain_type_of_file(file)
ancestor, parent = root.split('/')[-2:]
if type:
to = root + '/' + file
frm = '%s/%s/%s_%s' % (SHORTCUTS_DIR, type, parent, file)
os.symlink(to, frm)
counter += 1
if parent in TRACKED_DIRS:
to = root
frm = SHORTCUTS_DIR + '/' + parent + '/' + ancestor
if not os.path.exists(frm):
os.symlink(to, frm)
counter += 1
print "Made %i shortcuts in %i directories under ./shortcuts" % (counter, len(TRACKED_DIRS))
Comments
Hmm... am I missing something, or is this any different than using
zshand doing:**/admin.py**/views.py**/models.py**/ajax.pyetc?
#
@davedash: if you're coding from the commandline, probably not, but if you use an editor with a project browser, the symlinks in the /shortcuts directory make for easier browsing. It's not about finding files per type, it's about having them all one click away.
#