view scripts/copy-user.py @ 7906:470616e64414

issue2551334 - get test suite running under windows Fix test_cgi under windows. Few classes of errors: 1) comparing paths with a/b (unix) to a\b (windows). Use normpath to fix it. Also change regexps used for path matching to use either \ or / for directory separators. 2) database not being closed preventing deletion of test case directory. Windows doesn't allow deletion of open files. In some cases replaced calling client.inner_mail() with main() because main() makes sure to close the database. In other cases assigned self.db = client.db beacuse client reopens the database and closes the original self.db. Reassigning allows tearDown to close the last opened handle to a db. 3) commit the admin password to the database. If it's not commited calling the code sometimes comes up with a different admin password. Not sure why we don't see this on linux. 4) run commit() on database so that sqlite databases can be closed and deleted. Unit tests don't call the main entry points that have finally clauses to close the databases properly, so do it in the test. 5) split tests that try to resolve symbolic links in the template directory to a separate method. Under windows user needs special permissions to creae symbolic links, so I report the method is skipped if creating a link fails.
author John Rouillard <rouilj@ieee.org>
date Sat, 27 Apr 2024 23:19:51 -0400
parents 2a6c3eb4e059
children fed0f839c260
line wrap: on
line source

#!/usr/bin/env python
# Copyright (C) 2003 by Intevation GmbH
# Author:
# Thomas Arendsen Hein <thomas@intevation.de>
#
# This program is free software dual licensed under the GPL (>=v2)
# and the Roundup Licensing (see COPYING.txt in the roundup distribution).

"""
copy-user <instance-home> <instance-home> <userid> [<userid>...]

Copy one or more Roundup users from one tracker instance to another.
Example:
    copy-user /roundup/tracker1 /roundup/tracker2 `seq 3 10` 14 16
    (copies users 3, 4, 5, 6, 7, 8, 9, 10, 14 and 16)
"""

from __future__ import print_function

import sys

import roundup.instance


def copy_user(home1, home2, *userids):
    """Copy users which are listed by userids from home1 to home2"""

    copyattribs = ['username', 'password', 'address', 'realname', 'phone',
                   'organisation', 'alternate_addresses', 'roles', 'timezone']

    try:
        instance1 = roundup.instance.open(home1)
        print("Opened source instance: %s" % home1)
    except:
        print("Can't open source instance: %s" % home1)
        sys.exit(1)

    try:
        instance2 = roundup.instance.open(home2)
        print("Opened target instance: %s" % home2)
    except:
        print("Can't open target instance: %s" % home2)
        sys.exit(1)

    db1 = instance1.open('admin')
    db2 = instance2.open('admin')

    db1.tx_Source = "cli"
    db2.tx_Source = "cli"

    userlist = db1.user.list()
    for userid in userids:
        try:
            userid = str(int(userid))
        except ValueError:
            print("Not a numeric user id: %s  Skipping ..." % (userid,))
            continue
        if userid not in userlist:
            print("User %s not in source instance. Skipping ..." % userid)
            continue

        user = {}
        for attrib in copyattribs:
            value = db1.user.get(userid, attrib)
            if value:
                user[attrib] = value
        try:
            db2.user.lookup(user['username'])
            print("User %s: Username '%s' exists in target instance. Skipping ..." % (userid, user['username']))
            continue
        except KeyError:
            pass
        print("Copying user %s (%s) ..." % (userid, user['username']))
        db2.user.create(**user)

    db2.commit()
    db2.close()
    print("Closed target instance.")
    db1.close()
    print("Closed source instance.")


if __name__ == "__main__":
    if len(sys.argv) < 4:
        print(__doc__)
        sys.exit(1)
    else:
        copy_user(*sys.argv[1:])


Roundup Issue Tracker: http://roundup-tracker.org/