diff options
-rw-r--r-- | askbot/deployment/__init__.py | 120 | ||||
-rw-r--r-- | askbot/deployment/messages.py | 9 | ||||
-rw-r--r-- | askbot/deployment/path_utils.py | 19 | ||||
-rw-r--r-- | askbot/setup_templates/settings.py.mustache | 2 | ||||
-rw-r--r-- | askbot/utils/console.py | 21 |
5 files changed, 116 insertions, 55 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: diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index d7b455f8..be4c3800 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -21,7 +21,7 @@ MANAGERS = ADMINS DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'ENGINE': 'django.db.backends.{{database_engine}}', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '{{database_name}}', # Or path to database file if using sqlite3. 'USER': '{{database_user}}', # Not used with sqlite3. 'PASSWORD': '{{database_password}}', # Not used with sqlite3. diff --git a/askbot/utils/console.py b/askbot/utils/console.py index 0c27cd23..644a7f21 100644 --- a/askbot/utils/console.py +++ b/askbot/utils/console.py @@ -24,7 +24,9 @@ def choice_dialog(prompt_phrase, choices = None, invalid_phrase = None): assert(hasattr(choices, '__iter__')) assert(not isinstance(choices, basestring)) while 1: - response = raw_input('\n%s (type %s): ' % (prompt_phrase, '/'.join(choices))) + response = raw_input( + '\n%s (type %s)\n> ' % (prompt_phrase, '/'.join(choices)) + ) if response in choices: return response elif invalid_phrase != None: @@ -32,6 +34,23 @@ def choice_dialog(prompt_phrase, choices = None, invalid_phrase = None): print invalid_phrase % {'opt_string': opt_string} time.sleep(1) +def simple_dialog(prompt_phrase, required=False): + """asks user to enter a string, if `required` is True, + will repeat question until non-empty input is given + """ + while 1: + + if required: + prompt_phrase += ' (required)' + + response = raw_input(prompt_phrase + '\n> ').strip() + + if response or required is False: + return response + + time.sleep(1) + + def open_new_file(prompt_phrase, extension = '', hint = None): """will ask for a file name to be typed by user into the console path to the file can be |