CoolFace
Apppublic

Talha9299/Rasa_chatBot

sourceHugging Facemitupdated 3y agoView on Hugging Face
0likes
main.py431 linesDownload Raw Back to root
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