def get_data(self, **params): """ Get data from the Elexon servers and attempt to parse it into a series of dicts each representing a record. Parameters are passed as a dict. Multiple sets of data are created in the multi member, single sets in items. """ if self.report is None: raise Exception( "ElexonAPI objects require the report be set before use.") if self.apikey is None: raise Exception( "An API key is required to use the Elexon API accessor functionality" ) url = make_elexon_url(self.report, self.version) params.update({'APIKey': self.apikey, 'ServiceType': 'xml'}) req = get_or_post_a_url(url, params=params) # print(req.content) xml = parse_response_as_xml(req) http = xml.xpath('/response/responseMetadata/httpCode') response_code = int(http[0].text) if response_code == 204: print("No content returned, but no error reported.") return True elif response_code != 200: print("No data returned. Error reported.") err = xml.xpath('/response/responseMetadata/description') print(err[0].text) return False if self.MULTI_RESULTS is None: for item in xml.xpath('/response/responseBody/responseList/item'): item_dict = map_xml_to_dict(item, self.XML_MAPPING) if 'activeflag' in item_dict: item_dict['activeflag'] = item_dict['activeflag'] == 'Y' if 'settlementperiod' in item_dict: item_dict['settlementperiod'] = int( item_dict['settlementperiod']) self.post_item_cleanup(item_dict) self.items.append(item_dict) else: for result_set in self.MULTI_RESULTS: self.multi[result_set[0]] = [] for item in xml.xpath(result_set[1]): item_dict = map_xml_to_dict(item, self.XML_MAPPING) if 'activeFlags' in item_dict: item_dict['activeflag'] = item_dict[ 'activeflag'] == 'Y' if 'settlementperiod' in item_dict: item_dict['settlementperiod'] = int( item_dict['settlementperiod']) self.post_item_cleanup(item_dict) # print(item_dict) self.multi[result_set[0]].append(item_dict) return True
def get_data(self, **params): """ Get data from the Elexon servers and attempt to parse it into a series of dicts each representing a record. Parameters are passed as a dict. Multiple sets of data are created in the multi member, single sets in items. """ if self.report is None: raise Exception("ElexonAPI objects require the report be set before use.") if self.apikey is None: raise Exception("An API key is required to use the Elexon API accessor functionality") url = make_elexon_url(self.report, self.version) params.update({'APIKey': self.apikey, 'ServiceType': 'xml'}) req = get_or_post_a_url(url, params=params) # print(req.content) xml = parse_response_as_xml(req) http = xml.xpath('/response/responseMetadata/httpCode') response_code = int(http[0].text) if response_code == 204: print("No content returned, but no error reported.") return True elif response_code != 200: print("No data returned. Error reported.") err = xml.xpath('/response/responseMetadata/description') print(err[0].text) return False if self.MULTI_RESULTS is None: for item in xml.xpath('/response/responseBody/responseList/item'): item_dict = map_xml_to_dict(item, self.XML_MAPPING) if 'activeflag' in item_dict: item_dict['activeflag'] = item_dict['activeflag'] == 'Y' if 'settlementperiod' in item_dict: item_dict['settlementperiod'] = int(item_dict['settlementperiod']) self.post_item_cleanup(item_dict) self.items.append(item_dict) else: for result_set in self.MULTI_RESULTS: self.multi[result_set[0]] = [] for item in xml.xpath(result_set[1]): item_dict = map_xml_to_dict(item, self.XML_MAPPING) if 'activeFlags' in item_dict: item_dict['activeflag'] = item_dict['activeflag'] == 'Y' if 'settlementperiod' in item_dict: item_dict['settlementperiod'] = int(item_dict['settlementperiod']) self.post_item_cleanup(item_dict) # print(item_dict) self.multi[result_set[0]].append(item_dict) return True
def __init__(self, node): """ Extract information from the supplied XML node. The factor figure is MWh per certificate. """ if self.XML_MAPPING is None: raise NotImplementedError("Child classes should define their XML_MAPPING") self.attrs = map_xml_to_dict(node, self.XML_MAPPING)
def __init__(self, node): """ Extract information from the supplied XML node. The factor figure is MWh per certificate. """ if self.XML_MAPPING is None: raise NotImplementedError( "Child classes should define their XML_MAPPING") self.attrs = map_xml_to_dict(node, self.XML_MAPPING)
def test_map_xml_to_dict(self): """ Test mapping from XML to dict using a mapping tuple. """ NSMAP = {'a': 'CertificatesExternalPublicDataWarehouse'} with open(os.path.join(self.HERE, 'files', 'certificate_test.xml'), 'r') as xfh: xml = etree.parse(xfh) for detail in xml.getroot().xpath('.//a:Detail', namespaces=NSMAP): rv_dict = map_xml_to_dict(detail, Certificates.XML_MAPPING) self.assertIsInstance(rv_dict, dict) self.assertEqual(len(rv_dict), 17) self.assertIsInstance(rv_dict['factor'], float) self.assertIsInstance(rv_dict['issue_dt'], datetime.date) self.assertTrue('name' in rv_dict) self.assertNotEqual(len(rv_dict['name']), 0) self.assertGreater(rv_dict['capacity'], 0) self.assertGreater(len(rv_dict['scheme']), 0)