Exemplo n.º 1
0
def user_logged_in_handler(sender, request, user, **kwargs):
    """
    Signal handler called when a user logged into the web app.
    We need to retrieve the backend auth token for subsequent access.
    The token is saved in the session.
    """
    ocl = OclApi()
    if 'password' in request.POST:
        #Login with not hashed password by default, because some users have been created prior to api and web using to the same hashing
        result = ocl.get_user_auth(user.username, request.POST['password'],
                                   False)
    else:
        result = ocl.get_user_auth(user.username, user.password)
    if result.status_code == 200:
        ocl.save_auth_token(request, result.json())
Exemplo n.º 2
0
    def test_concept_names(self):
        """ Test concept names operations
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())


        ocl = OclApi(request, debug=True)
        org_id = 'TESTORG1'
        source_id = 'S1'
        concept_id = 'C2'

        result = ocl.get('orgs', org_id, 'sources', source_id, 'concepts', concept_id, 'names')
        print result.status_code
        print result
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 3
0
    def test_create_user(self):
        """ Test create OCL user """

#        ocl = OclApi(debug=True)
        ocl = OclApi(admin=True)

        username = '******'
        data = {
            "username":username,
            "name":"Test User995",
            "email":"*****@*****.**",
            'hashed_password':"******",
            "company":"Some Company",
            "location":"Eldoret, Kenya",
            "preferred_locale":"en,sw",
            "extras":{"my-field":"my-value"}
        }

        result = ocl.create_user(data)
        print 'create:', result.status_code
        print result.text
        print len(result.text)
        print result.json()
        if result.status_code == 400:
            # try reactivate
            print 'reactivate?'
            result = ocl.reactivate_user('blah') # username)
            print result.status_code # , result.json()
            print result.json()

        result = ocl.get_user_auth(username, 'aaaaaa')
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 4
0
def user_password_reset_handler(sender, request, user, **kwargs):
    ocl = OclApi(admin=True, debug=True)
    result = ocl.sync_password(user)
    if result.status_code == 200:
        result = ocl.get_user_auth(user.username, user.password)
        if result.status_code == 200:
            ocl.save_auth_token(request, result.json())
Exemplo n.º 5
0
    def test_concept_names(self):
        """ Test concept names operations
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())

        ocl = OclApi(request, debug=True)
        org_id = 'TESTORG1'
        source_id = 'S1'
        concept_id = 'C2'

        result = ocl.get('orgs', org_id, 'sources', source_id, 'concepts',
                         concept_id, 'names')
        print result.status_code
        print result
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 6
0
    def test_user_update(self):
        """ Test user partial data update.
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())

        ocl = OclApi(request, debug=True)
        print ocl.get('users', user.username).json()

        data = {'company': 'company one'}
        result = ocl.post('user', **data)
        print result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 7
0
    def test_user_update(self):
        """ Test user partial data update.
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())


        ocl = OclApi(request, debug=True)
        print ocl.get('users', user.username).json()

        data = {'company': 'company one'}
        result = ocl.post('user', **data)
        print result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 8
