Talha9299/Rasa_chatBot
0
1from datetime import datetime, timedelta2from selenium import webdriver3from selenium.webdriver.chrome.options import Options4from selenium.webdriver.common.by import By5import time6from bs4 import BeautifulSoup7from selenium.webdriver.support.select import Select8import easygui9import re10import sys11from selenium.webdriver.chrome.service import Service12 13 14class ReadingsExtraction:15 def __init__(self, webdriver_path, date_1):16 self.webdriver_path = webdriver_path17 self.date_1 = date_118 self.options = Options()19 # self.options.add_argument("--headless")20 self.driver_service = Service(self.webdriver_path)21 self.driver = webdriver.Chrome(service=self.driver_service, options=self.options)22 23 readings_data = []24 not_readings_data = []25 final_name = ""26 systolic_average = ""27 diastolic_average = ""28 pulse_average = ""29 total_time = ""30 sorted_data = ""31 32 def start_request(self, url):33 print("Blood-Pressure-Charting")34 # dispatcher.utter_message(text="Blood-Pressure-Charting")35 self.driver.get(url)36 self.login()37 38 def login(self):39 40 print("Patient ID from User prompt:", "1006777")41 username = self.driver.find_element(By.NAME, "username")42 username.send_keys("sheherbano.azz@gmail.com")43 password = self.driver.find_element(By.NAME, "password")44 password.send_keys("Azzmedassistb1!#")45 button = self.driver.find_element(By.ID, "login-btn")46 button.click()47 time.sleep(5)48 self.after_login("1006777")49 50 def after_login(self, patient_id_scp):51 # for patient_id in patient_ids:52 # url = f"https://portal.smartmeterrpm.com/patient/weights-vitals/edit/{patient_id_scp}"53 url = f"https://portal.smartmeterrpm.com/patient/weights-vitals/edit/1006777"54 55 self.driver.get(url)56 time.sleep(5)57 select_element = self.driver.find_element(By.ID, "reading_type")58 option_elements = select_element.find_element(By.TAG_NAME, "option")59 60 flag = option_elements.get_attribute("label")61 print("Value of the first option:", flag)62 63 if flag == "Blood Glucose - Time Period" or flag == "Blood Glucose":64 65 time.sleep(5)66 self.extract_reading_for_blood_glucose()67 average = str(self.get_average_for_blood_glucose())68 69 total_time = 60 - len(self.readings_data)70 if len(self.readings_data) <= 5:71 total_time = 3072 for item in self.not_readings_data:73 item["Date"] = item["Date"].replace("(2 min)", "(1 min)")74 75 total_list = self.readings_data + self.not_readings_data76 sorted_data = sorted(total_list, key=lambda x: x['Date'])77 78 if total_list:79 print("Charting Created Successfully!")80 81 if len(self.readings_data) >= 10 and len(self.readings_data) < 16:82 message = "Please Ask your patient to take readings regularly!"83 print(message)84 85 print(f"Total Readings: {len(self.readings_data)}")86 print(f"Average Reading: {average}")87 print(f"Documentation Time: {total_time} minutes\n")88 89 for item in sorted_data:90 print(f"{item['Date']}")91 if item['Glucose_Reading'] == "No Reading Checked twice":92 print(f"{item['Glucose_Reading']}")93 else:94 print(f"{item['Glucose_Reading']}mg/dL")95 96 elif flag == "Blood Pressure":97 98 time.sleep(5)99 self.extract_reading_for_blood_pressure()100 101 systolic_average = self.get_average_systolic_for_blood_pressure()102 diastolic_average = self.get_average_diastolic_for_blood_pressure()103 pulse_average = self.get_average_pulse_for_blood_pressure()104 105 total_time = 60 - len(self.readings_data)106 # print(f"total_time : {total_time}")107 108 if len(self.readings_data) <= 5:109 total_time = 30110 for item in self.not_readings_data:111 item["Date"] = item["Date"].replace("(2 min)", "(1 min)")112 113 total_list = self.readings_data + self.not_readings_data114 # sorted_data = sorted(total_list, key=lambda x: x['Date'])115 116 sorted_data = sorted(total_list, key=lambda x: datetime.strptime(x["Date"], '%m/%d/%Y (%M min)'))117 # print(f"sorted_data : {sorted_data}")118 119 final_name = self.final_name120 121 print(f"Total Readings: {len(self.readings_data)}")122 print(f"Average systolic: {systolic_average}")123 print(f"Average diastolic: {diastolic_average}")124 print(f"Average pulse: {pulse_average}")125 print(f"Documentation Time: {total_time} minutes\n")126 127 for item in sorted_data:128 print(f"{item['Date']}")129 if item['bp'] == "No Reading Checked twice":130 print(f"{item['bp']}")131 else:132 print(f"{item['bp']} mmHg")133 if 'pulse' in item:134 print(f"{item['pulse']} bpm")135 136 if total_list:137 # self.write_to_file(sorted_data, systolic_average, diastolic_average, pulse_average, final_name,138 # total_time)139 print(f"Charting Created Successfully of patient **{final_name}**")140 # dispatcher.utter_message(text=f"Charting Created Successfully of patient **{final_name}**")141 142 self.readings_data = []143 self.not_readings_data = []144 self.final_name = ""145 time.sleep(5)146 147 elif flag == "Weight":148 time.sleep(5)149 self.extract_reading_for_weight()150 average = str(self.get_average_for_weight())151 152 total_time = 60 - len(self.readings_data)153 if len(self.readings_data) <= 5:154 total_time = 30155 for item in self.not_readings_data:156 item["Date"] = item["Date"].replace("(2 min)", "(1 min)")157 158 total_list = self.readings_data + self.not_readings_data159 sorted_data = sorted(total_list, key=lambda x: x['Date'])160 161 if total_list:162 print("Charting Created Successfully!")163 164 if len(self.readings_data) >= 10 and len(self.readings_data) < 16:165 message = "Please Ask your patient to take readings regularly!"166 print(message)167 168 print(f"Total Readings: {len(self.readings_data)}")169 print(f"Average Reading: {average}")170 print(f"Documentation Time: {total_time}\n minutes")171 172 for item in sorted_data:173 print(f"{item['Date']}")174 if item['Weight_(lbs)'] == "No Reading Checked twice":175 print(f"{item['Weight_(lbs)']}")176 else:177 print(f"{item['Weight_(lbs)']}lbs")178 179 def get_average_for_weight(self):180 if len(self.readings_data) == 0:181 return 0182 sum = 0183 for i in self.readings_data:184 sum += float(i["Weight_(lbs)"])185 average_reading = sum // len(self.readings_data)186 avg = str(average_reading) + "lbs"187 return avg188 189 def get_dates_for_weight(self):190 current_date = self.date_1191 date_format = "%Y-%m-%d"192 start_date = datetime.strptime(current_date, date_format)193 last_date = start_date + timedelta(days=30)194 195 dates = []196 while start_date < last_date:197 formatted_date = start_date.strftime("%m/%d/%Y")198 dates.append(formatted_date)199 start_date += timedelta(days=1)200 201 return dates, current_date, last_date.strftime("%Y-%m-%d")202 203 def extract_reading_for_weight(self):204 dates, start_date, end_date = self.get_dates_for_weight()205 try:206 select = Select(self.driver.find_element(By.NAME, "select-graph"))207 select.select_by_value("weight")208 button = self.driver.find_element(By.ID, "search")209 button.click()210 time.sleep(5)211 self.driver.implicitly_wait(20)212 start_date_field = self.driver.find_element(By.ID, "start-date")213 end_date_field = self.driver.find_element(By.ID, "end-date")214 215 start_date_field.click()216 start_date_field.clear()217 start_date_field.send_keys(start_date)218 end_date_field.click()219 end_date_field.clear()220 end_date_field.send_keys(end_date)221 222 button.click()223 time.sleep(5)224 225 soup = BeautifulSoup(self.driver.page_source, "html.parser")226 for date in dates:227 date_column = soup.find("td", string=date)228 if date_column:229 weight_reading = self.driver.find_element(By.XPATH,230 f'//tr[contains(., "{date}")]//following-sibling::tr/td[@class="text-center"]').text231 patient_reading = {232 "Date": date + " " + "(1 min)",233 "Weight_(lbs)": weight_reading234 }235 self.readings_data.append(patient_reading)236 else:237 patient_reading = {238 "Date": date + " " + "(2 min)",239 "Weight_(lbs)": "No Reading Checked twice"240 }241 self.not_readings_data.append(patient_reading)242 except Exception:243 message = "Exception"244 title = "Please check your connection and try again."245 easygui.msgbox(message, title)246 247 ##################################248 def get_average_for_blood_glucose(self):249 if len(self.readings_data) == 0:250 return 0251 sum = 0252 for i in self.readings_data:253 sum += int(i["Glucose_Reading"])254 average_reading = sum // len(self.readings_data)255 avg = str(average_reading) + " " + "mg/dl"256 return avg257 258 def get_dates_for_blood_glucose(self):259 current_date = self.date_1260 date_format = "%Y-%m-%d"261 start_date = datetime.strptime(current_date, date_format)262 last_date = start_date + timedelta(days=30)263 264 dates = []265 while start_date < last_date:266 formatted_date = start_date.strftime("%m/%d/%Y")267 dates.append(formatted_date)268 start_date += timedelta(days=1)269 270 return dates, current_date, last_date.strftime("%Y-%m-%d")271 272 def extract_reading_for_blood_glucose(self):273 dates, start_date, end_date = self.get_dates_for_blood_glucose()274 try:275 select = Select(self.driver.find_element(By.NAME, "select-graph"))276 select.select_by_value("blood_glucose")277 button = self.driver.find_element(By.ID, "search")278 button.click()279 time.sleep(5)280 self.driver.implicitly_wait(20)281 start_date_field = self.driver.find_element(By.ID, "start-date")282 end_date_field = self.driver.find_element(By.ID, "end-date")283 284 start_date_field.click()285 start_date_field.clear()286 start_date_field.send_keys(start_date)287 288 end_date_field.click()289 end_date_field.clear()290 end_date_field.send_keys(end_date)291 292 button.click()293 time.sleep(5)294 295 soup = BeautifulSoup(self.driver.page_source, "html.parser")296 for date in dates:297 date_column = soup.find("td", string=date)298 if date_column:299 glucose_reading = self.driver.find_element(By.XPATH,300 f'//tr[contains(., "{date}")]//following-sibling::tr/td[@class="text-center"]').text301 patient_reading = {302 "Date": date + " " + "(1 min)",303 "Glucose_Reading": glucose_reading304 }305 self.readings_data.append(patient_reading)306 else:307 patient_reading = {308 "Date": date + " " + "(2 min)",309 "Glucose_Reading": "No Reading Checked twice"310 }311 self.not_readings_data.append(patient_reading)312 except Exception:313 message = "Exception"314 title = "Please check your connection and try again."315 easygui.msgbox(message, title)316 317 ##################################318 319 def get_average_systolic_for_blood_pressure(self):320 if len(self.readings_data) == 0:321 return 0322 sum = 0323 for i in self.readings_data:324 sum += int(i["systolic"])325 average_reading = sum // len(self.readings_data)326 avg = str(average_reading) + " " + "mmHg"327 return avg328 329 def get_average_diastolic_for_blood_pressure(self):330 if len(self.readings_data) == 0:331 return 0332 sum = 0333 for i in self.readings_data:334 sum += int(i["diastolic"])335 average_reading = sum // len(self.readings_data)336 avg = str(average_reading) + " " + "mmHg"337 return avg338 339 def get_average_pulse_for_blood_pressure(self):340 if len(self.readings_data) == 0:341 return 0342 sum = 0343 for i in self.readings_data:344 sum += int(i["pulse"])345 average_reading = sum // len(self.readings_data)346 avg = str(average_reading) + " " + "bpm"347 return avg348 349 def get_dates_for_blood_pressure(self):350 current_date = self.date_1351 print(current_date)352 date_format = "%Y-%m-%d"353 start_date = datetime.strptime(current_date, date_format)354 last_date = start_date + timedelta(days=30)355 356 dates = []357 while start_date < last_date:358 formatted_date = start_date.strftime("%m/%d/%Y")359 dates.append(formatted_date)360 start_date += timedelta(days=1)361 362 return dates, current_date, last_date.strftime("%Y-%m-%d")363 364 def extract_reading_for_blood_pressure(self):365 dates, start_date, end_date = self.get_dates_for_blood_pressure()366 try:367 368 select = Select(self.driver.find_element(By.NAME, "select-graph"))369 370 select.select_by_value("blood_pressure")371 button = self.driver.find_element(By.ID, "search")372 button.click()373 time.sleep(5)374 self.driver.implicitly_wait(20)375 start_date_field = self.driver.find_element(By.ID, "start-date")376 end_date_field = self.driver.find_element(By.ID, "end-date")377 378 start_date_field.click()379 start_date_field.clear()380 start_date_field.send_keys(start_date)381 382 end_date_field.click()383 end_date_field.clear()384 end_date_field.send_keys(end_date)385 386 button.click()387 time.sleep(5)388 389 soup = BeautifulSoup(self.driver.page_source, "html.parser")390 391 name = soup.find('h1', class_='h2 mb-4 text-gray-800 text-center')392 393 self.final_name = name.text.strip()394 395 for date in dates:396 date_column = soup.find("td", string=date)397 # print(f"date Column {date_column}")398 if date_column:399 reading = self.driver.find_elements(By.XPATH,400 f'//tr[contains(., "{date}")]//following-sibling::tr/td[@class="text-center"]')401 if len(reading) >= 2:402 systolic = reading[0].text403 diastolic = reading[1].text404 pulse = reading[2].text405 bp_reading = f"{systolic}/{diastolic}"406 patient_reading = {407 "Date": date + " " + "(1 min)",408 "bp": bp_reading,409 "systolic": systolic,410 "diastolic": diastolic,411 "pulse": pulse412 }413 self.readings_data.append(patient_reading)414 else:415 patient_reading = {416 "Date": date + " " + "(2 min)",417 "bp": "No Reading Checked twice",418 }419 self.not_readings_data.append(patient_reading)420 except Exception:421 message = "Exception"422 title = "Please check your connection and try again."423 easygui.msgbox(message, title)424 425 426driver_path = "chromedriver.exe"427# date_1 = get_valid_date()428# x = ReadingsExtraction(driver_path, date_1)429x = ReadingsExtraction(driver_path, "2023-12-07")430x.start_request("https://portal.smartmeterrpm.com/login")431 