summaryrefslogtreecommitdiffstats
path: root/askbot/deployment
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2011-10-20 16:23:38 -0300
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2011-10-20 16:23:38 -0300
commit1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd (patch)
treed1ec29df3715680d3e6bfb70ce5330c458589600 /askbot/deployment
parent93928e09df2be2cd51cb4e14df4205e52b4e01fc (diff)
downloadaskbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.tar.gz
askbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.tar.bz2
askbot-1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd.zip
broken intermediate commit - refactoring the deployment function to make it more understandable
Diffstat (limited to 'askbot/deployment')
-rw-r--r--askbot/deployment/__init__.py288
-rw-r--r--askbot/deployment/assertions.py3
-rw-r--r--askbot/deployment/messages.py6
-rw-r--r--askbot/deployment/path_utils.py87
4 files changed, 180 insertions, 204 deletions
diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py
index c20e168f..1ddf24ca 100644
--- a/askbot/deployment/__init__.py
+++ b/askbot/deployment/__init__.py
@@ -2,6 +2,7 @@
module for deploying askbot
"""
import os.path
+import sys
from optparse import OptionParser
from askbot.utils import console
from askbot.deployment import messages
@@ -16,205 +17,124 @@ def askbot_setup():
"""
parser = OptionParser(usage="%prog [options]")
- parser.add_option("-v", "--verbose",
- dest="verbosity",
- type="int",
- default=1,
- help="verbosity level available values 0, 1, 2."
- )
-
- parser.add_option("-n", "--dir-name",
- dest="name",
- default=None,
- help="Directory where you want to install."
- )
-
- parser.add_option("-d", "--db-name",
- dest="database_name",
- default=None,
- help="The database name"
- )
-
- parser.add_option("-u", "--db-user",
- dest="database_user",
- default=None,
- help="The database user"
- )
-
- parser.add_option("-p", "--db-password",
- dest="database_password",
- default=None,
- help="the database password"
- )
-
- parser.add_option("--domain",
- dest="domain_name",
- default=None,
- help="the domain name of the instance"
- )
-
- parser.add_option("--append-settings",
- dest="local_settings",
- default='',
- help="Extra settings file to append custom settings"
- )
-
- parser.add_option("--force",
- dest="force",
- action='store_true',
- help="Force overwrite settings.py file"
- )
-
+ parser.add_option(
+ "-v", "--verbose",
+ dest = "verbosity",
+ type = "int",
+ default = 1,
+ help = "verbosity level available values 0, 1, 2."
+ )
+
+ parser.add_option(
+ "-n", "--dir-name",
+ dest = "dir_name",
+ default = None,
+ help = "Directory where you want to install."
+ )
+
+ parser.add_option(
+ "-d", "--db-name",
+ dest="database_name",
+ default=None,
+ help="The database name"
+ )
+
+ parser.add_option(
+ "-u", "--db-user",
+ dest="database_user",
+ default=None,
+ help="The database user"
+ )
+
+ parser.add_option(
+ "-p", "--db-password",
+ dest="database_password",
+ default=None,
+ help="the database password"
+ )
+
+ parser.add_option(
+ "--domain",
+ dest="domain_name",
+ default=None,
+ help="the domain name of the instance"
+ )
+
+ parser.add_option(
+ "--append-settings",
+ dest="local_settings",
+ default='',
+ help="Extra settings file to append custom settings"
+ )
+
+ parser.add_option(
+ "--force",
+ dest="force",
+ action='store_true',
+ help="Force overwrite settings.py file"
+ )
(options, args) = parser.parse_args()
#ask
if options.verbosity >= 1:
print messages.DEPLOY_PREAMBLE
- directory = options.name #directory where to put stuff
+ directory = path_utils.clean_directory(options.dir_name)
+ if options.verbosity >= 1 and directory is None:
+ print messages.CANT_INSTALL_INTO_FILE % {'path':directory}
+ sys.exit(1)
+
create_new = False #create new django project or not
- where_to_deploy_msg = messages.WHERE_TO_DEPLOY
-
- if directory == None:
- while directory is None:
- where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT
- directory = raw_input(where_to_deploy_msg + ' ')
- directory = check_directory(directory, options)
- if not directory:
- continue
-
- if path_utils.can_create_path(directory):
- if os.path.exists(directory):
- if path_utils.path_is_clean_for_django(directory):
- if path_utils.has_existing_django_project(directory):
- message = messages.SHOULD_ADD_APP_HERE % \
- {
- 'path': directory
- }
- should_add_app = console.choice_dialog(
- message,
- choices = ['yes','no'],
- invalid_phrase = messages.INVALID_INPUT
- )
- if should_add_app == 'yes':
- assert(create_new == False)
- if path_utils.dir_name_acceptable(directory):
- break
- else:
- print messages.format_msg_bad_dir_name(directory)
- directory = None
- continue
- else:
- directory = None
- continue
- else:
- assert(directory != None)
- if path_utils.dir_name_acceptable(directory):
- create_new = True
- break
- else:
- print messages.format_msg_bad_dir_name(directory)
- directory = None
- continue
- else:
- print messages.format_msg_dir_unclean_django(directory)
- directory = None
- continue
- else:
- #creates dir
- message = messages.format_msg_create(directory)
- should_create_new = console.choice_dialog(
- message,
- choices = ['yes','no'],
- invalid_phrase = messages.INVALID_INPUT
- )
- if should_create_new == 'yes':
- if path_utils.dir_name_acceptable(directory):
- create_new = True
- break
- else:
- print messages.format_msg_bad_dir_name(directory)
- directory = None
- continue
- else:
- directory = None
- continue
- else:
- print messages.format_msg_dir_not_writable(directory)
- directory = None
- continue
-
- deploy_askbot(directory, create_new, options)
- else:
- directory = check_directory(directory, options)
- create_new = True
- if directory==None:
- raise Exception("the directory you choosed is invalid")
- #TODO middle steps!
- if path_utils.can_create_path(directory):
- if os.path.exists(directory):
- if path_utils.path_is_clean_for_django(directory):
- if path_utils.has_existing_django_project(directory):
- if options.verbosity >= 1:
- print "Integrating askbot to your current app"
- create_new=False
- else:
- assert(directory != None)
- if path_utils.dir_name_acceptable(directory):
- pass
- else:
- raise Exception(messages.format_msg_bad_dir_name(directory))
- else:
- raise Exception(messages.format_msg_dir_unclean_django(directory))
- else:
- if path_utils.dir_name_acceptable(directory):
- pass
- else:
- raise Exception(messages.format_msg_bad_dir_name(directory))
- else:
- raise Exception(messages.format_msg_dir_not_writable(directory))
-
- deploy_askbot(directory, create_new, options)
+ while directory is None:
+ directory = get_install_directory(force = options.force)
+
+ deploy_askbot(directory, create_new_project, options)
+
#separated all the directory creation process to make it more useful
-def deploy_askbot(directory, create_new, options):
- '''function that copies the templates'''
+def deploy_askbot(directory, create_new_project, options):
+ """function that creates django project files,
+ all the neccessary directories for askbot,
+ and the log file
+ """
+
help_file = path_utils.get_path_to_help_file()
- context = {'database_name': options.database_name,
- 'database_password': options.database_password,
- 'database_user': options.database_user,
- 'domain_name': options.domain_name,
- 'local_settings': options.local_settings,
- }
+ context = {
+ 'database_name': options.database_name,
+ 'database_password': options.database_password,
+ 'database_user': options.database_user,
+ 'domain_name': options.domain_name,
+ 'local_settings': options.local_settings,
+ }
for key in context.keys():
if context[key] == None:
input_message = 'Please enter a value for %s:' % (key.replace('_', ' '))
new_value = raw_input(input_message)
context[key] = new_value
- if options.force:
- create_new = options.force
-
- if create_new:
- path_utils.create_path(directory)
- path_utils.deploy_into(directory, new_project = True,
- verbosity = options.verbosity, context = context)
- if options.verbosity >= 1:
- print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file}
+ path_utils.create_path(directory)
+
+ create_new_project = False
+ if os.path.exists(directory):
+ if path_utils
+
+ create_new_project or options.force
+
+ path_utils.deploy_into(
+ directory,
+ new_project = create_new_project,
+ verbosity = options.verbosity,
+ context = context
+ )
+
+ if create_new_project:
+ print_message(
+ messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file},
+ options.verbosity
+ )
else:
- path_utils.deploy_into(directory, new_project = False,
- verbosity = options.verbosity, context = context)
- if options.verbosity >= 1:
- print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file}
-
-def check_directory(directory, options):
- directory = os.path.normpath(directory)
- directory = os.path.abspath(directory)
-
- if os.path.isfile(directory):
- directory = None
- if options.verbosity >= 1:
- print messages.CANT_INSTALL_INTO_FILE % {'path':directory}
-
- return directory
+ print_message(
+ messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file},
+ options.verbosity
+ )
diff --git a/askbot/deployment/assertions.py b/askbot/deployment/assertions.py
index 0db62b84..d8dee828 100644
--- a/askbot/deployment/assertions.py
+++ b/askbot/deployment/assertions.py
@@ -12,7 +12,8 @@ def assert_package_compatibility():
"""raises an exception if any known incompatibilities
are found
"""
- (django_major, django_minor, django_micro) = package_utils.get_django_version()
+ (django_major, django_minor, django_micro) = \
+ package_utils.get_django_version()
if django_major < 1:
raise DeploymentError('Django version < 1.0 is not supported by askbot')
diff --git a/askbot/deployment/messages.py b/askbot/deployment/messages.py
index 1569de6c..a108d927 100644
--- a/askbot/deployment/messages.py
+++ b/askbot/deployment/messages.py
@@ -9,9 +9,9 @@ Problems installing? -> please email admin@askbot.org
To CANCEL - hit Ctr-C at any time"""
-WHERE_TO_DEPLOY = 'Where to deploy (in which directory)?'
+WHERE_TO_DEPLOY = 'In which directory to deploy the forum?'
-WHERE_TO_DEPLOY_QUIT = 'Where deploy forum (directory)? (Ctrl-C to quit)'
+WHERE_TO_DEPLOY_QUIT = 'Where deploy the forum (directory)? Ctrl-C to quit.'
CANT_INSTALL_INTO_FILE = '%(path)s is a file\ncannot install there'
@@ -78,7 +78,7 @@ def format_msg_dir_unclean_django(directory):
directories contains a django project
so that users don't create nested projects
"""
- parent_django_dir = path_utils.find_parent_dir_with_django(directory)
+ return path_utils.find_parent_dir_with_django(directory)
def format_msg_bad_dir_name(directory):
"""directory name must be bad - i.e. taken by other python module
diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py
index 676f8bf8..806fa80c 100644
--- a/askbot/deployment/path_utils.py
+++ b/askbot/deployment/path_utils.py
@@ -13,6 +13,7 @@ import shutil
import imp
from askbot.deployment.template_loader import SettingsTemplate
+
def split_at_break_point(directory):
"""splits directory path into two pieces
first that exists and secon - that does not
@@ -29,6 +30,17 @@ def split_at_break_point(directory):
tail_bits.insert(0, tail)
return head, os.path.join(*tail_bits)
+def clean_directory(directory):
+ """Returns normalized absolute path to the directory
+ regardless of whether it exists or not
+ or None - if the path is a file"""
+ directory = os.path.normpath(directory)
+ directory = os.path.abspath(directory)
+
+ if os.path.isfile(directory):
+ return None
+ return directory
+
def directory_is_writable(directory):
"""returns True if directory exists
@@ -66,7 +78,8 @@ def has_existing_django_project(directory):
"""returns True is any of the .py files
in a given directory imports anything from django
"""
- file_list = glob.glob(directory + '*.py')
+ directory = os.path.normpath(directory)
+ file_list = glob.glob(directory + os.path.sep + '*.py')
for file_name in file_list:
py_file = open(file_name)
for line in py_file:
@@ -124,10 +137,10 @@ def get_path_to_help_file():
"""returns path to the main plain text help file"""
return os.path.join(SOURCE_DIR, 'doc', 'INSTALL')
-def deploy_into(directory, new_project = None, verbosity=1, context=None):
+def deploy_into(directory, new_project = None, verbosity = 1, context = None):
"""will copy necessary files into the directory
"""
- assert(new_project is not None)
+ assert(isinstance(new_project, bool))
if new_project:
copy_files = ('__init__.py', 'manage.py', 'urls.py')
blank_files = ('__init__.py', 'manage.py')
@@ -143,11 +156,11 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None):
#overwrite urls.py
shutil.copy(src, directory)
else:
- if verbosity >=1:
+ if verbosity >= 1:
print '* %s' % file_name,
print "- you already have one, please add contents of %s" % src
else:
- if verbosity >=1:
+ if verbosity >= 1:
print '* %s ' % file_name
shutil.copy(src, directory)
#copy log directory
@@ -157,14 +170,14 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None):
touch(os.path.join(log_dir, 'askbot.log'))
#creating settings file from template
- if verbosity>=1:
+ if verbosity >= 1:
print "Creating settings file"
settings_contents = SettingsTemplate(context).render()
settings_path = os.path.join(directory, 'settings.py')
- if os.path.exists(settings_path) and new_project==False:
- if verbosity>=1:
+ if os.path.exists(settings_path) and new_project == False:
+ if verbosity >= 1:
print "* you already have a settings file please merge the contents"
- else:
+ elif new_project == True:
settings_file = open(settings_path, 'w+')
settings_file.write(settings_contents)
#Grab the file!
@@ -174,10 +187,10 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None):
settings_file.write(local_settings)
settings_file.close()
- if verbosity>=1:
+ if verbosity >= 1:
print "settings file created"
- if verbosity >=1:
+ if verbosity >= 1:
print ''
app_dir = os.path.join(directory, 'askbot')
@@ -188,21 +201,21 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None):
dst = os.path.join(app_dir, dir_name)
if os.path.abspath(src) != os.path.abspath(dst):
if dirs_copied == 0:
- if verbosity >=1:
+ if verbosity >= 1:
print 'copying directories: ',
- if verbosity >=1:
+ if verbosity >= 1:
print '* ' + dir_name
if os.path.exists(dst):
if os.path.isdir(dst):
- if verbosity >=1:
+ if verbosity >= 1:
print 'Directory %s not empty - skipped' % dst
else:
- if verbosity >=1:
+ if verbosity >= 1:
print 'File %s already exists - skipped' % dst
continue
shutil.copytree(src, dst)
dirs_copied += 1
- if verbosity >=1:
+ if verbosity >= 1:
print ''
def dir_name_acceptable(directory):
@@ -213,3 +226,45 @@ def dir_name_acceptable(directory):
return False
except ImportError:
return True
+
+def get_install_directory(force = False):
+ """returns a directory where a new django app/project
+ can be installed.
+ If ``force`` is ``True`` - will permit
+ using a directory with an existing django project.
+ """
+
+ where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT
+ directory = raw_input(where_to_deploy_msg + ' ')
+ directory = clean_directory(directory)
+
+ if directory is None:
+ return None
+
+ if can_create_path(directory) == False:
+ print messages.format_msg_dir_not_writable(directory)
+ return None
+
+ if os.path.exists(directory):
+ if path_is_clean_for_django(directory):
+ if has_existing_django_project(directory):
+ if force == False:
+ print messages.CANNOT_OVERWRITE_EXISTING_DJANGO_PROJECT
+ return None
+ else:
+ print messages.format_msg_dir_unclean_django(directory)
+ return None
+ elif force == False:
+ message = messages.format_msg_create(directory)
+ should_create_new = console.choice_dialog(
+ message,
+ choices = ['yes','no'],
+ invalid_phrase = messages.INVALID_INPUT
+ )
+ if should_create_new == 'no':
+ return None
+
+ if not dir_name_acceptable(directory):
+ print messages.format_msg_bad_dir_name(directory)
+ return None
+