#!/usr/bin/env python3 import os import datetime import pandas as pd import pdfkit # internal candela references included during intial phases, to be deleted at future date # https://candelatech.atlassian.net/wiki/spaces/LANFORGE/pages/372703360/Scripting+Data+Collection+March+2021 # base report class class lf_report(): def __init__(self, _path = "/home/user/git/lanforge-scripts/py-scripts/report-data", _output_format = 'html', # pass in on the write functionality _dataframe="", _title="LANForge Test Run Heading", _table_title="LANForge Table Heading", _graph_title="LANForge Graph Title", _obj = "", _obj_title = "", _date="1/1/2-21 00:00(UTC)", _output_html="outfile.html", _output_pdf="outfile.pdf", _path_date_time=""): #other report paths, "/home/lanforge/html-reports/ if _path == "local" or _path == "here" or _path == None: self.path = os.path.abspath(__file__) print("path set to file path: {}".format(self.path)) else: self.path = _path print("path set: {}".format(self.path)) self.dataframe=_dataframe self.title=_title self.table_title=_table_title self.graph_title=_graph_title self.date=_date self.output_html=_output_html self.path_date_time = _path_date_time self.write_output_html = "" self.output_pdf=_output_pdf self.write_output_pdf = "" self.banner_html = "" self.graph_titles="" self.graph_image="" self.html = "" self.custom_html = "" self.objective = _obj self.obj_title = _obj_title #self.systeminfopath = "" self.date_time_directory = "" self.banner_directory = "artifacts" self.banner_file_name = "banner.png" # does this need to be configurable self.logo_directory = "artifacts" self.logo_file_name = "banner.png" # does this need to be configurable. # create the output path for reports and move *.png files self.current_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #self.set_path_date_time() #self.setup_banner_logo() #self.copy_banner() #self.copy_logo() # create the output directory # move the banners and candela images to report path #def setup_banner_logo(self): def set_path(self,_path): self.path = _path def set_date_time_directory(self): self.date_time_directory = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%M-m-%S-s")).replace(':','-') #def set_date_time_directory(self,date_time_directory): # self.date_time_directory = date_time_directory def set_path_date_time(self): if self.date_time_directory == "": self.set_date_time_directory() try: self.path_date_time = os.path.join(self.path, self.date_time_directory) print("path_date_time {}".format(self.path_date_time)) if not os.path.exists(self.path_date_time): os.mkdir(self.path_date_time) except: self.path_date_time = os.path.join(self.currentpath, self.date_time_directory) if not os.path.exists(self.path_date_time): os.mkdir(self.path_date_time) #print("report path : {}".format(self.path_date_time)) def set_time_date(self,_time_date): self.time_date def set_title(self,_title): self.title = _title def set_table_title(self,_table_title): self.table_title = _table_title def set_graph_title(self,_graph_title): self.graph_title = _graph_title def set_date(self,_date): self.date = _date def set_dataframe(self,_dataframe): self.dataframe = _dataframe def set_custom_html(self,_custom_html): self.custom_html = _custom_html def set_obj_html(self,_obj_title, _obj ): self.objective = _obj self.obj_title = _obj_title def set_graph_image(self,_graph_image): self.graph_image = _graph_image def get_path(self): return self.path def get_path_date_time(self): return self.path_date_time def write_html(self): self.write_output_html = str(self.path_date_time)+'/'+ str(self.output_html) print("write_output_html: {}".format(self.write_output_html)) try: test_file = open(self.write_output_html, "w") test_file.write(self.html) test_file.close() except: print("write_html failed") return self.write_output_html def write_pdf(self): # write logic to generate pdf here # wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb # sudo apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb #options = {"enable-local-file-access" : None} # prevent error Blocked access to file #self.write_output_pdf = str(self.path_date_time)+'/'+ str(self.output_pdf) #pdfkit.from_file(self.write_output_html, self.write_output_pdf, options=options) pass def generate_report(self): self.write_html() self.write_pdf() # only use is pass all data in constructor, no graph output def build_all(self): self.build_banner() self.build_table_title() self.build_table() def build_banner(self): self.banner_html = """
BANNER


""" + str(self.title) + """

""" + str(self.date) + """




""" self.html += self.banner_html def build_table_title(self): self.table_title_html = """

""" + str(self.table_title) + """

""" self.html += self.table_title_html def build_date_time(self): self.date_time = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%m-m-%S-s")).replace(':','-') return self.date_time def build_path_date_time(self): try: self.path_date_time = os.path.join(self.path,self.date_time) os.mkdir(self.path_date_time) except: curr_dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) self.path_date_time = os.path.join(curr_dir_path,self.date_time) os.mkdir(self.path_date_time) def build_table(self): self.dataframe_html = self.dataframe.to_html(index=False) # have the index be able to be passed in. self.html += self.dataframe_html def build_custom(self): self.html += self.custom_html def build_objective(self): self.obj_html = """

""" + str(self.obj_title) + """

""" + str(self.objective) + """

""" self.html += self.obj_html def build_graph_title(self): self.table_graph_html = """

""" + str(self.graph_title) + """

""" self.html += self.table_graph_html def build_graph(self): self.graph_html_obj = """

""" self.html +=self.graph_html_obj # Unit Test if __name__ == "__main__": # Testing: generate data frame dataframe = pd.DataFrame({ 'product':['CT521a-264-1ac-1n','CT521a-1ac-1ax','CT522-264-1ac2-1n','CT523c-2ac2-db-10g-cu','CT523c-3ac2-db-10g-cu','CT523c-8ax-ac10g-cu','CT523c-192-2ac2-1ac-10g'], 'radios':[1,1,2,2,6,9,3], 'MIMO':['N','N','N','Y','Y','Y','Y'], 'stations':[200,64,200,128,384,72,192], 'mbps':[300,300,300,10000,10000,10000,10000] }) print(dataframe) # Testing: generate data frame dataframe2 = pd.DataFrame({ 'station':[1,2,3,4,5,6,7], 'time_seconds':[23,78,22,19,45,22,25] }) report = lf_report() report.set_title("Banner Title One") report.build_banner() report.set_table_title("Title One") report.build_table_title() report.set_dataframe(dataframe) report.build_table() report.set_table_title("Title Two") report.build_table_title() report.set_dataframe(dataframe2) report.build_table() #report.build_all() html_file = report.write_html() print("returned file ") print(html_file) report.write_pdf() print("report path {}".format(report.get_path()))