summaryrefslogtreecommitdiffstats
path: root/askbot/deployment
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-11-18 21:18:49 -0300
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-11-18 21:18:49 -0300
commite0dcb50e48b25f7fe641d54b5338e09486b7157e (patch)
tree1f291181f4dc7885b47b1302ebc43cfd471ecef8 /askbot/deployment
parentbf3e433665b94907057d6c8914077c94ed92b638 (diff)
downloadaskbot-e0dcb50e48b25f7fe641d54b5338e09486b7157e.tar.gz
askbot-e0dcb50e48b25f7fe641d54b5338e09486b7157e.tar.bz2
askbot-e0dcb50e48b25f7fe641d54b5338e09486b7157e.zip
improved askbot-setup script
Diffstat (limited to 'askbot/deployment')
-rw-r--r--askbot/deployment/__init__.py120
-rw-r--r--askbot/deployment/messages.py9
-rw-r--r--askbot/deployment/path_utils.py19
3 files changed, 95 insertions, 53 deletions
diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py
index de358f10..6be1528f 100644
--- a/askbot/deployment/__init__.py
+++ b/askbot/deployment/__init__.py
@@ -5,10 +5,12 @@ import os.path
import sys
import django
from optparse import OptionParser
-from askbot.utils import console
from askbot.deployment import messages
from askbot.deployment.messages import print_message
from askbot.deployment import path_utils
+from askbot.utils import console
+
+DATABASE_ENGINE_CHOICES = ('1', '2', '3', '4')
def askbot_setup():
"""basic deployment procedure
@@ -39,7 +41,7 @@ def askbot_setup():
dest='database_engine',
action='store',
type='choice',
- choices=('1', '2', '3'),
+ choices=DATABASE_ENGINE_CHOICES,
default=None,
help='Database engine, type 1 for postgresql, 2 for sqlite, 3 for mysql'
)
@@ -81,13 +83,15 @@ def askbot_setup():
parser.add_option(
"--force",
- dest = "force",
- action = 'store_true',
+ dest="force",
+ action='store_true',
+ default=False,
help = "Force overwrite settings.py file"
)
try:
options = parser.parse_args()[0]
+
#ask users to give missing parameters
#todo: make this more explicit here
if options.verbosity >= 1:
@@ -96,8 +100,29 @@ def askbot_setup():
directory = path_utils.clean_directory(options.dir_name)
while directory is None:
directory = path_utils.get_install_directory(force=options.force)
+ options.dir_name = directory
- deploy_askbot(directory, options)
+ if options.database_engine not in DATABASE_ENGINE_CHOICES:
+ options.database_engine = console.choice_dialog(
+ 'Please select database engine:\n1 - for postgresql, '
+ '2 - for sqlite, 3 - for mysql, 4 - oracle',
+ choices=DATABASE_ENGINE_CHOICES
+ )
+
+ options_dict = vars(options)
+ if options.force is False:
+ options_dict = collect_missing_options(options_dict)
+
+ database_engine_codes = {
+ '1': 'postgresql_psycopg2',
+ '2': 'sqlite3',
+ '3': 'mysql',
+ '4': 'oracle'
+ }
+ database_engine = database_engine_codes[options.database_engine]
+ options_dict['database_engine'] = database_engine
+
+ deploy_askbot(options_dict)
except KeyboardInterrupt:
print "\n\nAborted."
sys.exit(1)
@@ -105,47 +130,21 @@ def askbot_setup():
#separated all the directory creation process to make it more useful
-def deploy_askbot(directory, options):
+def deploy_askbot(options):
"""function that creates django project files,
all the neccessary directories for askbot,
and the log file
"""
-
- database_engine_codes = {
- 1: 'postgresql_psycopg2',
- 2: 'sqlite3',
- 3: 'mysql'
- }
-
- database_engine = database_engine_codes[options.database_engine]
-
- help_file = path_utils.get_path_to_help_file()
- context = {
- 'database_engine': database_engine,
- '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,
- }
- if not options.force:
- 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
-
create_new_project = False
- if os.path.exists(directory):
- if path_utils.has_existing_django_project(directory):
+ if os.path.exists(options['dir_name']):
+ if path_utils.has_existing_django_project(options['dir_name']):
create_new_project = bool(options.force)
else:
create_new_project = True
else:
create_new_project = True
- path_utils.create_path(directory)
+ path_utils.create_path(options['dir_name'])
if django.VERSION[0] > 1:
raise Exception(
@@ -154,30 +153,63 @@ def deploy_askbot(directory, options):
if django.VERSION[1] < 3:
#force people install the django-staticfiles app
- context['staticfiles_app'] = ''
+ options['staticfiles_app'] = ''
else:
- context['staticfiles_app'] = "'django.contrib.staticfiles',"
+ options['staticfiles_app'] = "'django.contrib.staticfiles',"
if django.VERSION[1] <=3:
auth_context_processor = 'django.core.context_processors.auth'
else:
auth_context_processor = 'django.contrib.auth.context_processors.auth'
- context['auth_context_processor'] = auth_context_processor
+ options['auth_context_processor'] = auth_context_processor
+
+ verbosity = options['verbosity']
path_utils.deploy_into(
- directory,
- new_project = create_new_project,
- verbosity = options.verbosity,
- context = context
+ options['dir_name'],
+ new_project=create_new_project,
+ verbosity=verbosity,
+ context=options
)
+ help_file = path_utils.get_path_to_help_file()
+
if create_new_project:
print_message(
messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file},
- options.verbosity
+ verbosity
)
else:
print_message(
messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file},
- options.verbosity
+ verbosity
)
+
+def collect_missing_options(options_dict):
+ if options_dict['database_engine'] == '2':#sqlite
+ while True:
+ value = console.simple_dialog(
+ 'Please enter database file name'
+ )
+ if os.path.isfile(value):
+ print 'file %s exists, please choose another' % value
+ elif os.path.isdir(value):
+ print '%s is a directory, choose another name' % value
+ elif value in path_utils.FILES_TO_CREATE:
+ print 'name %s cannot be used for the database name' % value
+ elif value == path_utils.LOG_DIR_NAME:
+ print 'name %s cannot be used for the database name' % value
+ else:
+ options_dict['database_name'] = value
+ return options_dict
+
+ else:#others
+ for key in ('database_name', 'database_user', 'database_password'):
+ if options_dict[key] is None:
+ key_name = key.replace('_', ' ')
+ value = console.simple_dialog(
+ 'Please enter %s' % key_name,
+ required=True
+ )
+ options_dict[key] = value
+ return options_dict
diff --git a/askbot/deployment/messages.py b/askbot/deployment/messages.py
index 44dde979..0d264695 100644
--- a/askbot/deployment/messages.py
+++ b/askbot/deployment/messages.py
@@ -7,11 +7,12 @@ DEPLOY_PREAMBLE = """
Deploying Askbot - Django Q&A forum application
Problems installing? -> please email admin@askbot.org
-To CANCEL - hit Ctr-C at any time"""
-
-WHERE_TO_DEPLOY = 'In which directory to deploy the forum?'
+To CANCEL - hit Ctr-C at any time
+"""
-WHERE_TO_DEPLOY_QUIT = 'Where deploy the forum (directory)? Ctrl-C to quit.'
+WHERE_TO_DEPLOY = """Enter directory path (absolute or relative) to deploy
+askbot. To choose current directory - enter "."
+>"""
CANT_INSTALL_INTO_FILE = '%(path)s is a file\ncannot install there'
diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py
index caefa2a9..1229cf1b 100644
--- a/askbot/deployment/path_utils.py
+++ b/askbot/deployment/path_utils.py
@@ -15,6 +15,11 @@ from askbot.utils import console
from askbot.deployment.template_loader import SettingsTemplate
+FILES_TO_CREATE = ('__init__.py', 'manage.py', 'urls.py', 'django.wsgi')
+BLANK_FILES = ('__init__.py', 'manage.py')
+LOG_DIR_NAME = 'log'
+
+
def split_at_break_point(directory):
"""splits directory path into two pieces
first that exists and secon - that does not
@@ -154,8 +159,8 @@ def deploy_into(directory, new_project = False, verbosity = 1, context = None):
"""
assert(isinstance(new_project, bool))
if new_project:
- copy_files = ('__init__.py', 'manage.py', 'urls.py', 'django.wsgi')
- blank_files = ('__init__.py', 'manage.py')
+ copy_files = FILES_TO_CREATE
+ blank_files = BLANK_FILES
if verbosity >= 1:
print 'Copying files: '
for file_name in copy_files:
@@ -176,8 +181,8 @@ def deploy_into(directory, new_project = False, verbosity = 1, context = None):
print '* %s ' % file_name
shutil.copy(src, directory)
#copy log directory
- src = os.path.join(SOURCE_DIR, 'setup_templates', 'log')
- log_dir = os.path.join(directory, 'log')
+ src = os.path.join(SOURCE_DIR, 'setup_templates', LOG_DIR_NAME)
+ log_dir = os.path.join(directory, LOG_DIR_NAME)
create_path(log_dir)
touch(os.path.join(log_dir, 'askbot.log'))
@@ -252,8 +257,12 @@ def get_install_directory(force = False):
using a directory with an existing django project.
"""
from askbot.deployment import messages
- where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT
+ where_to_deploy_msg = messages.WHERE_TO_DEPLOY
directory = raw_input(where_to_deploy_msg + ' ')
+
+ if directory.strip() == '':
+ return None
+
directory = clean_directory(directory)
if directory is None: