Пример #1
0
def copy_initial_migration_scripts(args):
    """Will copy the initial db migration scripts into the alembic
    versions folder of the application.
    """
    dst_path = []
    dst_path.append(get_app_location(args.app))
    dst_path.append(args.app)
    dst_path.append("alembic")
    dst_path.append("versions")
    src_path = []
    src_path.append(get_app_location(args.base))
    src_path.append(args.base)
    src_path.append("alembic")
    src_path.append("versions")

    src = os.path.join(*src_path)
    dst = os.path.join(*dst_path)
    dst_files = os.listdir(dst)
    src_files = os.listdir(src)
    # Only copy the initial files if the directory is empty and src and
    # dst isn't the same directory (Happens when installing ringo
    # itself).
    if (src == dst) or (len(dst_files) > 1):
        return
    for file_name in src_files:
        full_file_name = os.path.join(src, file_name)
        if (os.path.isfile(full_file_name)):
            shutil.copy(full_file_name, dst)
Пример #2
0
def handle_modul_fields_command(args):
    """Will print generated SA fields ready to be pasted in the model
    based on the given form configuration.

    :args: command args
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.app)
    path.append("views")
    path.append("forms")
    path.append("%s.xml" % args.name)

    formbar_path = []
    formbar_path.append(get_app_location("formbar"))
    formbar_path.append("contrib")
    formbar_path.append("generate.py")

    print "\nGenerating fields for the %s model..." % args.name
    out = subprocess.check_output([
        "python",
        os.path.join(*formbar_path),
        "model",
        os.path.join(*path)
    ])
    print "\n", out
Пример #3
0
def handle_modul_fields_command(args):
    """Will print generated SA fields ready to be pasted in the model
    based on the given form configuration.

    :args: command args
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.app)
    path.append("views")
    path.append("forms")
    path.append("%s.xml" % args.name)

    formbar_path = []
    formbar_path.append(get_app_location("formbar"))
    formbar_path.append("contrib")
    formbar_path.append("generate.py")

    print "\nGenerating fields for the %s model..." % args.name
    out = subprocess.check_output([
        "python",
        os.path.join(*formbar_path),
        "model",
        os.path.join(*path)
    ])
    print "\n", out
Пример #4
0
def copy_initial_migration_scripts(args):
    """Will copy the initial db migration scripts into the alembic
    versions folder of the application.
    """
    dst_path = []
    dst_path.append(get_app_location(args.app))
    dst_path.append(args.app)
    dst_path.append("alembic")
    dst_path.append("versions")
    src_path = []
    src_path.append(get_app_location(args.base))
    src_path.append(args.base)
    src_path.append("alembic")
    src_path.append("versions")

    src = os.path.join(*src_path)
    dst = os.path.join(*dst_path)
    dst_files = os.listdir(dst)
    src_files = os.listdir(src)
    # Only copy the initial files if the directory is empty and src and
    # dst isn't the same directory (Happens when installing ringo
    # itself).
    if (src == dst) or (len(dst_files) > 1):
        return
    for file_name in src_files:
        full_file_name = os.path.join(src, file_name)
        if (os.path.isfile(full_file_name)):
            shutil.copy(full_file_name, dst)
Пример #5
0
def handle_app_init_command(args):
    # Create a folder for the application
    os.makedirs(args.name)
    print("Created new application folder %s" % args.name)

    # Get template for the configuration file.
    template_path = []
    template_path.append(get_app_location(args.app))
    template_path.append(args.app)
    template_path.append("scaffolds")
    template_path.append("basic")
    template_path.append("development.ini_tmpl")

    with open(os.path.join(*template_path)) as f:
        template = f.read()

    config_file = "production.ini"
    config_path = []
    config_path.append(args.name)
    config_path.append(config_file)
    with open(os.path.join(*config_path), "w") as c:
        template = template.replace("{{package}}", args.app)
        #template = template.replace("app.title = ringo", "app.title = %s"
        #                            % args.name)
        c.write(template)
    print("Created new configuration file %s in %s" % (config_file, args.name))

    print("\n")
    print("Next steps:")
    print("0. cd %s" % args.name)
    print("1. Adjust settings in your config")
    print("2. %s-admin db init --config %s" % (args.app, config_file))
    print("3. %s-admin fixtures load --config %s" % (args.app, config_file))
    print("4. Start application: pserve production.ini")
Пример #6
0
def handle_modul_add_command(args):
    """@todo: Docstring for add_modul_add_command.

    :args: @todo
    :returns: @todo
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)

    session = get_session(os.path.join(*path))
    package = args.app
    name = args.name
    clazz = name.capitalize()
    modul_id = get_next_modulid(package, session)
    add_model_file(package, name, modul_id, clazz, args.mixin)
    add_form_file(package, name)
    add_table_file(package, name)
    msg = "Added %s modul" % name
    path = create_new_revision(args, msg)
    replace_sql_in_revision(path, package, name, session)
    print ""
    print "Ready. Next steps:"
    print ""
    print "touch %s" % path
    print "%s-admin db upgrade" % args.app
Пример #7
0
def handle_app_init_command(args):
    # Create a folder for the application
    os.makedirs(args.name)
    print("Created new application folder %s" % args.name)

    # Get template for the configuration file.
    template_path = []
    template_path.append(get_app_location(args.app))
    template_path.append(args.app)
    template_path.append("scaffolds")
    template_path.append("basic")
    template_path.append("development.ini_tmpl")

    with open(os.path.join(*template_path)) as f:
        template = f.read()

    config_file = "production.ini"
    config_path = []
    config_path.append(args.name)
    config_path.append(config_file)
    with open(os.path.join(*config_path), "w") as c:
        template = template.replace("{{package}}", args.app)
        #template = template.replace("app.title = ringo", "app.title = %s"
        #                            % args.name)
        c.write(template)
    print("Created new configuration file %s in %s" % (config_file, args.name))

    print("\n")
    print("Next steps:")
    print("0. cd %s" % args.name)
    print("1. Adjust settings in your config")
    print("2. %s-admin db init --config %s" % (args.app, config_file))
    print("3. %s-admin fixtures load --config %s" % (args.app, config_file))
    print("4. Start application: pserve production.ini")
Пример #8
0
def handle_modul_add_command(args):
    """@todo: Docstring for add_modul_add_command.

    :args: @todo
    :returns: @todo
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)

    session = get_session(os.path.join(*path))
    package = args.app
    name = args.name
    clazz = name.capitalize()
    modul_id = get_next_modulid(package, session)
    add_model_file(package, name, modul_id, clazz, args.mixin)
    add_form_file(package, name)
    add_table_file(package, name)
    msg = "Added %s modul" % name
    path = create_new_revision(args, msg)
    replace_sql_in_revision(path, package, name, session)
    print ""
    print "Ready. Next steps:"
    print ""
    print "touch %s" % path
    print "%s-admin db upgrade" % args.app
Пример #9
0
def add_model_file(package, modul, id, clazz, mixins):
    target_file = os.path.join(get_app_location(package),
                               package, 'model', '%s.py' % modul)
    print 'Adding new model file "%s"... ' % target_file,
    # Build mixins
    mixinclasses = []
    for mixin in mixins:
        mixinclasses.append(mixinmap[mixin])
    try:
        tablename = modul + 's'
        label = modul.capitalize()
        label_plural = label + "s"
        clazzpath = ".".join([package, 'model', modul, label])
        values = {
            'modul': modul,
            'clazzpath': clazzpath,
            'label': label,
            'label_plural': label_plural,
            'modul': modul,
            'table': tablename,
            'id': id,
            'clazz': clazz,
            'mixins': mixinclasses
        }
        template = template_lookup.get_template("model.mako")
        generated = template.render(**values)
        outfile = open(target_file, 'w+')
        outfile.write(generated)
        outfile.close()
        # Import the new model file. This is needed to be able to
        # generate the migration script properly.
        dynamic_import(clazzpath)
        print 'Ok.'
    except Exception:
        print 'Failed.'
Пример #10
0
def add_fixtures(package, name, session):
    """Will add the fixtures for the new modul to the fixture files.

    :package: @todo
    :name: @todo
    :session: @todo
    :returns: @todo

    """
    path = os.path.join(get_app_location(package), package, 'fixtures')
    modul_fixture = get_modul_fixture(name, package, session)
    modul_file = _get_fixture_file(path, "*_modules.json")

    with open(modul_file, "r+") as mf:
        print 'Adding data to fixture "%s"... ' % modul_file,
        modul_json = json.load(mf)
        modul_json.append(modul_fixture)
        mf.seek(0)
        mf.write(json.dumps(modul_json, indent=4))
        print 'Ok'

    modul_id = modul_fixture["id"]
    action_fixtures = get_action_fixtures(session, modul_id)
    action_file = _get_fixture_file(path, "*_actions.json")

    with open(action_file, "r+") as af:
        print 'Adding data to fixture "%s"... ' % action_file,
        action_json = json.load(af)
        action_json.extend(action_fixtures)
        af.seek(0)
        af.write(json.dumps(action_json, indent=4))
        print 'Ok'
Пример #11
0
def handle_db_fixsequence_command(args):
    """Will fix the sequences of the primary keys in all tables of a
    PostgresSQL Database. For each table in the database the function
    will determine the highest value for the id and set the nextval to
    the max+1. Background. When inserting items per fixtures the fixture
    may contain an id for the new item. In this case the id will be set
    in the database but the internal sequence counter is not updated."""

    # Load the SQL Script to fix the sequence
    sql_path = []
    sql_path.append(get_app_location("ringo"))
    sql_path.append("ringo/scripts/generate_fix_sequence_stmnts.sql")
    with open(os.path.join(*sql_path)) as sqlfile:
        sql = sqlfile.read()

    # Get DB connection and apply loaded SQL statements.
    path = []
    path.append(args.config)
    engine = get_engine(os.path.join(*path))
    conn = engine.connect()
    result = conn.execute(sql)
    print "Fixing sequences ... ",
    for r in result:
        conn.execute(r[0])
    conn.close()
    print "OK"
Пример #12
0
def handle_db_fixsequence_command(args):
    """Will fix the sequences of the primary keys in all tables of a
    PostgresSQL Database. For each table in the database the function
    will determine the highest value for the id and set the nextval to
    the max+1. Background. When inserting items per fixtures the fixture
    may contain an id for the new item. In this case the id will be set
    in the database but the internal sequence counter is not updated."""

    # Load the SQL Script to fix the sequence
    sql_path = []
    sql_path.append(get_app_location("ringo"))
    sql_path.append("ringo/scripts/generate_fix_sequence_stmnts.sql")
    with open(os.path.join(*sql_path)) as sqlfile:
        sql = sqlfile.read()

    # Get DB connection and apply loaded SQL statements.
    path = []
    path.append(args.config)
    engine = get_engine(os.path.join(*path))
    conn = engine.connect()
    result = conn.execute(sql)
    print "Fixing sequences ... ",
    for r in result:
        conn.execute(r[0])
    conn.close()
    print "OK"
Пример #13
0
def add_fixtures(package, name, session):
    """Will add the fixtures for the new modul to the fixture files.

    :package: @todo
    :name: @todo
    :session: @todo
    :returns: @todo

    """
    path = os.path.join(get_app_location(package), package, 'fixtures')
    modul_fixture = get_modul_fixture(name, package, session)
    modul_file = _get_fixture_file(path, "*_modules.json")

    with open(modul_file, "r+") as mf:
        print 'Adding data to fixture "%s"... ' % modul_file,
        modul_json = json.load(mf)
        modul_json.append(modul_fixture)
        mf.seek(0)
        mf.write(json.dumps(modul_json, indent=4))
        print 'Ok'

    modul_id = modul_fixture["id"]
    action_fixtures = get_action_fixtures(session, modul_id)
    action_file = _get_fixture_file(path, "*_actions.json")

    with open(action_file, "r+") as af:
        print 'Adding data to fixture "%s"... ' % action_file,
        action_json = json.load(af)
        action_json.extend(action_fixtures)
        af.seek(0)
        af.write(json.dumps(action_json, indent=4))
        print 'Ok'
Пример #14
0
def add_model_file(package, modul, id, clazz, mixins):
    target_file = os.path.join(get_app_location(package),
                               package, 'model', '%s.py' % modul)
    print 'Adding new model file "%s"... ' % target_file,
    # Build mixins
    mixinclasses = []
    for mixin in mixins:
        mixinclasses.append(mixinmap[mixin])
    try:
        tablename = modul + 's'
        label = modul.capitalize()
        label_plural = label + "s"
        clazzpath = ".".join([package, 'model', modul, label])
        values = {
            'modul': modul,
            'clazzpath': clazzpath,
            'label': label,
            'label_plural': label_plural,
            'modul': modul,
            'table': tablename,
            'id': id,
            'clazz': clazz,
            'mixins': mixinclasses
        }
        template = template_lookup.get_template("model.mako")
        generated = template.render(**values)
        outfile = open(target_file, 'w+')
        outfile.write(generated)
        outfile.close()
        # Import the new model file. This is needed to be able to
        # generate the migration script properly.
        dynamic_import(clazzpath)
        print 'Ok.'
    except Exception:
        print 'Failed.'
