From 24d01755355d6bba38c7ba8785ab72ed767db783 Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Thu, 21 Jun 2018 17:08:39 +0200 Subject: [PATCH 3/3] link old convertsql command to current implementation --- tests/test_convert_to_sql.py | 24 +++++++-- wcs/ctl/convertsql.py | 118 ++++--------------------------------------- 2 files changed, 28 insertions(+), 114 deletions(-) diff --git a/tests/test_convert_to_sql.py b/tests/test_convert_to_sql.py index 4bf107a8..63600705 100644 --- a/tests/test_convert_to_sql.py +++ b/tests/test_convert_to_sql.py @@ -19,11 +19,6 @@ from utilities import force_connections_close from test_api import local_user -class Struct: - def __init__(self, **entries): - self.__dict__.update(entries) - - @pytest.fixture def formdeffix(): FormDef.wipe() @@ -125,3 +120,22 @@ def test_data_is_migrated(pub, database, local_user, formdeffix): assert len(formdefs) == 1 data_class = formdefs[0].data_class(mode='sql') assert len(data_class.keys()) == 4 + + +def test_compat_previous_ctl_command(pub, database, local_user, formdeffix): + pub.load_site_options() + assert not pub.site_options.has_option('options', 'postgresql') + cmd = CmdConvertToSql() + cmd.config.add_section('main') + cmd.config.set('main', 'error_log', '') + cmd.config.set('main', 'app_dir', os.path.dirname(pub.app_dir)) + sub_options_class = collections.namedtuple('Options', ['data_dir', 'dbname', 'user']) + sub_options = sub_options_class(pub.app_dir, database, os.environ.get('USER')) + cmd.execute(object, sub_options, ('example.net',)) + pub.load_site_options() + assert pub.site_options.has_option('options', 'postgresql') + assert len(pub.user_class.get_users_with_name_identifier('0123456789')) == 1 + formdefs = FormDef.select() + assert len(formdefs) == 1 + data_class = formdefs[0].data_class(mode='sql') + assert len(data_class.keys()) == 4 diff --git a/wcs/ctl/convertsql.py b/wcs/ctl/convertsql.py index 3a18b378..154d9c62 100644 --- a/wcs/ctl/convertsql.py +++ b/wcs/ctl/convertsql.py @@ -15,30 +15,9 @@ # along with this program; if not, see . import os -import sys -import traceback - - -num_columns = 0 -try: - import curses -except ImportError: - curses = None -else: - try: - curses.setupterm() - num_columns = curses.tigetnum('cols') - except: - pass - - from qommon.ctl import Command, make_option +from django.core.management import call_command -def update_progress(progress): - if not num_columns: - return - sys.stdout.write('[%s] %s%%\r' % ( - ('#'*((num_columns-10)*progress/100)).ljust(num_columns-15), progress)) class CmdConvertToSql(Command): name = 'convert-to-sql' @@ -69,94 +48,15 @@ class CmdConvertToSql(Command): pub.app_dir = os.path.join(pub.app_dir, hostname) pub.set_config() - from wcs.formdef import FormDef - from wcs import sql - - if sub_options.port: - sub_options.port = int(sub_options.port) - - pub.cfg['postgresql'] = { - 'database': sub_options.dbname, - 'user': sub_options.user, - 'password': sub_options.password, - 'host': sub_options.host, - 'port': sub_options.port, - } - - sql.get_connection_and_cursor(new=True) - - errors = [] - - print 'converting users' - from users import User - sql.do_user_table() - count = User.count() - for i, user_id in enumerate(User.keys()): - user = User.get(user_id) - user.__class__ = sql.SqlUser - try: - user.store() - except AssertionError: - errors.append((user, traceback.format_exc())) - update_progress(100*i/count) - sql.SqlUser.fix_sequences() - - if errors: - error_log = file('error_user.log', 'w') - for user, trace in errors: - print >> error_log, 'user_id', user.id - print >> error_log, trace - print >> error_log, '-'*80 - error_log.close() - print 'There were some errors, see error_user.log for details.' - - errors = [] - for formdef in FormDef.select(): - print ('converting %s' % formdef.name).ljust(num_columns-1) - sql.do_formdef_tables(formdef, rebuild_views=True, - rebuild_global_views=True) - data_class = formdef.data_class(mode='files') - count = data_class.count() - - # load all objects a first time, to allow the migrate() code to be - # run and the eventual changes properly saved. - for id in data_class.keys(): - formdata = data_class.get(id) - delattr(sys.modules['formdef'], formdef.url_name.title()) - - # once this is done, reload and store everything in postgresql - sql_data_class = formdef.data_class(mode='sql') - for i, id in enumerate(data_class.keys()): - formdata = data_class.get(id) - formdata._formdef = formdef - formdata._evolution = formdata.evolution - formdata.__class__ = sql_data_class - try: - formdata.store() - except AssertionError: - errors.append((formdata, traceback.format_exc())) - update_progress(100*i/count) - sql_data_class.fix_sequences() - - print 'done'.ljust(num_columns-1) - - sql.do_tracking_code_table() - sql.do_session_table() - sql.do_meta_table() - - if errors: - error_log = file('error_formdata.log', 'w') - for formdata, trace in errors: - print >> error_log, formdata.formdef, formdata.id - print >> error_log, trace - print >> error_log, '-'*80 - error_log.close() - print 'There were some errors, see error_formdata.log for details.' - - if not pub.has_site_option('postgresql'): - print 'You still have to edit your site-options.cfg' + cmd = ['convert_to_sql', + '-d', hostname, + '--database', sub_options.dbname] - pub.write_cfg() + for k in ['user', 'password', 'host', 'port']: + value = getattr(sub_options, k, False) + if value: + cmd.extend(['--%s' % k, value]) + call_command(*cmd) CmdConvertToSql.register() -- 2.11.0