Source code for tangier_api.api.provider

import zeep
import requests
import xmlmanip

from tangier_api import settings
from tangier_api import exceptions


[docs]class ProviderConnection: def __init__(self, xml_string="", endpoint=settings.PROVIDER_ENDPOINT): """ Injects credentials into <tanger/> root schema and :param xml_string: override the base xml, which is just <tangier method="schedule.request"/> :param endpoint: where the WSDL info is with routing info and SOAP API definitions """ if not xml_string: self.base_xml = """<tangier version="1.0" method="provider.request"></tangier>""" else: self.base_xml = xml_string self.base_xml = xmlmanip.inject_tags(self.base_xml, admin_user=settings.TANGIER_USERNAME, admin_pwd=settings.TANGIER_PASSWORD) self.client = zeep.Client(endpoint, transport=zeep.transports.Transport(session=requests.Session()))
[docs] def MaintainProviders(self, xml_string=""): return self.client.service.MaintainProviders(xml_string)
[docs] def get_provider_info(self, provider_ids=None, use_primary_keys=True, all_providers=True, xml_string="", **tags): """ Method to retrieve info on all providers corresponding to the list "provider_ids" :param provider_ids: (list) of all emp_ids corresponding to desired provider info :param use_primary_keys: (bool) indicates whether provider_ids should be treated as emp_id or provider_primary_key :param all_providers: (bool) indicates whether to return data on all existing providers :param xml_string: (xml string) overrides default xml string provided by the instantiation of the class object :param tags: (kwargs) things to be injected into the request. ex: start_date="2017-05-01", end_date="2017-05-02" :return: """ if not provider_ids and not all_providers: raise exceptions.APICallError("You must provide either a list of provider_ids or set all_providers=True.") elif not isinstance(provider_ids, list): provider_ids = [provider_ids] xml_string = xml_string if xml_string else self.base_xml xml_string = xmlmanip.inject_tags(xml_string, injection_index=2, providers="") provider_dict = {} id_label = "provider_primary_key" if use_primary_keys else "emp_id" if not all_providers: for i, provider_id in enumerate(provider_ids): provider_dict[f'provider__{i}'] = {"action": "info", "__inner_tag": {id_label: f"{provider_id}"}} else: provider_dict[f'provider'] = {"action": "info", "__inner_tag": {id_label: "ALL"}} xml_string = xmlmanip.inject_tags(xml_string, parent_tag="providers", **provider_dict) # return xml_string return self.MaintainProviders(xml_string).encode('utf-8')
[docs] def provider_info_values_list(self, use_primary_keys=True, **kwargs): """ Wrapper for get_provider info which converts the xml response into a list of dicts """ xml_string = self.get_provider_info(**kwargs) schema = xmlmanip.XMLSchema(xml_string) if kwargs.get('all_providers'): id_label = 'provider_primary_key' else: id_label = "provider_primary_key" if use_primary_keys else "emp_id" # using contains method here is kind of hacky way to get every element with an {id_label} tag, basically I'm # just checking to see that the label even exists label_dict = {f"{id_label}__contains": ""} provider_list = schema.search(**label_dict) return provider_list