Пример #15
0
def del_model_file(package, modul):
    target_file = os.path.join(get_app_location(package),
                               package, 'model', '%s.py' % modul)
    print 'Deleting model file "%s"... ' % target_file,
    try:
        os.remove(target_file)
        print 'Ok.'
    except Exception:
        print 'Failed.'
Пример #16
0
def del_model_file(package, modul):
    target_file = os.path.join(get_app_location(package),
                               package, 'model', '%s.py' % modul)
    print 'Deleting model file "%s"... ' % target_file,
    try:
        os.remove(target_file)
        print 'Ok.'
    except Exception:
        print 'Failed.'
Пример #17
0
def del_form_file(package, modul):
    filename = modul + "s"
    target_file = os.path.join(get_app_location(package),
                               package, 'views', 'forms', '%s.xml' % filename)
    print 'Deleting form configuration file "%s"... ' % target_file,
    try:
        os.remove(target_file)
        print 'Ok.'
    except:
        print 'Failed.'
Пример #18
0
def load_file(data):
    if data.startswith("@"):
        # Load the data from the filesystem.
        # Path is @package:/path/to/file/relative/to/package/file
        app = get_app_location(data.split(":")[0].strip("@"))
        rel_path = data.split(":")[1]
        full_path = os.path.join(app, rel_path)
        with open(full_path, "r") as tf:
            data = tf.read()
    return data
Пример #19
0
def del_form_file(package, modul):
    filename = modul + "s"
    target_file = os.path.join(get_app_location(package),
                               package, 'views', 'forms', '%s.xml' % filename)
    print 'Deleting form configuration file "%s"... ' % target_file,
    try:
        os.remove(target_file)
        print 'Ok.'
    except:
        print 'Failed.'
Пример #20
0
def get_last_revision_file(args):
    """Will return the name of the latest revision file of the application"""
    script_path = []
    script_path.append(get_app_location(args.app))
    script_path.append(args.app)
    script_path.append("alembic")
    script_path.append("versions")
    cwd = os.getcwd()
    os.chdir(os.path.join(*script_path))
    script_path.append(max([fn for fn in os.listdir(".") if fn.endswith("py")],
                       key=os.path.getctime))
    os.chdir(cwd)
    return os.path.join(*script_path)
Пример #21
0
def get_last_revision_file(args):
    """Will return the name of the latest revision file of the application"""
    script_path = []
    script_path.append(get_app_location(args.app))
    script_path.append(args.app)
    script_path.append("alembic")
    script_path.append("versions")
    cwd = os.getcwd()
    os.chdir(os.path.join(*script_path))
    script_path.append(
        max([fn for fn in os.listdir(".") if fn.endswith("py")],
            key=os.path.getctime))
    os.chdir(cwd)
    return os.path.join(*script_path)
Пример #22
0
def add_form_file(package, modul):
    filename = modul + "s"
    target_file = os.path.join(get_app_location(package),
                               package, 'views', 'forms', '%s.xml' % filename)
    print 'Adding new form configuration file "%s"... ' % target_file,
    try:
        values = {}
        template = template_lookup.get_template("form.mako")
        generated = template.render(**values)
        outfile = open(target_file, 'w+')
        outfile.write(generated)
        outfile.close()
        print 'Ok.'
    except:
        print 'Failed.'
Пример #23
0
def handle_ext_delete_command(args):
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)
    session = get_session(os.path.join(*path))
    modul = _load_modul_by_name(session, args.name.replace("ringo_", ""))
    if modul:
        if args.name in extensions:
            session.delete(modul)
            transaction.commit()
            print "Extension %s deleted!" % args.name
        else:
            print "Extension %s already deleted!" % args.name
    else:
        print "Extension %s not found!" % args.name
Пример #24
0
def handle_ext_delete_command(args):
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)
    session = get_session(os.path.join(*path))
    modul = get_modul_by_name(args.name.replace("ringo_", ""), session)
    if modul:
        if args.name in extensions:
            session.delete(modul)
            transaction.commit()
            print "Extension %s deleted!" % args.name
        else:
            print "Extension %s already deleted!" % args.name
    else:
        print "Extension %s not found!" % args.name
