-
Notifications
You must be signed in to change notification settings - Fork 0
/
epa_frs_rest_api_submit_client.py
110 lines (96 loc) · 5.37 KB
/
epa_frs_rest_api_submit_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# frs_submit_client_file.py
# Richard Holowczak
# 2021-07-28
# Read a CSV file with factilities information and submit each
# record to EPA FRS.
#
# Based on sample client "submit" application generated by swagger.
# Documentation: https://frssubmitpre-api.epa.gov/facilityiptsubmit/swagger-ui/index.html
# swagger-client
# The FRS API exposes several RESTful web services for submitting FRS data.
# This web page is intended for a technical audience and describes the content and
# purpose of each API service available. These endpoints are NAAS secured
# http://www.exchangenetwork.net/network-authentication-authorization-services-naas/.
# Refer to https://www.epa.gov/frs/facility-ipt-web-services-naas-account-information
# for more information.
# Requirements:
# a) Download and install the swagger client REST API code
# b) Obtain a NAAS username and password from [email protected]
# In the request indicate the provisioning option to receive from and/or
# submit data to the FRS the partner system.
# c) Save the NAAS user id and password in a file named credentials.py
# user_id = 'Your username here'
# password = 'Your password here'
# d) Select the appropriate pre-production (testing) or Production server URL
# Pre-production:
# Query: https://frsquerypre-api.epa.gov/facilityiptquery/swagger-ui/index.html
# Submit: https://frssubmitpre-api.epa.gov/facilityiptsubmit/swagger-ui/index.html
# Production:
# Query: https://frsqueryprd-api.epa.gov/facilityiptqueryprd/swagger-ui/index.html
# Submit: https://frssubmitprd-api.epa.gov/facilityiptsubmitprd/swagger-ui/index.html
# Make sure the NAAS account has permissions to use the appropriate server and service.
# e) Prepare a data file in CSV format with the necessary fields such as
# facilitySourceSystemProgramCode, programSystemAcronym, userId, isPOTWFlag, programSystemId,
# locationDescription, primaryName, Eligibility, locationAddress, cityName, postalCode, countyName,
# countyFIPSCode, stateName, stateCode, countryName, legislativeDistrictNumber, operatingStatusYear,
# operatingStatusDate, huccode8, huccode12, isSensitiveFlag, isPublicFlag, facilityOwnerType,
# facilityManagementTypeCode, envJusticeCode, countryISO31661Alpha2, airLocationDescription,
# isSmallBusinessFlag, siteTypeName, agencyId, isFederalFacilityFlag, lastReportedDate, endDate, startDate
# isPortableSourceFlag, operatingStatus, supplementalLocation
# Not all fields are required.
# Import some helper modules
from __future__ import print_function
from pprint import pprint
import time
# Import the swagger client
import swagger_client
from swagger_client.rest import ApiException
from swagger_client.configuration import Configuration
# Import Pandas and json to help with formatting the data in the CSV file
import pandas as pd
import json
# Assume the username and password are saved in file credentials.py
# user_id = 'Your NAAS username'
# password = 'Your account password'
import credentials
# Set the 'host' which is actually the URI to the API endpoint.
query_host="https://frsquerypre-api.epa.gov/facilityiptquery/v1/FRS"
submit_host="https://frssubmitpre-api.epa.gov/facilityiptsubmit/v1/FRS"
# Create a Configuration object
configuration = Configuration()
# Set the host attribute for the connection for the appropriate host
configuration.host = submit_host
# Source data file name
source_data_file_name='meri_fis_facilities_data_202202.csv'
# Read the source data file into a Python dataframe. Force all columns to be strings.
facilities_data_df = pd.read_csv(source_data_file_name, sep=',', header=0, dtype=str)
# Convert the zip codes to strings if necessary. Pad with leading zero in case it was removed
facilities_data_df['postalCode'] = facilities_data_df['postalCode'].apply(lambda x: '0' + str(x) if int(x) < 10000 else str(x))
facilities_data_df['huccode8'] = facilities_data_df['huccode8'].apply(lambda x: '0' + str(x) if int(x) < 10000000 else str(x))
facilities_data_df['huccode12'] = facilities_data_df['huccode12'].apply(lambda x: '0' + str(x) if int(x) < 100000000000 else str(x))
# Create an instance of the FRS API class
api_instance = swagger_client.FRSApi(swagger_client.ApiClient(configuration))
program_system_acronym = 'FRS' # 'program_system_acronym_example' # str |
program_system_id = '1' # 'program_system_id_example' # str |
submit_facility = 'MERI-FIS'
# Iterate through the facilities_data_df dataframe one record at a time
# Convert one record at a time to a JSON document
# Load the JSON document into EPA FRS
counter = 1
for i in facilities_data_df.index:
#if counter == 3:
# break
counter = counter + 1
document_str = facilities_data_df.iloc[i].to_json()
document_str = document_str.replace("null", "\"\" ")
document = json.loads(document_str)
print(counter, " Working on:", document, flush=True)
try:
# This service is used to submit registry data to FRS.
# def submit_facility_post(self, user_id, password, submit_text, **kwargs):
api_response = api_instance.submit_facility_post(credentials.user_id, credentials.password, document)
pprint(api_response)
except ApiException as e:
print("Exception when calling FRSApi->submit_facility_post: %s\n" % e)
print("On document:", document)