0
class Importer(object):
    """ Importer class for importing objects into OCL """

    def __init__(self):
        self.ocl = None
        self.username = None
        self.password = None
        self.web_host = os.environ['OCL_WEB_HOST']

    def load_user(self):
        """
            Load access info for specified username to create test data.
            :param username: is an existing user in the system.
        """
        user = User.objects.get(username=self.username)
        print user.password
        self.password = user.password

    def login(self):
        """
            Perform a login for the user to get authenticated access
            for subsequence create calls.
        """
        self.ocl = OclApi(admin=True, debug=True)

        result = self.ocl.get_user_auth(self.username, self.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        # now use a "normal" API interface, save the user's access permission
        self.request = FakeRequest()
        self.ocl.save_auth_token(self.request, result.json())
        self.ocl = OclApi(self.request, debug=True)

    def connect(self):
        """ Login to OCL """
        self.load_user()
        self.login()

    def load_csv(self):
        """ Load data from CSV file and save to self.reader """
        print 'Loading from %s...' % self.filename
        f = open(self.filename, 'r')
        self.reader = csv.DictReader(f)

    def get_args(self, args, options):
        """
        Pick up common arguments like CSV file path and username
        """
        print args, options
        self.test_mode = options['test_mode']
        self.username = options['username']
        self.filename = options['filename']

        if self.username is None:
            raise CommandError('--username is required.')

        if self.test_mode:
            print 'Testing only...'
Exemplo n.º 9
0
class Importer(object):
    """ Importer class for importing objects into OCL """
    def __init__(self):
        self.ocl = None
        self.username = None
        self.password = None
        self.web_host = os.environ['OCL_WEB_HOST']

    def load_user(self):
        """
            Load access info for specified username to create test data.
            :param username: is an existing user in the system.
        """
        user = User.objects.get(username=self.username)
        print user.password
        self.password = user.password

    def login(self):
        """
            Perform a login for the user to get authenticated access
            for subsequence create calls.
        """
        self.ocl = OclApi(admin=True, debug=True)

        result = self.ocl.get_user_auth(self.username, self.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        # now use a "normal" API interface, save the user's access permission
        self.request = FakeRequest()
        self.ocl.save_auth_token(self.request, result.json())
        self.ocl = OclApi(self.request, debug=True)

    def connect(self):
        """ Login to OCL """
        self.load_user()
        self.login()

    def load_csv(self):
        """ Load data from CSV file and save to self.reader """
        print 'Loading from %s...' % self.filename
        f = open(self.filename, 'r')
        self.reader = csv.DictReader(f)

    def get_args(self, args, options):
        """
        Pick up common arguments like CSV file path and username
        """
        print args, options
        self.test_mode = options['test_mode']
        self.username = options['username']
        self.filename = options['filename']

        if self.username is None:
            raise CommandError('--username is required.')

        if self.test_mode:
            print 'Testing only...'
Exemplo n.º 10
0
    def test_user_login(self):
        """ Note that password is hardcoded for now.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 11
0
    def test_user_login(self):
        """ Note that password is hardcoded for now.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 12
0
def user_logged_in_handler(sender, request, user, **kwargs):
    """
    Signal handler called when a user logged into the web app.
    We need to retrieve the backend auth token for subsequent access.
    The token is saved in the session.

    TODO: Cannot get to, or hashed_password is not saved, so this
    fails with an invalid password.
    """
    print 'User logged in Signal for:', user.username
    ocl = OclApi(admin=True, debug=True)
    result = ocl.get_user_auth(user.username, user.password)
    if result.status_code == 200:
        print 'LOGIN auth code:', result.json()
        ocl.save_auth_token(request, result.json())
Exemplo n.º 13
0
    def test_concept_create(self):
        """ Test concept create
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())

        ocl = OclApi(request, debug=True)
        org_id = 'TESTORG1'
        source_id = 'S1'

        data = {
            'id': 'CTEST001',
            'concept_class': 'Diagnosis',
            'datatype': 'String',
        }
        names = [{
            'name': 'concept name',
            'locale': 'en',
        }]
        result = ocl.create_concept('orgs',
                                    org_id,
                                    source_id,
                                    base_data=data,
                                    names=names)
        print result.status_code
        print result
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 14
0
    def test_concept_create(self):
        """ Test concept create
            Need to login first with hard coded password.
         """
        ocl = OclApi(admin=True, debug=True)

        user = User.objects.create_user(username=self.username)
        user.password = self.password
        user.save()

        result = ocl.get_user_auth(user.username, user.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        request = FakeRequest()
        ocl.save_auth_token(request, result.json())


        ocl = OclApi(request, debug=True)
        org_id = 'TESTORG1'
        source_id = 'S1'


        data = {
            'id': 'CTEST001',
            'concept_class': 'Diagnosis',
            'datatype': 'String',
        }
        names = [{
            'name': 'concept name',
            'locale': 'en',
        }]
        result = ocl.create_concept('orgs', org_id, source_id, base_data=data, names=names)
        print result.status_code
        print result
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 15
0
    def test_create_user(self):
        """ Test create OCL user """

        #        ocl = OclApi(debug=True)
        ocl = OclApi(admin=True)

        username = '******'
        data = {
            "username": username,
            "name": "Test User995",
            "email": "*****@*****.**",
            'hashed_password': "******",
            "company": "Some Company",
            "location": "Eldoret, Kenya",
            "preferred_locale": "en,sw",
            "extras": {
                "my-field": "my-value"
            }
        }

        result = ocl.create_user(data)
        print 'create:', result.status_code
        print result.text
        print len(result.text)
        print result.json()
        if result.status_code == 400:
            # try reactivate
            print 'reactivate?'
            result = ocl.reactivate_user('blah')  # username)
            print result.status_code  # , result.json()
            print result.json()

        result = ocl.get_user_auth(username, 'aaaaaa')
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()
Exemplo n.º 16
0
class Command(BaseCommand):
    """ manage.py Command retire_concepts """
    help = 'Retire concepts'
    option_list = BaseCommand.option_list + (
        make_option('--username',
                    action='store',
                    dest='username',
                    default=None,
                    help='username for an existing user, e.g. demo1'),
        make_option('--org_id',
                    action='store',
                    dest='org_id',
                    default=None,
                    help='Organization ID, e.g. OMRS'),
        make_option('--source_id',
                    action='store',
                    dest='source_id',
                    default=None,
                    help='Source ID, e.g. OMRS'),
    )

    def __init__(self):
        super(Command, self).__init__()
        self.ocl = None
        self.username = None
        self.password = None
        self.api_host = os.environ['OCL_API_HOST']
        self.web_host = os.environ['OCL_WEB_HOST']
        self.ORG_ID = None
        self.SOURCE_ID = None
        self.locale_list = [d['code'] for d in _get_locale_list()]
        self.source_type_list = _get_source_type_list()
        self.concept_class_list = _get_concept_class_list()
        self.datatype_list = _get_datatype_list()

    def load_user(self, username):
        """
            Load access info for specified username to create data.
            :param username: is an existing user in the system.
        """
        user = User.objects.get(username=username)
        print user.password
        self.username = username
        self.password = user.password

    def login(self):
        """
            Perform a login for the user to get authenticated access
            for subsequence create calls.
        """
        self.ocl = OclApi(admin=True, debug=True)

        result = self.ocl.get_user_auth(self.username, self.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        # now use a "normal" API interface, save the user's access permission
        self.request = FakeRequest()
        self.ocl.save_auth_token(self.request, result.json())
        self.ocl = OclApi(self.request, debug=True)

    def retire(self, concept_id):
        """
            Retire concept with specified ID and org/source specified on command line.

            :param concept_id: is the concept_id

        """

        # retired_reason is null in CIEL, so no need to set update_comment
        result = self.ocl.delete(
            'orgs', self.ORG_ID, 'sources', self.SOURCE_ID, 'concepts', concept_id)
        print result

    def retire_concepts(self):
        """ Load concepts to retire from file, iterate through them, and retire """
        for line in self.input:
            cid = line.strip()
            self.retire(cid)

    def handle(self, *args, **options):

        if len(args) != 1:
            raise CommandError('mapping input text file is required.')

        username = options['username']

        if username is None:
            raise CommandError('--username is required.')

        self.ORG_ID = options['org_id']
        if self.ORG_ID is None:
            raise CommandError('--org_id is required.')

        self.SOURCE_ID = options['source_id']
        if self.SOURCE_ID is None:
            raise CommandError('--source_id is required.')

        input_file = args[0]
        if not os.path.exists(input_file):
            raise CommandError('Could not find input file %s' % input_file)

        try:
            self.input = open(input_file, 'rb')
            # get total record count
            self.total = sum(1 for line in self.input)
            self.input.seek(0)
        except IOError:
            raise CommandError('Could not open input file %s' % input_file)

        self.load_user(username)
        self.login()

        self.retire_concepts()
class Command(BaseCommand):
    """ manage.py Command 'create_demo_data' """
    help = 'Create demo data'
    option_list = BaseCommand.option_list + (
        make_option('--username',
                    action='store',
                    dest='username',
                    default=None,
                    help='username for an existing user, e.g. demo1'),
        make_option('--org_id',
                    action='store',
                    dest='org_id',
                    default=None,
                    help='Organization ID, e.g. HLTH01'),
        make_option('--create',
                    action='store_true',
                    dest='create_mode',
                    default=False,
                    help='Create data.'),
    )

    def __init__(self):
        super(Command, self).__init__()
        self.ocl = None
        self.username = None
        self.password = None
        self.web_host = os.environ['OCL_WEB_HOST']
        self.ORG_ID = None
        self.locale_list = [d['code'] for d in _get_locale_list()]
        self.source_type_list = _get_source_type_list()
        self.concept_class_list = _get_concept_class_list()
        self.datatype_list = _get_datatype_list()

    def load_user(self, username):
        """
            Load access info for specified username to create test data.
            :param username: is an existing user in the system.
        """
        user = User.objects.get(username=username)
        print user.password
        self.username = username
        self.password = user.password

    def signup(self):
        """
            Signup a new user via the web interface.

            Not ready for use yet.
        """
        url = self.web_host + '/accounts/signup/'
        results = requests.get(url)
        csrf = results.cookies['csrftoken']
        cookies = {'csrftoken': csrf}
        headers = {'X-CSRFToken': csrf}
        d = {
            'csrfmiddlewaretoken': csrf,
            'first_name': '',
            'last_name': '',
            'username': '',
            'password1': '',
            'password2': '',
            'email': '',
        }
        results = requests.post(url,
                                data=json.dumps(d),
                                cookies=cookies,
                                headers=headers)
        print results

    def login(self):
        """
            Perform a login for the user to get authenticated access
            for subsequence create calls.
        """
        self.ocl = OclApi(admin=True, debug=True)

        result = self.ocl.get_user_auth(self.username, self.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        # now use a "normal" API interface, save the user's access permission
        self.request = FakeRequest()
        self.ocl.save_auth_token(self.request, result.json())
        self.ocl = OclApi(self.request, debug=True)

    def make_source_name(self, n):
        """
            Create source name.

            :param n: is a number.
            :returns: a source name based on the ORG_ID and n.
        """
        return '%sS%d' % (self.ORG_ID, n)

    def make_concept_id(self, s, c):
        """
            Create concept_id

            :param s: is a number, for source
            :param c: is a number, for concept
            :returns: a source name based on the ORG_ID,s and c.
        """
        return '%s-S%d-C%d' % (self.ORG_ID, s, c)

    def create_orgs(self):
        """ Create one test org for our user """
        data = {
            'id': self.ORG_ID,
            'name': 'Health Org %s' % self.ORG_ID,
            'website': 'http://www.health%s.org' % self.ORG_ID,
            'location': 'Boston, MA, USA'
        }
        print 'creating org %s' % self.ORG_ID
        result = self.ocl.create_org(data)
        print result

    def create_sources(self):
        """ Create sources for demo data """

        for n in range(1, 11):
            n = self.make_source_name(n)
            data = {
                'short_code': n,
                'name': n,
                'id': n,
                'source_type': random.choice(self.source_type_list)
            }
            print 'creating source %s' % n
            result = self.ocl.create_source('orgs', self.ORG_ID, data)
            print result

    def create_concepts(self):
        """ Create concepts for demo data """

        for s in range(1, 11):
            sid = self.make_source_name(s)
            for c in range(1, 21):
                concept_id = self.make_concept_id(s, c)

                data = {
                    'id': concept_id,
                    'concept_class': random.choice(self.concept_class_list),
                    'datatype': random.choice(self.datatype_list),
                }
                lc = random.choice(self.locale_list)
                name = {
                    'name': 'Concept %s Source %d C%d' % (self.ORG_ID, s, c),
                    'locale': lc,
                    'preferred': lc,
                }
                print 'creating concept %s' % concept_id
                result = self.ocl.create_concept('orgs',
                                                 self.ORG_ID,
                                                 sid,
                                                 data,
                                                 names=[name])
                print result

    def update_concepts(self):
        """ Update concepts for demo data -- WHEN IS THIS USED? """

        for s in range(1, 11):
            sid = self.make_source_name(s)
            for c in range(1, 21):
                concept_id = self.make_concept_id(s, c)
                data = {
                    'concept_class': random.choice(self.concept_class_list),
                    'datatype': random.choice(self.datatype_list),
                    'update_comment': 'testing update',
                }

                print 'updating concept %s' % concept_id
                result = self.ocl.update_concept('orgs', self.ORG_ID, sid,
                                                 concept_id, data)
                print result

    def add_concept_data(self):
        """ Add names and descriptions """

        for s in range(1, 11):
            sid = self.make_source_name(s)
            for c in range(1, 21):
                concept_id = self.make_concept_id(s, c)

                for v in ['one', 'two', 'three']:
                    data = {
                        'name': '%s variant %s' % (concept_id, v),
                        'locale': random.choice(self.locale_list),
                    }

                    print 'adding name %s' % data['name']
                    result = self.ocl.post('orgs', self.ORG_ID, 'sources', sid,
                                           'concepts', concept_id, 'names',
                                           **data)
                    print result

                    data = {
                        'description':
                        'description for %s variant %s' % (concept_id, v),
                        'locale':
                        random.choice(self.locale_list),
                    }

                    print 'adding desc %s' % data['description']
                    result = self.ocl.post('orgs', self.ORG_ID, 'sources', sid,
                                           'concepts', concept_id,
                                           'descriptions', **data)
                    print result

    def handle(self, *args, **options):

        create_mode = options['create_mode']
        username = options['username']
        if create_mode:
            if username is None:
                raise CommandError('--username is required.')

            self.ORG_ID = options['org_id']
            if self.ORG_ID is None:
                raise CommandError('--org_id is required.')

            self.load_user(username)
            self.login()

            self.create_orgs()
            self.create_sources()
            self.create_concepts()
            self.add_concept_data()
            self.update_concepts()
Exemplo n.º 18
0
class Command(BaseCommand):
    """ manage.py Command 'import_mappings' """
    help = 'Import mappigs'
    option_list = BaseCommand.option_list + (
        make_option('--username',
                    action='store',
                    dest='username',
                    default=None,
                    help='username for an existing user, e.g. demo1'),
        make_option('--org_id',
                    action='store',
                    dest='org_id',
                    default=None,
                    help='Organization ID, e.g. OMRS'),
        make_option('--source_id',
                    action='store',
                    dest='source_id',
                    default=None,
                    help='Source ID, e.g. OMRS'),
    )

    def __init__(self):
        super(Command, self).__init__()
        self.ocl = None
        self.username = None
        self.password = None
        self.api_host = os.environ['OCL_API_HOST']
        self.web_host = os.environ['OCL_WEB_HOST']
        self.ORG_ID = None
        self.SOURCE_ID = None
        self.locale_list = [d['code'] for d in _get_locale_list()]
        self.source_type_list = _get_source_type_list()
        self.concept_class_list = _get_concept_class_list()
        self.datatype_list = _get_datatype_list()

    def load_user(self, username):
        """
            Load access info for specified username to create data.
            :param username: is an existing user in the system.
        """
        user = User.objects.get(username=username)
        print user.password
        self.username = username
        self.password = user.password

    def login(self):
        """
            Perform a login for the user to get authenticated access
            for subsequence create calls.
        """
        self.ocl = OclApi(admin=True, debug=True)

        result = self.ocl.get_user_auth(self.username, self.password)
        print 'get auth:', result.status_code
        if len(result.text) > 0:
            print result.json()

        # now use a "normal" API interface, save the user's access permission
        self.request = FakeRequest()
        self.ocl.save_auth_token(self.request, result.json())
        self.ocl = OclApi(self.request, debug=True)

    def create_mapping(self, fields):
        """
        Create mappings from fields.

        :param fields: is a list in the form of mapping_name, src_id, dest_id+

        NOTE: The API URL path version is hard coded TBW
        """
        map_type = fields[0]
        source_cid = fields[1]

        if map_type == 'internal':
            map_type, code, source = fields[2].split(',')
            print map_type, code, source
            data = {
                'map_type': map_type,
                'to_source_code': source,
                'to_concept_code': code,
            }
            result = self.ocl.create_mapping_from_concept(
                'orgs', self.ORG_ID, self.SOURCE_ID, source_cid, data)
            print result
            return

        for dest_id in fields[2:]:
            data = {
                'map_type':
                map_type,
                'to_concept_url':
                '%s/v1/orgs/%s/sources/%s/concepts/%s/' %
                (self.api_host, self.ORG_ID, self.SOURCE_ID, dest_id),
                'to_concept_url':
                '/orgs/%s/sources/%s/concepts/%s/' %
                (self.ORG_ID, self.SOURCE_ID, dest_id),
            }
            result = self.ocl.create_mapping_from_concept(
                'orgs', self.ORG_ID, self.SOURCE_ID, source_cid, data)
            print result

    def load_mappings(self):
        """ Load mappings from file """
        for line in self.input:
            fields = line.split()
            self.create_mapping(fields)

    def handle(self, *args, **options):

        if len(args) != 1:
            raise CommandError('mapping input text file is required.')

        username = options['username']

        if username is None:
            raise CommandError('--username is required.')

        self.ORG_ID = options['org_id']
        if self.ORG_ID is None:
            raise CommandError('--org_id is required.')

        self.SOURCE_ID = options['source_id']
        if self.SOURCE_ID is None:
            raise CommandError('--source_id is required.')

        input_file = args[0]
        if not os.path.exists(input_file):
            raise CommandError('Could not find input file %s' % input_file)

        try:
            self.input = open(input_file, 'rb')
            # get total record count
            self.total = sum(1 for line in self.input)
            self.input.seek(0)
        except IOError:
            raise CommandError('Could not open input file %s' % input_file)

        self.load_user(username)
        self.login()

        self.load_mappings()