Пример #25
0
def add_form_file(package, modul):
    filename = modul + "s"
    target_file = os.path.join(get_app_location(package),
                               package, 'views', 'forms', '%s.xml' % filename)
    print 'Adding new form configuration file "%s"... ' % target_file,
    try:
        values = {}
        template = template_lookup.get_template("form.mako")
        generated = template.render(**values)
        outfile = open(target_file, 'w+')
        outfile.write(generated)
        outfile.close()
        print 'Ok.'
    except:
        print 'Failed.'
Пример #26
0
def handle_ext_init_command(args):
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)
    session = get_session(os.path.join(*path))
    for ext in extensions:
        if ext == args.name:
            if get_modul_by_name(ext.replace("ringo_", ""), session):
                print "Extension %s already added!" % args.name
            else:
                extension = dynamic_import("%s." % args.name)
                _add_modul(extension.modul_config, None, session)
                print "Extension %s added!" % args.name
            break
    else:
        print "Extension %s not found!" % args.name
Пример #27
0
def handle_ext_init_command(args):
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)
    session = get_session(os.path.join(*path))
    for ext in extensions:
        if ext == args.name:
            if _load_modul_by_name(session, ext.replace("ringo_", "")):
                print "Extension %s already added!" % args.name
            else:
                extension = dynamic_import("%s." % args.name)
                _add_modul(extension.modul_config, None, session)
                print "Extension %s added!" % args.name
            break
    else:
        print "Extension %s not found!" % args.name
Пример #28
0
def handle_modul_delete_command(args):
    """@todo: Docstring for add_modul_add_command.

    :args: @todo
    :returns: @todo
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)

    session = get_session(os.path.join(*path))
    package = args.app
    name = args.name
    remove_db_entry(name, session)
    del_model_file(package, name)
    del_form_file(package, name)
    del_table_file(package, name)
Пример #29
0
def handle_modul_delete_command(args):
    """@todo: Docstring for add_modul_add_command.

    :args: @todo
    :returns: @todo
    """
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)

    session = get_session(os.path.join(*path))
    package = args.app
    name = args.name
    remove_db_entry(name, session)
    del_model_file(package, name)
    del_form_file(package, name)
    del_table_file(package, name)
Пример #30
0
def handle_user_passwd_command(args):
    if args.password:
        password = args.password
    else:
        password = password_generator()
    encrypted_password = encrypt_password(password)
    path = []
    path.append(get_app_location(args.app))
    path.append(args.config)
    session = get_session(os.path.join(*path))
    try:
        user = session.query(User).filter(User.login == args.user).all()[0]
    except:
        print "User %s not found in system. You could only alter existing user's passwords" % args.user
    else:
        user.password = encrypted_password
        print "OK! Password for '%s' changed to '%s'" % (args.user, password)
    finally:
        transaction.commit()
Пример #31
0
def get_alembic_config(args, app=None):
    """Return a alembic configuration

    :app: Name of the application
    :returns: Alembic configuration

    """

    config_path = []
    config_path.append(get_app_location(args.app))
    config_path.append(args.app)
    config_path.append("alembic")
    alembic_dir = os.path.join(*config_path)
    config_path.append("alembic.ini")
    cfg = Config(os.path.join(*config_path))
    if args.config:
        app_config = get_appsettings_(args.config)
        cfg.set_main_option("sqlalchemy.url", app_config.get('sqlalchemy.url'))
        cfg.set_main_option("script_location", alembic_dir)
        cfg.set_main_option("app_config", args.config)
    return cfg
Пример #32
0
def get_alembic_config(args, app=None):
    """Return a alembic configuration

    :app: Name of the application
    :returns: Alembic configuration

    """

    config_path = []
    config_path.append(get_app_location(args.app))
    config_path.append(args.app)
    config_path.append("alembic")
    alembic_dir = os.path.join(*config_path)
    config_path.append("alembic.ini")
    cfg = Config(os.path.join(*config_path))
    if args.config:
        app_config = get_appsettings(args.config)
        cfg.set_main_option("sqlalchemy.url",
                            app_config.get('sqlalchemy.url'))
        cfg.set_main_option("script_location",
                            alembic_dir)
        cfg.set_main_option("app_config",
                            args.config)
    return cfg
Пример #33
0
def test_get_app_location():
    import pkg_resources
    from ringo.lib.helpers import get_app_location
    location = pkg_resources.get_distribution("ringo").location
    result = get_app_location()
    assert result == location
Пример #34
0
def test_get_app_location():
    import pkg_resources
    from ringo.lib.helpers import get_app_location
    location = pkg_resources.get_distribution("ringo").location
    result = get_app_location()
    assert result == location