import os
from optparse import make_option
from django.conf import settings
from django.contrib.sites.models import Site
from django.core.management.base import CommandError,NoArgsCommand
from django.template.loaders.app_directories import app_template_dirs
from dbtemplates.models import Template
class Command(NoArgsCommand):
help = "Syncs file system templates with the database bidirectionally."
option_list = NoArgsCommand.option_list + (
make_option("-e", "--ext", dest="ext", action="store", default="html",
help="extension of the files you want to sync with the database "
"[default: %default]"),
make_option("-f", "--force", action="store_true", dest="force",
default=False, help="overwrite existing database templates")
)
def handle_noargs(self, **options):
extension = options.get('ext')
force = options.get('force')
if not extension.startswith("."):
extension = ".%s" % extension
try:
site = Site.objects.get_current()
except:
raise CommandError("Please make sure to have the sites contrib "
"app installed and setup with a site object")
if not type(settings.TEMPLATE_DIRS) in (tuple, list):
raise CommandError("Please make sure settings.TEMPLATE_DIRS is a "
"list or tuple.")
templatedirs = [d for d in
settings.TEMPLATE_DIRS + app_template_dirs if os.path.isdir(d)]
for templatedir in templatedirs:
for dirpath, subdirs, filenames in os.walk(templatedir):
for f in [f for f in filenames if f.endswith(extension)
and not f.startswith(".")]:
path = os.path.join(dirpath, f)
name = path.split(templatedir)[1][1:]
try:
t = Template.on_site.get(name__exact=name)
except Template.DoesNotExist:
if force == False:
confirm = raw_input(
"\nA '%s' template doesn't exist in the database.\n"
"Create it with '%s'?"
" (y/[n]): """ % (name, path))
if confirm.lower().startswith('y') or force:
t = Template(name=name,
content=open(path, "r").read())
t.save()
t.sites.add(site)
else:
while 1:
confirm = raw_input(
"\n%s exists in the database.\n"
"(1) Overwrite %s with '%s'\n"
"(2) Overwrite '%s' with %s\n"
"Type 1 or 2 or press <Enter> to skip: "
% (t.__repr__(),
t.__repr__(), path,
path, t.__repr__()))
if confirm == '' or confirm in ('1', '2'):
if confirm == '1':
t.content = open(path, 'r').read()
t.save()
t.sites.add(site)
elif confirm == '2':
open(path, 'w').write(t.content)
break
|