2024-04-02 14:11:37 +05:30
import json
2024-06-13 13:33:27 -05:00
import security
2024-03-27 18:59:29 +05:30
import streamlit as st
from streamlit_extras . add_vertical_space import add_vertical_space
import os
import streamlit as st
import pandas as pd
from io import StringIO
from datetime import datetime
import boto3
import util
import requests
2024-03-28 17:59:41 +05:30
from sf_conn import get_secret , save_to_sf
2024-04-02 14:11:37 +05:30
from io import StringIO , BytesIO
2024-04-04 17:03:00 -05:00
from sf_conn import get_client_names , insert_upload_logs
2024-05-24 07:01:29 -05:00
from constants import USER_LIST
2024-03-27 18:59:29 +05:30
2024-04-02 14:11:37 +05:30
create_batch_url = ' https://lfksus2t62.execute-api.us-east-2.amazonaws.com/dev/create-batch '
2024-03-27 18:59:29 +05:30
2024-05-22 16:05:54 -05:00
REDIRECT_URI = ' https://doczydev.aarete.com:8500 '
2024-05-23 10:20:49 -05:00
user_list = USER_LIST
2024-06-04 10:28:15 -05:00
if ' uploading ' not in st . session_state :
st . session_state . uploading = False
def insert_upload_logs ( batch_id , client_name , file_name , upload_datetime , upload_user ) :
"""
Input: batch_id, client_name, file_name, upload_datetime, upload_user
Output: status of the insert query
"""
try :
return ' Log inserted successfully '
except Exception as e :
return e
2024-03-27 18:59:29 +05:30
st . set_page_config ( layout = " wide " )
# # Sidebar contents
# with st.sidebar:
# st.title("Doczy.AI ™")
# st.markdown(
# """
# ## About
# This app extracts data from contracts
# """
# )
# add_vertical_space(15)
# # st.write("Doczy")
2024-06-04 10:28:15 -05:00
#
2024-03-27 18:59:29 +05:30
2024-06-12 17:11:25 -05:00
# AARETE LOGO
x , y , z = st . columns ( [ 15 , 2 , 15 ] )
with y :
st . image ( ' aaretelogo.png ' )
hide_img_fs = '''
<style>
button[title= " View fullscreen " ] {
visibility: hidden;}
</style>
'''
st . markdown ( hide_img_fs , unsafe_allow_html = True )
2024-04-02 14:11:37 +05:30
_ , c1 = st . columns ( [ 5 , 1 ] )
2024-03-27 18:59:29 +05:30
try :
2024-04-02 14:11:37 +05:30
util . setup_page ( REDIRECT_URI )
2024-04-15 17:02:59 -05:00
except Exception as e :
st . write ( f " SSO Failed = { e } " )
2024-04-10 20:43:35 +05:30
st . session_state [ ' user_info ' ] = { ' mail ' : ' maamseek@aarete.com ' , ' displayName ' : ' Mayank Aamseek ' }
2024-04-05 12:15:54 +05:30
try :
c1 . write ( f " User: ** { st . session_state . user_info [ ' displayName ' ] } ** " )
user_mail = st . session_state . user_info [ ' mail ' ]
except KeyError as e :
st . write ( " Session Expired. " )
2024-06-13 13:33:27 -05:00
# st.write("Please sign-in to use this app.")
auth_url = security . get_auth_url ( REDIRECT_URI )
st . markdown ( f " <a href= ' { auth_url } ' target= ' _self ' >Sign In</a> " , unsafe_allow_html = True )
2024-04-09 14:06:14 +05:30
st . stop ( )
2024-03-27 18:59:29 +05:30
2024-06-04 10:28:15 -05:00
print ( st . session_state )
2024-05-28 17:32:36 -05:00
s3_client = boto3 . client ( ' s3 ' ,
region_name = " us-east-2 " ,
)
client_list = [ ' doczy-ai-client-1 ' , ' Delaware First Health, Inc. ' , ' Community Health Choice, Inc ' , ' CareSource Network Partners LLC ' ,
' HealthNet of Cali ' , ' Oklahoma Complete Health, Inc ' , ' HealthFirst ' , ' Molina Healthcare of TX ' , ' AvMed ' , ' Arizona Care1st ' ,
' WellCare New Jersey ' ]
# This is the list of client fetched from Snowflake
# TODO: Need to update the streamlit code to use the client names from this list
# And use the s3 paths to save the objects for the respective client
client_list , s3_paths = get_client_names ( )
client_s3_paths = dict ( zip ( client_list , s3_paths ) )
client_row = st . columns ( [ 0.1 , 0.8 ] )
with client_row [ 0 ] :
st . write ( " **Client Name** " )
with client_row [ 1 ] :
2024-06-04 10:28:15 -05:00
client = st . selectbox ( ' Client Name ' , ( client_list ) , label_visibility = " collapsed " , index = None ) # MODIFIED for Ticket DOC-344
2024-05-28 17:32:36 -05:00
client_bucket = client_s3_paths . get ( client )
# to be deleted when client buckets are created
client_bucket = ' doczy-ai-client-1 '
file_row = st . columns ( [ 0.1 , 0.8 ] )
with file_row [ 0 ] :
st . write ( " **Upload Files** " )
with file_row [ 1 ] :
2024-06-04 10:35:56 -05:00
file_list = st . file_uploader ( " Upload " , type = [ ' docx ' , ' tiff ' , ' pdf ' ] , accept_multiple_files = True , label_visibility = " collapsed " , help = " Only PDF, TIFF and DOCX file formats are supported. " , disabled = st . session_state . uploading )
2024-05-28 17:32:36 -05:00
add_vertical_space ( 2 )
df = pd . DataFrame ( columns = [ ' Contract Name ' ] )
df [ ' Contract Name ' ] = file_list
file_names = [ ]
buttons = st . columns ( [ 0.4 , 0.4 , 0.2 ] )
2024-06-04 10:28:15 -05:00
def set_uploading_state ( ) :
if not client == None and not len ( file_list ) == 0 :
st . session_state . uploading = True
2024-05-28 17:32:36 -05:00
with buttons [ 1 ] :
2024-06-10 08:31:40 -05:00
if st . button ( " Submit " , on_click = set_uploading_state ) :
2024-06-04 10:28:15 -05:00
if client == None :
st . error ( " No Client Name Selected. " )
elif len ( file_list ) == 0 :
st . error ( " No Files Selected. " )
2024-05-28 17:32:36 -05:00
else :
2024-06-04 10:28:15 -05:00
myobj = { " client-bucket-name " : client_bucket }
response = requests . post ( create_batch_url , json = myobj )
if response . status_code > = 200 and response . status_code < 300 :
try :
batch_id = json . loads ( json . loads ( response . text ) [ ' body ' ] ) [ ' batch_id ' ]
landing_zone = json . loads ( json . loads ( response . text ) [ ' body ' ] ) [ ' landing_zone ' ]
except :
st . write ( myobj )
st . write ( response . text )
batch_id = ' failed_cases '
landing_zone = ' contracts_landing_zone '
else :
st . write ( " Failed " )
for uploaded_file in file_list :
stringio = BytesIO ( uploaded_file . getvalue ( ) )
stringio . seek ( 0 )
s3_client . put_object ( Bucket = client_bucket , Body = stringio . getvalue ( ) , Key =
landing_zone + batch_id + ' / ' + str ( uploaded_file . name ) )
# TODO: Test this insert function with snowflake
upload_log = insert_upload_logs ( batch_id , client , str ( uploaded_file . name ) , datetime . now ( ) . strftime ( " % Y- % m- %d % H: % M: % S " ) , user_mail )
st . write ( upload_log )
file_names . append ( str ( uploaded_file . name ) )
st . session_state . uploading = False
st . write ( f " { batch_id } created " )
st . write ( f " Files uploaded to s3:// { client_bucket } / { landing_zone } { batch_id } " )
2024-03-28 17:53:00 +05:30
2024-03-27 18:59:29 +05:30
2024-06-03 16:25:37 -05:00
2024-03-28 17:53:00 +05:30
# @st.cache_data
# def convert_df(df):
# return df.to_csv(index=False).encode('utf-8')
2024-03-27 18:59:29 +05:30
2024-03-28 17:53:00 +05:30
# csv = convert_df(df)
# df = df.reset_index() # make sure indexes pair with number of rows
2024-03-27 18:59:29 +05:30
# contract_list = []
# for index, row in df.iterrows():
# group_list = []
# if row['Unique Key']:
# group_list.append('Unique Key')
# if row['Pricing Before Carveouts']:
# group_list.append('Pricing Before Carveouts')
# if row['Contract Related']:
# group_list.append('Contract Related')
# if row['Provider']:
# group_list.append('Provider')
# if row['Timeline']:
# group_list.append('Timeline')
# if row['Carveout Indicator']:
# group_list.append('Carveout Indicator')
# if row['Carveout Methodology']:
# group_list.append('Carveout Methodology')
# entry_dict = {
# "contract_name": row['Contract Name'],
# "groups": group_list,
# "contract_source_path": "batches/batch_1/"+client+"/"+row['Contract Name']
# }
# contract_list.append(entry_dict)
2024-03-28 17:53:00 +05:30
# contract_list = list(df['Contract Name'])
# myobj = {
# "s3_bucket": 'doczy-dev-infra-textract',
# "batch_id": "1",
# "client_name": client,
# "username": user_mail,
# "contract_list": contract_list
# }
# buttons = st.columns([0.8, 0.2])
# with buttons[0]:
# st.download_button("Download Table", csv, "file.csv", "text/csv", key='download-csv')
# with buttons[1]:
# if st.button("Upload to DB"):
# response = requests.post(doczy_pipeline, json = myobj)
# if response.status_code >= 200 and response.status_code < 300:
# st.write("Success")
# else:
# st.write("Failed")
# # st.write(response.text)