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())
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()
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()
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())
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()
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...'
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()
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())
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()
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()
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()
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()