def create_vaccine(pk_drug_product=None, product_name=None, indications=None, is_live=None): assert (is_live is not None), '<is_live> must not be <None>' conn = gmPG2.get_connection(readonly = False) if pk_drug_product is None: #prep = _('vaccine') prep = 'vaccine' _log.debug('creating vaccine drug product [%s %s]', product_name, prep) vacc_prod = gmMedication.create_drug_product ( product_name = product_name, preparation = prep, return_existing = True, # indications are ref.dose rows doses = indications, link_obj = conn ) #conn.commit() vacc_prod['atc'] = 'J07' vacc_prod.save(conn = conn) pk_drug_product = vacc_prod['pk_drug_product'] cmd = 'INSERT INTO ref.vaccine (fk_drug_product, is_live) values (%(pk_drug_product)s, %(live)s) RETURNING pk' queries = [{'cmd': cmd, 'args': {'pk_drug_product': pk_drug_product, 'live': is_live}}] rows, idx = gmPG2.run_rw_queries(link_obj = conn, queries = queries, get_col_idx = False, return_data = True, end_tx = True) conn.close() return cVaccine(aPK_obj = rows[0]['pk'])
def create_vaccine(pk_drug_product=None, product_name=None, indications=None): conn = gmPG2.get_connection(readonly=False) if pk_drug_product is None: #prep = _('vaccine') prep = u'vaccine' _log.debug('creating vaccine drug product [%s %s]', product_name, prep) vacc_prod = gmMedication.create_drug_product( product_name=product_name, preparation=prep, return_existing=True, # indications are ref.dose rows doses=indications, link_obj=conn) #conn.commit() vacc_prod['atc'] = u'J07' vacc_prod.save(conn=conn) pk_drug_product = vacc_prod['pk_drug_product'] cmd = u'INSERT INTO ref.vaccine (fk_drug_product) values (%(pk_drug_product)s) RETURNING pk' queries = [{'cmd': cmd, 'args': {'pk_drug_product': pk_drug_product}}] rows, idx = gmPG2.run_rw_queries(link_obj=conn, queries=queries, get_col_idx=False, return_data=True, end_tx=True) conn.close() return cVaccine(aPK_obj=rows[0]['pk'])
def create_vaccine(pk_drug_product=None, product_name=None, indications=None, pk_indications=None): if pk_drug_product is None: prep = _('vaccine') _log.debug('creating drug product [%s %s]', product_name, prep) prod = gmMedication.create_drug_product(product_name=product_name, preparation=prep, return_existing=True) prod['atc'] = u'J07' prod.save() pk_drug_product = prod['pk_drug_product'] cmd = u'INSERT INTO clin.vaccine (fk_drug_product) values (%(pk_drug_product)s) RETURNING pk' queries = [{'cmd': cmd, 'args': {'pk_drug_product': pk_drug_product}}] if pk_indications is None: for indication in indications: cmd = u""" INSERT INTO clin.lnk_vaccine2inds ( fk_vaccine, fk_indication ) VALUES ( currval(pg_get_serial_sequence('clin.vaccine', 'pk')), (SELECT id FROM clin.vacc_indication WHERE lower(description) = lower(%(ind)s) LIMIT 1 ) ) RETURNING fk_vaccine """ queries.append({'cmd': cmd, 'args': {'ind': indication}}) else: for pk_indication in pk_indications: cmd = u""" INSERT INTO clin.lnk_vaccine2inds ( fk_vaccine, fk_indication ) VALUES ( currval(pg_get_serial_sequence('clin.vaccine', 'pk')), %(pk_ind)s ) RETURNING fk_vaccine """ queries.append({'cmd': cmd, 'args': {'pk_ind': pk_indication}}) rows, idx = gmPG2.run_rw_queries(queries=queries, get_col_idx=False, return_data=True) return cVaccine(aPK_obj=rows[0]['fk_vaccine'])
def import_drugs(self): selected_drugs = self.__let_user_select_drugs() if selected_drugs is None: return None data_src_pk = self.create_data_source_entry() new_drugs = [] new_substances = [] for entry in selected_drugs: _log.debug('importing drug: %s %s', entry['name'], entry['darreichungsform']) if entry['hilfsmittel']: _log.debug('skipping Hilfsmittel') continue if entry['erstattbares_medizinprodukt']: _log.debug('skipping sonstiges Medizinprodukt') continue # create drug product (or get it if it already exists) drug = gmMedication.create_drug_product(product_name = entry['name'], preparation = entry['darreichungsform']) if drug is None: drug = gmMedication.get_drug_by_name(product_name = entry['name'], preparation = entry['darreichungsform']) new_drugs.append(drug) # update fields drug['is_fake_product'] = False drug['atc'] = entry['atc'] drug['external_code_type'] = 'DE-PZN' drug['external_code'] = entry['pzn'] drug['fk_data_source'] = data_src_pk drug.save() # add components to drug atc = None # hopefully MMI eventually supports atc-per-substance in a drug... if len(entry['wirkstoffe']) == 1: atc = entry['atc'] for wirkstoff in entry['wirkstoffe']: drug.add_component(substance = wirkstoff, atc = atc) # create as substance doses, too atc = None # hopefully MMI eventually supports atc-per-substance in a drug... if len(entry['wirkstoffe']) == 1: atc = entry['atc'] for wirkstoff in entry['wirkstoffe']: #new_substances.append(gmMedication.create_substance_dose(substance = wirkstoff, atc = atc, amount = amount, unit = unit)) pass return new_drugs, new_substances
def import_drugs(self): selected_drugs = self.__let_user_select_drugs() if selected_drugs is None: return None data_src_pk = self.create_data_source_entry() new_drugs = [] new_substances = [] for entry in selected_drugs: _log.debug('importing drug: %s %s', entry['name'], entry['darreichungsform']) if entry['hilfsmittel']: _log.debug('skipping Hilfsmittel') continue if entry['erstattbares_medizinprodukt']: _log.debug('skipping sonstiges Medizinprodukt') continue # create drug product (or get it if it already exists) drug = gmMedication.create_drug_product(product_name = entry['name'], preparation = entry['darreichungsform']) if drug is None: drug = gmMedication.get_drug_by_name(product_name = entry['name'], preparation = entry['darreichungsform']) new_drugs.append(drug) # update fields drug['is_fake_product'] = False drug['atc'] = entry['atc'] drug['external_code_type'] = 'DE-PZN' drug['external_code'] = entry['pzn'] drug['fk_data_source'] = data_src_pk drug.save() # add components to drug atc = None # hopefully MMI eventually supports atc-per-substance in a drug... if len(entry['wirkstoffe']) == 1: atc = entry['atc'] for wirkstoff in entry['wirkstoffe']: drug.add_component(substance = wirkstoff, atc = atc) # create as substance doses, too atc = None # hopefully MMI eventually supports atc-per-substance in a drug... if len(entry['wirkstoffe']) == 1: atc = entry['atc'] for wirkstoff in entry['wirkstoffe']: new_substances.append(gmMedication.create_substance_dose(substance = wirkstoff, atc = atc, amount = amount, unit = unit)) return new_drugs, new_substances
def __import_fd2gm_file_as_drugs_0_6_0(self, fd2gm_xml=None, pk_data_source=None): # drug_id_name = db_def.attrib['drugUidName'] fd_xml_prescriptions = fd2gm_xml.findall('FullPrescription/Prescription') self.__imported_drugs = [] for fd_xml_prescription in fd_xml_prescriptions: drug_uid = fd_xml_prescription.find('Drug').attrib['u1'].strip() if drug_uid == '-1': _log.debug('skipping textual drug') continue drug_db = fd_xml_prescription.find('Drug').attrib['db'].strip() drug_uid_name = fd_xml_prescription.find('Drug/DrugUidName').text.strip() #drug_uid_name = u'<%s>' % drug_db drug_name = fd_xml_prescription.find('Drug/DrugName').text.replace(', )', ')').strip() drug_form = fd_xml_prescription.find('Drug/DrugForm').text.strip() # drug_atc = fd_xml_prescription.find('DrugATC') # if drug_atc is None: # drug_atc = u'' # else: # if drug_atc.text is None: # drug_atc = u'' # else: # drug_atc = drug_atc.text.strip() # create new drug product new_drug = gmMedication.create_drug_product(product_name = drug_name, preparation = drug_form, return_existing = True) self.__imported_drugs.append(new_drug) new_drug['is_fake_product'] = False # new_drug['atc'] = drug_atc new_drug['external_code_type'] = 'FreeDiams::%s::%s' % (drug_db, drug_uid_name) new_drug['external_code'] = drug_uid new_drug['pk_data_source'] = pk_data_source new_drug.save() # parse XML for composition records fd_xml_components = fd_xml_prescription.getiterator('Composition') comp_data = {} for fd_xml_comp in fd_xml_components: data = {} xml_strength = fd_xml_comp.attrib['strength'].strip() amount = regex.match(r'^\d+[.,]{0,1}\d*', xml_strength) if amount is None: amount = 99999 else: amount = amount.group() data['amount'] = amount #unit = regex.sub(r'\d+[.,]{0,1}\d*', u'', xml_strength).strip() unit = (xml_strength[len(amount):]).strip() if unit == '': unit = '*?*' data['unit'] = unit # hopefully, FreeDiams gets their act together, eventually: atc = regex.match(r'[A-Za-z]\d\d[A-Za-z]{2}\d\d', fd_xml_comp.attrib['atc'].strip()) if atc is None: data['atc'] = None else: atc = atc.group() data['atc'] = atc molecule_name = fd_xml_comp.attrib['molecularName'].strip() if molecule_name != '': gmMedication.create_substance_dose(substance = molecule_name, atc = atc, amount = amount, unit = unit) data['molecule_name'] = molecule_name inn_name = fd_xml_comp.attrib['inn'].strip() if inn_name != '': gmMedication.create_substance_dose(substance = inn_name, atc = atc, amount = amount, unit = unit) #data['inn_name'] = molecule_name data['inn_name'] = inn_name if molecule_name == '': data['substance'] = inn_name _log.info('linking INN [%s] rather than molecularName as component', inn_name) else: data['substance'] = molecule_name data['nature'] = fd_xml_comp.attrib['nature'].strip() data['nature_ID'] = fd_xml_comp.attrib['natureLink'].strip() # merge composition records of SA/FT nature try: old_data = comp_data[data['nature_ID']] # normalize INN if old_data['inn_name'] == '': old_data['inn_name'] = data['inn_name'] if data['inn_name'] == '': data['inn_name'] = old_data['inn_name'] # normalize molecule if old_data['molecule_name'] == '': old_data['molecule_name'] = data['molecule_name'] if data['molecule_name'] == '': data['molecule_name'] = old_data['molecule_name'] # normalize ATC if old_data['atc'] == '': old_data['atc'] = data['atc'] if data['atc'] == '': data['atc'] = old_data['atc'] # FT: transformed form # SA: active substance # it would be preferable to use the SA record because that's what's *actually* # contained in the drug, however FreeDiams does not list the amount thereof # (rather that of the INN) # FT and SA records of the same component carry the same nature_ID if data['nature'] == 'FT': comp_data[data['nature_ID']] = data else: comp_data[data['nature_ID']] = old_data # or create new record except KeyError: comp_data[data['nature_ID']] = data # actually create components from (possibly merged) composition records for key, data in comp_data.items(): new_drug.add_component ( substance = data['substance'], atc = data['atc'], amount = data['amount'], unit = data['unit'] )
def __import_fd2gm_file_as_drugs_0_5(self, fd2gm_xml=None, pk_data_source=None): db_def = fd2gm_xml.find('DrugsDatabaseName') db_id = db_def.text.strip() drug_id_name = db_def.attrib['drugUidName'] fd_xml_drug_entries = fd2gm_xml.findall('FullPrescription/Prescription') self.__imported_drugs = [] for fd_xml_drug in fd_xml_drug_entries: drug_uid = fd_xml_drug.find('Drug_UID').text.strip() if drug_uid == '-1': _log.debug('skipping textual drug') continue # it's a TextualDrug, skip it drug_name = fd_xml_drug.find('DrugName').text.replace(', )', ')').strip() drug_form = fd_xml_drug.find('DrugForm').text.strip() drug_atc = fd_xml_drug.find('DrugATC') if drug_atc is None: drug_atc = '' else: if drug_atc.text is None: drug_atc = '' else: drug_atc = drug_atc.text.strip() # create new drug product new_drug = gmMedication.create_drug_product(product_name = drug_name, preparation = drug_form, return_existing = True) self.__imported_drugs.append(new_drug) new_drug['is_fake_product'] = False new_drug['atc'] = drug_atc new_drug['external_code_type'] = 'FreeDiams::%s::%s' % (db_id, drug_id_name) new_drug['external_code'] = drug_uid new_drug['pk_data_source'] = pk_data_source new_drug.save() # parse XML for composition records fd_xml_components = fd_xml_drug.getiterator('Composition') comp_data = {} for fd_xml_comp in fd_xml_components: data = {} amount = regex.match(r'\d+[.,]{0,1}\d*', fd_xml_comp.attrib['strenght'].strip()) # sic, typo if amount is None: amount = 99999 else: amount = amount.group() data['amount'] = amount unit = regex.sub(r'\d+[.,]{0,1}\d*', '', fd_xml_comp.attrib['strenght'].strip()).strip() # sic, typo if unit == '': unit = '*?*' data['unit'] = unit molecule_name = fd_xml_comp.attrib['molecularName'].strip() if molecule_name != '': gmMedication.create_substance_dose(substance = molecule_name, atc = None, amount = amount, unit = unit) data['molecule_name'] = molecule_name inn_name = fd_xml_comp.attrib['inn'].strip() if inn_name != '': gmMedication.create_substance_dose(substance = inn_name, atc = None, amount = amount, unit = unit) data['inn_name'] = molecule_name if molecule_name == '': data['substance'] = inn_name _log.info('linking INN [%s] rather than molecularName as component', inn_name) else: data['substance'] = molecule_name data['nature'] = fd_xml_comp.attrib['nature'].strip() data['nature_ID'] = fd_xml_comp.attrib['natureLink'].strip() # merge composition records of SA/FT nature try: old_data = comp_data[data['nature_ID']] # normalize INN if old_data['inn_name'] == '': old_data['inn_name'] = data['inn_name'] if data['inn_name'] == '': data['inn_name'] = old_data['inn_name'] # normalize molecule if old_data['molecule_name'] == '': old_data['molecule_name'] = data['molecule_name'] if data['molecule_name'] == '': data['molecule_name'] = old_data['molecule_name'] # FT: transformed form # SA: active substance # it would be preferable to use the SA record because that's what's *actually* # contained in the drug, however FreeDiams does not list the amount thereof # (rather that of the INN) if data['nature'] == 'FT': comp_data[data['nature_ID']] = data else: comp_data[data['nature_ID']] = old_data # or create new record except KeyError: comp_data[data['nature_ID']] = data # actually create components from (possibly merged) composition records for key, data in comp_data.items(): new_drug.add_component ( substance = data['substance'], amount = data['amount'], unit = data['unit'] )
def __import_fd2gm_file_as_drugs_0_6_0(self, fd2gm_xml=None, pk_data_source=None): # drug_id_name = db_def.attrib['drugUidName'] fd_xml_prescriptions = fd2gm_xml.findall('FullPrescription/Prescription') self.__imported_drugs = [] for fd_xml_prescription in fd_xml_prescriptions: drug_uid = fd_xml_prescription.find('Drug').attrib['u1'].strip() if drug_uid == '-1': _log.debug('skipping textual drug') continue drug_db = fd_xml_prescription.find('Drug').attrib['db'].strip() drug_uid_name = fd_xml_prescription.find('Drug/DrugUidName').text.strip() #drug_uid_name = u'<%s>' % drug_db drug_name = fd_xml_prescription.find('Drug/DrugName').text.replace(', )', ')').strip() drug_form = fd_xml_prescription.find('Drug/DrugForm').text.strip() # drug_atc = fd_xml_prescription.find('DrugATC') # if drug_atc is None: # drug_atc = u'' # else: # if drug_atc.text is None: # drug_atc = u'' # else: # drug_atc = drug_atc.text.strip() # create new drug product new_drug = gmMedication.create_drug_product(product_name = drug_name, preparation = drug_form, return_existing = True) self.__imported_drugs.append(new_drug) new_drug['is_fake_product'] = False # new_drug['atc'] = drug_atc new_drug['external_code_type'] = 'FreeDiams::%s::%s' % (drug_db, drug_uid_name) new_drug['external_code'] = drug_uid new_drug['pk_data_source'] = pk_data_source new_drug.save() # parse XML for composition records fd_xml_components = fd_xml_prescription.getiterator('Composition') comp_data = {} for fd_xml_comp in fd_xml_components: data = {} xml_strength = fd_xml_comp.attrib['strength'].strip() amount = regex.match(r'^\d+[.,]{0,1}\d*', xml_strength) if amount is None: amount = 99999 else: amount = amount.group() data['amount'] = amount #unit = regex.sub(r'\d+[.,]{0,1}\d*', u'', xml_strength).strip() unit = (xml_strength[len(amount):]).strip() if unit == '': unit = '*?*' data['unit'] = unit # hopefully, FreeDiams gets their act together, eventually: atc = regex.match(r'[A-Za-z]\d\d[A-Za-z]{2}\d\d', fd_xml_comp.attrib['atc'].strip()) if atc is None: data['atc'] = None else: atc = atc.group() data['atc'] = atc molecule_name = fd_xml_comp.attrib['molecularName'].strip() if molecule_name != '': gmMedication.create_substance_dose(substance = molecule_name, atc = atc, amount = amount, unit = unit) data['molecule_name'] = molecule_name inn_name = fd_xml_comp.attrib['inn'].strip() if inn_name != '': gmMedication.create_substance_dose(substance = inn_name, atc = atc, amount = amount, unit = unit) #data['inn_name'] = molecule_name data['inn_name'] = inn_name if molecule_name == '': data['substance'] = inn_name _log.info('linking INN [%s] rather than molecularName as component', inn_name) else: data['substance'] = molecule_name data['nature'] = fd_xml_comp.attrib['nature'].strip() data['nature_ID'] = fd_xml_comp.attrib['natureLink'].strip() # merge composition records of SA/FT nature try: old_data = comp_data[data['nature_ID']] # normalize INN if old_data['inn_name'] == '': old_data['inn_name'] = data['inn_name'] if data['inn_name'] == '': data['inn_name'] = old_data['inn_name'] # normalize molecule if old_data['molecule_name'] == '': old_data['molecule_name'] = data['molecule_name'] if data['molecule_name'] == '': data['molecule_name'] = old_data['molecule_name'] # normalize ATC if old_data['atc'] == '': old_data['atc'] = data['atc'] if data['atc'] == '': data['atc'] = old_data['atc'] # FT: transformed form # SA: active substance # it would be preferable to use the SA record because that's what's *actually* # contained in the drug, however FreeDiams does not list the amount thereof # (rather that of the INN) # FT and SA records of the same component carry the same nature_ID if data['nature'] == 'FT': comp_data[data['nature_ID']] = data else: comp_data[data['nature_ID']] = old_data # or create new record except KeyError: comp_data[data['nature_ID']] = data # actually create components from (possibly merged) composition records for key, data in comp_data.items(): new_drug.add_component ( substance = data['substance'], atc = data['atc'], amount = data['amount'], unit = data['unit'] )
def __import_fd2gm_file_as_drugs_0_5(self, fd2gm_xml=None, pk_data_source=None): db_def = fd2gm_xml.find('DrugsDatabaseName') db_id = db_def.text.strip() drug_id_name = db_def.attrib['drugUidName'] fd_xml_drug_entries = fd2gm_xml.findall('FullPrescription/Prescription') self.__imported_drugs = [] for fd_xml_drug in fd_xml_drug_entries: drug_uid = fd_xml_drug.find('Drug_UID').text.strip() if drug_uid == '-1': _log.debug('skipping textual drug') continue # it's a TextualDrug, skip it drug_name = fd_xml_drug.find('DrugName').text.replace(', )', ')').strip() drug_form = fd_xml_drug.find('DrugForm').text.strip() drug_atc = fd_xml_drug.find('DrugATC') if drug_atc is None: drug_atc = '' else: if drug_atc.text is None: drug_atc = '' else: drug_atc = drug_atc.text.strip() # create new drug product new_drug = gmMedication.create_drug_product(product_name = drug_name, preparation = drug_form, return_existing = True) self.__imported_drugs.append(new_drug) new_drug['is_fake_product'] = False new_drug['atc'] = drug_atc new_drug['external_code_type'] = 'FreeDiams::%s::%s' % (db_id, drug_id_name) new_drug['external_code'] = drug_uid new_drug['pk_data_source'] = pk_data_source new_drug.save() # parse XML for composition records fd_xml_components = fd_xml_drug.getiterator('Composition') comp_data = {} for fd_xml_comp in fd_xml_components: data = {} amount = regex.match(r'\d+[.,]{0,1}\d*', fd_xml_comp.attrib['strenght'].strip()) # sic, typo if amount is None: amount = 99999 else: amount = amount.group() data['amount'] = amount unit = regex.sub(r'\d+[.,]{0,1}\d*', '', fd_xml_comp.attrib['strenght'].strip()).strip() # sic, typo if unit == '': unit = '*?*' data['unit'] = unit molecule_name = fd_xml_comp.attrib['molecularName'].strip() if molecule_name != '': gmMedication.create_substance_dose(substance = molecule_name, atc = None, amount = amount, unit = unit) data['molecule_name'] = molecule_name inn_name = fd_xml_comp.attrib['inn'].strip() if inn_name != '': gmMedication.create_substance_dose(substance = inn_name, atc = None, amount = amount, unit = unit) data['inn_name'] = molecule_name if molecule_name == '': data['substance'] = inn_name _log.info('linking INN [%s] rather than molecularName as component', inn_name) else: data['substance'] = molecule_name data['nature'] = fd_xml_comp.attrib['nature'].strip() data['nature_ID'] = fd_xml_comp.attrib['natureLink'].strip() # merge composition records of SA/FT nature try: old_data = comp_data[data['nature_ID']] # normalize INN if old_data['inn_name'] == '': old_data['inn_name'] = data['inn_name'] if data['inn_name'] == '': data['inn_name'] = old_data['inn_name'] # normalize molecule if old_data['molecule_name'] == '': old_data['molecule_name'] = data['molecule_name'] if data['molecule_name'] == '': data['molecule_name'] = old_data['molecule_name'] # FT: transformed form # SA: active substance # it would be preferable to use the SA record because that's what's *actually* # contained in the drug, however FreeDiams does not list the amount thereof # (rather that of the INN) if data['nature'] == 'FT': comp_data[data['nature_ID']] = data else: comp_data[data['nature_ID']] = old_data # or create new record except KeyError: comp_data[data['nature_ID']] = data # actually create components from (possibly merged) composition records for key, data in comp_data.items(): new_drug.add_component ( substance = data['substance'], amount = data['amount'], unit = data['unit'] )