mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 10:48:02 +00:00 
			
		
		
		
	lf_report: Use only 4 spaces per indent, this is python, not javascript
Signed-off-by: Matthew Stidham <stidmatt@gmail.com>
This commit is contained in:
		| @@ -1,20 +1,20 @@ | |||||||
| #!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
| ''' | """ | ||||||
| NAME: lf_report.py | NAME: lf_report.py | ||||||
|  |  | ||||||
| PURPOSE:  | PURPOSE: | ||||||
|  |  | ||||||
| This program is a helper  class for reporting results for a lanforge python script. | This program is a helper  class for reporting results for a lanforge python script. | ||||||
| The class will generate an output directory based on date and time in the /home/lanforge/html-reports/ .    | The class will generate an output directory based on date and time in the /home/lanforge/html-reports/ . | ||||||
| If the reports-data is not present then the date and time directory will be created in the current directory. | If the reports-data is not present then the date and time directory will be created in the current directory. | ||||||
| The banner and Candela Technology logo will be copied in the results directory.  | The banner and Candela Technology logo will be copied in the results directory. | ||||||
| The results directory may be over written and many of the other paramaters during construction.  | The results directory may be over written and many of the other paramaters during construction. | ||||||
| Creating the date time directory on construction was a design choice. | Creating the date time directory on construction was a design choice. | ||||||
|  |  | ||||||
| EXAMPLE:  | EXAMPLE: | ||||||
|  |  | ||||||
| This is a helper class, a unit test is included at the bottom of the file.   | This is a helper class, a unit test is included at the bottom of the file. | ||||||
| To test lf_report.py and lf_graph.py together use the lf_report_test.py file | To test lf_report.py and lf_graph.py together use the lf_report_test.py file | ||||||
|  |  | ||||||
| LICENSE: | LICENSE: | ||||||
| @@ -23,7 +23,7 @@ LICENSE: | |||||||
|  |  | ||||||
|  |  | ||||||
| INCLUDE_IN_README | INCLUDE_IN_README | ||||||
| ''' | """ | ||||||
| # CAUTION: adding imports to this file which are not in update_dependencies.py is not advised | # CAUTION: adding imports to this file which are not in update_dependencies.py is not advised | ||||||
| import os | import os | ||||||
| import shutil | import shutil | ||||||
| @@ -33,145 +33,148 @@ import pandas as pd | |||||||
| import pdfkit | import pdfkit | ||||||
| import argparse | import argparse | ||||||
|  |  | ||||||
|  |  | ||||||
| # internal candela references included during intial phases, to be deleted at future date | # 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 | # https://candelatech.atlassian.net/wiki/spaces/LANFORGE/pages/372703360/Scripting+Data+Collection+March+2021 | ||||||
| # base report class | # base report class | ||||||
| class lf_report(): |  | ||||||
|  | class lf_report: | ||||||
|     def __init__(self, |     def __init__(self, | ||||||
|                 #_path the report directory under which the report directories will be created. |                  # _path the report directory under which the report directories will be created. | ||||||
|                 _path = "/home/lanforge/html-reports", |                  _path="/home/lanforge/html-reports", | ||||||
|                 _alt_path = "", |                  _alt_path="", | ||||||
|                 _date = "", |                  _date="", | ||||||
|                 _title="LANForge Unit Test Run Heading", |                  _title="LANForge Unit Test Run Heading", | ||||||
|                 _table_title="LANForge Table Heading", |                  _table_title="LANForge Table Heading", | ||||||
|                 _graph_title="LANForge Graph Title", |                  _graph_title="LANForge Graph Title", | ||||||
|                 _obj = "", |                  _obj="", | ||||||
|                 _obj_title = "", |                  _obj_title="", | ||||||
|                 _output_html="outfile.html", |                  _output_html="outfile.html", | ||||||
|                 _output_pdf="outfile.pdf", |                  _output_pdf="outfile.pdf", | ||||||
|                 _results_dir_name = "LANforge_Test_Results_Unit_Test", |                  _results_dir_name="LANforge_Test_Results_Unit_Test", | ||||||
|                 _output_format = 'html',  # pass in on the write functionality, current not used |                  _output_format='html',  # pass in on the write functionality, current not used | ||||||
|                 _dataframe="", |                  _dataframe="", | ||||||
|                 _path_date_time="", |                  _path_date_time="", | ||||||
|                  _custom_css='custom-example.css'):  # this is where the final report is placed. |                  _custom_css='custom-example.css'):  # this is where the final report is placed. | ||||||
|                 #other report paths,  |         # other report paths, | ||||||
|  |  | ||||||
|             # _path is where the directory with the data time will be created |         # _path is where the directory with the data time will be created | ||||||
|             if _path == "local" or _path == "here": |         if _path == "local" or _path == "here": | ||||||
|                 self.path = os.path.abspath(__file__) |             self.path = os.path.abspath(__file__) | ||||||
|                 print("path set to file path: {}".format(self.path)) |             print("path set to file path: {}".format(self.path)) | ||||||
|             elif _alt_path != "": |         elif _alt_path != "": | ||||||
|                 self.path = _alt_path |             self.path = _alt_path | ||||||
|                 print("path set to alt path: {}".format(self.path)) |             print("path set to alt path: {}".format(self.path)) | ||||||
|             else: |         else: | ||||||
|                 self.path = _path |             self.path = _path | ||||||
|                 print("path set: {}".format(self.path)) |             print("path set: {}".format(self.path)) | ||||||
|                  |  | ||||||
|             self.dataframe=_dataframe |         self.dataframe = _dataframe | ||||||
|             self.text = "" |         self.text = "" | ||||||
|             self.title=_title |         self.title = _title | ||||||
|             self.table_title=_table_title |         self.table_title = _table_title | ||||||
|             self.graph_title=_graph_title |         self.graph_title = _graph_title | ||||||
|             self.date=_date |         self.date = _date | ||||||
|             self.output_html=_output_html |         self.output_html = _output_html | ||||||
|             self.path_date_time = _path_date_time |         self.path_date_time = _path_date_time | ||||||
|             self.write_output_html = "" |         self.write_output_html = "" | ||||||
|             self.write_output_index_html = "" |         self.write_output_index_html = "" | ||||||
|             self.output_pdf=_output_pdf |         self.output_pdf = _output_pdf | ||||||
|             self.write_output_pdf = "" |         self.write_output_pdf = "" | ||||||
|             self.banner_html = "" |         self.banner_html = "" | ||||||
|             self.footer_html = "" |         self.footer_html = "" | ||||||
|             self.graph_titles="" |         self.graph_titles = "" | ||||||
|             self.graph_image="" |         self.graph_image = "" | ||||||
|             self.csv_file_name="" |         self.csv_file_name = "" | ||||||
|             self.html = "" |         self.html = "" | ||||||
|             self.custom_html = "" |         self.custom_html = "" | ||||||
|             self.pdf_link_html = "" |         self.pdf_link_html = "" | ||||||
|             self.objective = _obj |         self.objective = _obj | ||||||
|             self.obj_title = _obj_title |         self.obj_title = _obj_title | ||||||
|             #self.systeminfopath = "" |         # self.systeminfopath = "" | ||||||
|             self.date_time_directory = "" |         self.date_time_directory = "" | ||||||
|             self.log_directory = "" |         self.log_directory = "" | ||||||
|              |  | ||||||
|             self.banner_directory = "artifacts" |         self.banner_directory = "artifacts" | ||||||
|             self.banner_file_name = "banner.png"    # does this need to be configurable |         self.banner_file_name = "banner.png"  # does this need to be configurable | ||||||
|             self.logo_directory = "artifacts"        |         self.logo_directory = "artifacts" | ||||||
|             self.logo_file_name = "CandelaLogo2-90dpi-200x90-trans.png"      # does this need to be configurable. |         self.logo_file_name = "CandelaLogo2-90dpi-200x90-trans.png"  # does this need to be configurable. | ||||||
|             self.logo_footer_file_name = "candela_swirl_small-72h.png"      # does this need to be configurable. |         self.logo_footer_file_name = "candela_swirl_small-72h.png"  # does this need to be configurable. | ||||||
|             self.current_path = os.path.dirname(os.path.abspath(__file__)) |         self.current_path = os.path.dirname(os.path.abspath(__file__)) | ||||||
|             self.custom_css = _custom_css |         self.custom_css = _custom_css | ||||||
|             # note: the following 3 calls must be in order |         # note: the following 3 calls must be in order | ||||||
|             self.set_date_time_directory(_date,_results_dir_name) |         self.set_date_time_directory(_date, _results_dir_name) | ||||||
|             self.build_date_time_directory() |         self.build_date_time_directory() | ||||||
|             self.build_log_directory() |         self.build_log_directory() | ||||||
|  |  | ||||||
|  |         self.font_file = "CenturyGothic.woff" | ||||||
|  |         # move the banners and candela images to report path | ||||||
|  |         self.copy_banner() | ||||||
|  |         self.copy_css() | ||||||
|  |         self.copy_logo() | ||||||
|  |         self.copy_logo_footer() | ||||||
|  |  | ||||||
|             self.font_file = "CenturyGothic.woff" |  | ||||||
|             # move the banners and candela images to report path |  | ||||||
|             self.copy_banner() |  | ||||||
|             self.copy_css() |  | ||||||
|             self.copy_logo() |  | ||||||
|             self.copy_logo_footer() |  | ||||||
|      |  | ||||||
|     def copy_banner(self): |     def copy_banner(self): | ||||||
|         banner_src_file = str(self.current_path)+'/'+str(self.banner_directory)+'/'+str(self.banner_file_name) |         banner_src_file = str(self.current_path) + '/' + str(self.banner_directory) + '/' + str(self.banner_file_name) | ||||||
|         banner_dst_file = str(self.path_date_time)+'/'+ str(self.banner_file_name) |         banner_dst_file = str(self.path_date_time) + '/' + str(self.banner_file_name) | ||||||
|         #print("banner src_file: {}".format(banner_src_file)) |         # print("banner src_file: {}".format(banner_src_file)) | ||||||
|         #print("dst_file: {}".format(banner_dst_file)) |         # print("dst_file: {}".format(banner_dst_file)) | ||||||
|         shutil.copy(banner_src_file, banner_dst_file) |         shutil.copy(banner_src_file, banner_dst_file) | ||||||
|  |  | ||||||
|     def copy_css(self): |     def copy_css(self): | ||||||
|         reportcss_src_file = str(self.current_path)+'/'+str(self.banner_directory)+'/report.css' |         reportcss_src_file = str(self.current_path) + '/' + str(self.banner_directory) + '/report.css' | ||||||
|         # print("copy_css: source file is: "+reportcss_src_file) |         # print("copy_css: source file is: "+reportcss_src_file) | ||||||
|         reportcss_dest_file = str(self.path_date_time)+'/report.css' |         reportcss_dest_file = str(self.path_date_time) + '/report.css' | ||||||
|  |  | ||||||
|         customcss_src_file = str(self.current_path)+'/'+str(self.banner_directory)+'/'+str(self.custom_css) |         customcss_src_file = str(self.current_path) + '/' + str(self.banner_directory) + '/' + str(self.custom_css) | ||||||
|         customcss_dest_file = str(self.path_date_time)+'/custom.css' |         customcss_dest_file = str(self.path_date_time) + '/custom.css' | ||||||
|  |  | ||||||
|         font_src_file = str(self.current_path)+'/'+str(self.banner_directory)+'/'+str(self.font_file) |         font_src_file = str(self.current_path) + '/' + str(self.banner_directory) + '/' + str(self.font_file) | ||||||
|         font_dest_file = str(self.path_date_time)+'/'+str(self.font_file) |         font_dest_file = str(self.path_date_time) + '/' + str(self.font_file) | ||||||
|  |  | ||||||
|         shutil.copy(reportcss_src_file, reportcss_dest_file) |         shutil.copy(reportcss_src_file, reportcss_dest_file) | ||||||
|         shutil.copy(customcss_src_file, customcss_dest_file) |         shutil.copy(customcss_src_file, customcss_dest_file) | ||||||
|         shutil.copy(font_src_file, font_dest_file) |         shutil.copy(font_src_file, font_dest_file) | ||||||
|  |  | ||||||
|     def copy_logo(self): |     def copy_logo(self): | ||||||
|         logo_src_file = str(self.current_path)+'/'+str(self.logo_directory)+'/'+str(self.logo_file_name) |         logo_src_file = str(self.current_path) + '/' + str(self.logo_directory) + '/' + str(self.logo_file_name) | ||||||
|         logo_dst_file = str(self.path_date_time)+'/'+ str(self.logo_file_name) |         logo_dst_file = str(self.path_date_time) + '/' + str(self.logo_file_name) | ||||||
|         #print("logo_src_file: {}".format(logo_src_file)) |         # print("logo_src_file: {}".format(logo_src_file)) | ||||||
|         #print("logo_dst_file: {}".format(logo_dst_file)) |         # print("logo_dst_file: {}".format(logo_dst_file)) | ||||||
|         shutil.copy(logo_src_file, logo_dst_file) |         shutil.copy(logo_src_file, logo_dst_file) | ||||||
|  |  | ||||||
|     def copy_logo_footer(self): |     def copy_logo_footer(self): | ||||||
|         logo_footer_src_file = str(self.current_path)+'/'+str(self.logo_directory)+'/'+str(self.logo_footer_file_name) |         logo_footer_src_file = str(self.current_path) + '/' + str(self.logo_directory) + '/' + str( | ||||||
|         logo_footer_dst_file = str(self.path_date_time)+'/'+ str(self.logo_footer_file_name) |             self.logo_footer_file_name) | ||||||
|         #print("logo_footer_src_file: {}".format(logo_footer_src_file)) |         logo_footer_dst_file = str(self.path_date_time) + '/' + str(self.logo_footer_file_name) | ||||||
|         #print("logo_footer_dst_file: {}".format(logo_footer_dst_file)) |         # print("logo_footer_src_file: {}".format(logo_footer_src_file)) | ||||||
|  |         # print("logo_footer_dst_file: {}".format(logo_footer_dst_file)) | ||||||
|         shutil.copy(logo_footer_src_file, logo_footer_dst_file) |         shutil.copy(logo_footer_src_file, logo_footer_dst_file) | ||||||
|  |  | ||||||
|     def move_graph_image(self,): |     def move_graph_image(self, ): | ||||||
|         graph_src_file = str(self.graph_image) |         graph_src_file = str(self.graph_image) | ||||||
|         graph_dst_file = str(self.path_date_time)+'/'+ str(self.graph_image) |         graph_dst_file = str(self.path_date_time) + '/' + str(self.graph_image) | ||||||
|         print("graph_src_file: {}".format(graph_src_file)) |         print("graph_src_file: {}".format(graph_src_file)) | ||||||
|         print("graph_dst_file: {}".format(graph_dst_file)) |         print("graph_dst_file: {}".format(graph_dst_file)) | ||||||
|         shutil.move(graph_src_file, graph_dst_file) |         shutil.move(graph_src_file, graph_dst_file) | ||||||
|  |  | ||||||
|     def move_csv_file(self): |     def move_csv_file(self): | ||||||
|         csv_src_file = str(self.csv_file_name) |         csv_src_file = str(self.csv_file_name) | ||||||
|         csv_dst_file = str(self.path_date_time)+'/'+str(self.csv_file_name) |         csv_dst_file = str(self.path_date_time) + '/' + str(self.csv_file_name) | ||||||
|         print("csv_src_file: {}".format(csv_src_file)) |         print("csv_src_file: {}".format(csv_src_file)) | ||||||
|         print("csv_dst_file: {}".format(csv_dst_file)) |         print("csv_dst_file: {}".format(csv_dst_file)) | ||||||
|         shutil.move(csv_src_file, csv_dst_file) |         shutil.move(csv_src_file, csv_dst_file) | ||||||
|  |  | ||||||
|     def set_path(self,_path): |     def set_path(self, _path): | ||||||
|         self.path = _path |         self.path = _path | ||||||
|  |  | ||||||
|     def set_date_time_directory(self,_date,_results_dir_name): |     def set_date_time_directory(self, _date, _results_dir_name): | ||||||
|         self.date = _date |         self.date = _date | ||||||
|         self.results_dir_name = _results_dir_name |         self.results_dir_name = _results_dir_name | ||||||
|         if self.date != "": |         if self.date != "": | ||||||
|             self.date_time_directory = str(self.date) + str("_") + str(self.results_dir_name) |             self.date_time_directory = str(self.date) + str("_") + str(self.results_dir_name) | ||||||
|         else: |         else: | ||||||
|             self.date = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")).replace(':','-') |             self.date = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")).replace(':', '-') | ||||||
|             self.date_time_directory = self.date + str("_") + str(self.results_dir_name) |             self.date_time_directory = self.date + str("_") + str(self.results_dir_name) | ||||||
|  |  | ||||||
|     def build_date_time_directory(self): |     def build_date_time_directory(self): | ||||||
| @@ -179,18 +182,18 @@ class lf_report(): | |||||||
|             self.set_date_time_directory() |             self.set_date_time_directory() | ||||||
|         self.path_date_time = os.path.join(self.path, self.date_time_directory) |         self.path_date_time = os.path.join(self.path, self.date_time_directory) | ||||||
|         print("path_date_time {}".format(self.path_date_time)) |         print("path_date_time {}".format(self.path_date_time)) | ||||||
|         try:         |         try: | ||||||
|             if not os.path.exists(self.path_date_time): |             if not os.path.exists(self.path_date_time): | ||||||
|                 os.mkdir(self.path_date_time) |                 os.mkdir(self.path_date_time) | ||||||
|         except: |         except: | ||||||
|             self.path_date_time = os.path.join(self.current_path, self.date_time_directory) |             self.path_date_time = os.path.join(self.current_path, self.date_time_directory) | ||||||
|             if not os.path.exists(self.path_date_time): |             if not os.path.exists(self.path_date_time): | ||||||
|                 os.mkdir(self.path_date_time) |                 os.mkdir(self.path_date_time) | ||||||
|         print("report path : {}".format(self.path_date_time))     |         print("report path : {}".format(self.path_date_time)) | ||||||
|  |  | ||||||
|     def build_log_directory(self): |     def build_log_directory(self): | ||||||
|         if self.log_directory =="": |         if self.log_directory == "": | ||||||
|             self.log_directory = os.path.join(self.path_date_time,"log") |             self.log_directory = os.path.join(self.path_date_time, "log") | ||||||
|         try: |         try: | ||||||
|             if not os.path.exists(self.log_directory): |             if not os.path.exists(self.log_directory): | ||||||
|                 os.mkdir(self.log_directory) |                 os.mkdir(self.log_directory) | ||||||
| @@ -198,16 +201,16 @@ class lf_report(): | |||||||
|             print("exception making {}".format(self.log_directory)) |             print("exception making {}".format(self.log_directory)) | ||||||
|             exit(1) |             exit(1) | ||||||
|  |  | ||||||
|     def set_text(self,_text): |     def set_text(self, _text): | ||||||
|         self.text = _text |         self.text = _text | ||||||
|  |  | ||||||
|     def set_title(self,_title): |     def set_title(self, _title): | ||||||
|         self.title = _title |         self.title = _title | ||||||
|  |  | ||||||
|     def set_table_title(self,_table_title): |     def set_table_title(self, _table_title): | ||||||
|         self.table_title = _table_title |         self.table_title = _table_title | ||||||
|  |  | ||||||
|     def set_graph_title(self,_graph_title): |     def set_graph_title(self, _graph_title): | ||||||
|         self.graph_title = _graph_title |         self.graph_title = _graph_title | ||||||
|  |  | ||||||
|     # sets the csv file name as graph title |     # sets the csv file name as graph title | ||||||
| @@ -216,23 +219,23 @@ class lf_report(): | |||||||
|         self.csv_file_name = fname + ".csv" |         self.csv_file_name = fname + ".csv" | ||||||
|  |  | ||||||
|     # The _date is set when class is enstanciated / created so this set_date should be used with caution, used to synchronize results |     # The _date is set when class is enstanciated / created so this set_date should be used with caution, used to synchronize results | ||||||
|     def set_date(self,_date): |     def set_date(self, _date): | ||||||
|         self.date = _date |         self.date = _date | ||||||
|  |  | ||||||
|     def set_table_dataframe(self,_dataframe): |     def set_table_dataframe(self, _dataframe): | ||||||
|         self.dataframe = _dataframe |         self.dataframe = _dataframe | ||||||
|  |  | ||||||
|     def set_table_dataframe_from_csv(self,_csv): |     def set_table_dataframe_from_csv(self, _csv): | ||||||
|         self.dataframe = pd.read_csv(_csv) |         self.dataframe = pd.read_csv(_csv) | ||||||
|  |  | ||||||
|     def set_custom_html(self,_custom_html): |     def set_custom_html(self, _custom_html): | ||||||
|         self.custom_html = _custom_html |         self.custom_html = _custom_html | ||||||
|  |  | ||||||
|     def set_obj_html(self,_obj_title, _obj ): |     def set_obj_html(self, _obj_title, _obj): | ||||||
|         self.objective = _obj |         self.objective = _obj | ||||||
|         self.obj_title = _obj_title |         self.obj_title = _obj_title | ||||||
|  |  | ||||||
|     def set_graph_image(self,_graph_image): |     def set_graph_image(self, _graph_image): | ||||||
|         self.graph_image = _graph_image |         self.graph_image = _graph_image | ||||||
|  |  | ||||||
|     def get_date(self): |     def get_date(self): | ||||||
| @@ -256,12 +259,12 @@ class lf_report(): | |||||||
|         return self.log_directory |         return self.log_directory | ||||||
|  |  | ||||||
|     def file_add_path(self, file): |     def file_add_path(self, file): | ||||||
|         output_file = str(self.path_date_time)+'/'+ str(file) |         output_file = str(self.path_date_time) + '/' + str(file) | ||||||
|         print("output file {}".format(output_file)) |         print("output file {}".format(output_file)) | ||||||
|         return output_file |         return output_file | ||||||
|  |  | ||||||
|     def write_html(self):  |     def write_html(self): | ||||||
|         self.write_output_html = str(self.path_date_time)+'/'+ str(self.output_html) |         self.write_output_html = str(self.path_date_time) + '/' + str(self.output_html) | ||||||
|         print("write_output_html: {}".format(self.write_output_html)) |         print("write_output_html: {}".format(self.write_output_html)) | ||||||
|         try: |         try: | ||||||
|             test_file = open(self.write_output_html, "w") |             test_file = open(self.write_output_html, "w") | ||||||
| @@ -271,8 +274,8 @@ class lf_report(): | |||||||
|             print("write_html failed") |             print("write_html failed") | ||||||
|         return self.write_output_html |         return self.write_output_html | ||||||
|  |  | ||||||
|     def write_index_html(self):  |     def write_index_html(self): | ||||||
|         self.write_output_index_html = str(self.path_date_time)+'/'+ str("index.html") |         self.write_output_index_html = str(self.path_date_time) + '/' + str("index.html") | ||||||
|         print("write_output_index_html: {}".format(self.write_output_index_html)) |         print("write_output_index_html: {}".format(self.write_output_index_html)) | ||||||
|         try: |         try: | ||||||
|             test_file = open(self.write_output_index_html, "w") |             test_file = open(self.write_output_index_html, "w") | ||||||
| @@ -282,9 +285,8 @@ class lf_report(): | |||||||
|             print("write_index_html failed") |             print("write_index_html failed") | ||||||
|         return self.write_output_index_html |         return self.write_output_index_html | ||||||
|  |  | ||||||
|  |     def write_html_with_timestamp(self): | ||||||
|     def write_html_with_timestamp(self):  |         self.write_output_html = "{}/{}-{}".format(self.path_date_time, self.date, self.output_html) | ||||||
|         self.write_output_html = "{}/{}-{}".format(self.path_date_time,self.date,self.output_html) |  | ||||||
|         print("write_output_html: {}".format(self.write_output_html)) |         print("write_output_html: {}".format(self.write_output_html)) | ||||||
|         try: |         try: | ||||||
|             test_file = open(self.write_output_html, "w") |             test_file = open(self.write_output_html, "w") | ||||||
| @@ -294,57 +296,56 @@ class lf_report(): | |||||||
|             print("write_html failed") |             print("write_html failed") | ||||||
|         return self.write_output_html |         return self.write_output_html | ||||||
|  |  | ||||||
|  |     # https://wkhtmltopdf.org/usage/wkhtmltopdf.txt | ||||||
|  |     # page_size A4, A3, Letter, Legal | ||||||
|  |     # orientation Portrait , Landscape | ||||||
|  |     def write_pdf(self, _page_size='A4', _orientation='Portrait'): | ||||||
|  |         # 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, | ||||||
|  |                    'orientation': _orientation, | ||||||
|  |                    'page-size': _page_size}  # 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) | ||||||
|  |  | ||||||
|     # https://wkhtmltopdf.org/usage/wkhtmltopdf.txt |     # https://wkhtmltopdf.org/usage/wkhtmltopdf.txt | ||||||
|     # page_size A4, A3, Letter, Legal |     # page_size A4, A3, Letter, Legal | ||||||
|     # orientation Portrait , Landscape |     # orientation Portrait , Landscape | ||||||
|     def write_pdf(self, _page_size = 'A4', _orientation = 'Portrait'): |     def write_pdf_with_timestamp(self, _page_size='A4', _orientation='Portrait'): | ||||||
|             # write logic to generate pdf here |         # 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 |         # 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 |         # sudo apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb | ||||||
|              |  | ||||||
|             options = {"enable-local-file-access" : None, |  | ||||||
|                         'orientation': _orientation, |  | ||||||
|                         'page-size': _page_size}  # 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) |  | ||||||
|  |  | ||||||
|     # https://wkhtmltopdf.org/usage/wkhtmltopdf.txt |         options = {"enable-local-file-access": None, | ||||||
|     # page_size A4, A3, Letter, Legal |                    'orientation': _orientation, | ||||||
|     # orientation Portrait , Landscape |                    'page-size': _page_size}  # prevent error Blocked access to file | ||||||
|     def write_pdf_with_timestamp(self, _page_size = 'A4', _orientation = 'Portrait'): |         self.write_output_pdf = "{}/{}-{}".format(self.path_date_time, self.date, self.output_pdf) | ||||||
|             # write logic to generate pdf here |         pdfkit.from_file(self.write_output_html, self.write_output_pdf, options=options) | ||||||
|             # 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, |  | ||||||
|                         'orientation': _orientation, |  | ||||||
|                         'page-size': _page_size}  # prevent error Blocked access to file |  | ||||||
|             self.write_output_pdf = "{}/{}-{}".format(self.path_date_time,self.date,self.output_pdf) |  | ||||||
|             pdfkit.from_file(self.write_output_html, self.write_output_pdf, options=options) |  | ||||||
|  |  | ||||||
|     def get_pdf_path(self): |     def get_pdf_path(self): | ||||||
|         pdf_link_path = "{}/{}-{}".format(self.path_date_time, self.date, self.output_pdf) |         pdf_link_path = "{}/{}-{}".format(self.path_date_time, self.date, self.output_pdf) | ||||||
|         return pdf_link_path |         return pdf_link_path | ||||||
|          |  | ||||||
|     def build_pdf_link(self,_pdf_link_name,_pdf_link_path): |     def build_pdf_link(self, _pdf_link_name, _pdf_link_path): | ||||||
|         self.pdf_link_html = """ |         self.pdf_link_html = """ | ||||||
|             <!-- pdf link --> |             <!-- pdf link --> | ||||||
|             <a href="{pdf_link_path}" target="_blank">{pdf_link_name}</a> |             <a href="{pdf_link_path}" target="_blank">{pdf_link_name}</a> | ||||||
|             <br> |             <br> | ||||||
|         """.format(pdf_link_path=_pdf_link_path,pdf_link_name=_pdf_link_name) |         """.format(pdf_link_path=_pdf_link_path, pdf_link_name=_pdf_link_name) | ||||||
|         self.html += self.pdf_link_html |         self.html += self.pdf_link_html | ||||||
|  |  | ||||||
|     def build_link(self,_link_name,_link_path): |     def build_link(self, _link_name, _link_path): | ||||||
|         self.link = """ |         self.link = """ | ||||||
|             <!-- link --> |             <!-- link --> | ||||||
|             <a href="{link_path}" target="_blank">{link_name}</a> |             <a href="{link_path}" target="_blank">{link_name}</a> | ||||||
|             <br> |             <br> | ||||||
|         """.format(link_path=_link_path,link_name=_link_name) |         """.format(link_path=_link_path, link_name=_link_name) | ||||||
|         self.html += self.link |         self.html += self.link | ||||||
|  |  | ||||||
|     def generate_report(self): |     def generate_report(self): | ||||||
|         self.write_html()             |         self.write_html() | ||||||
|         self.write_pdf() |         self.write_pdf() | ||||||
|  |  | ||||||
|     def build_all(self): |     def build_all(self): | ||||||
| @@ -419,7 +420,6 @@ class lf_report(): | |||||||
|         ) |         ) | ||||||
|         self.html += self.banner_html |         self.html += self.banner_html | ||||||
|  |  | ||||||
|  |  | ||||||
|     def build_table_title(self): |     def build_table_title(self): | ||||||
|         self.table_title_html = """ |         self.table_title_html = """ | ||||||
|                     <!-- Table Title--> |                     <!-- Table Title--> | ||||||
| @@ -442,23 +442,24 @@ class lf_report(): | |||||||
|         self.html += self.text_html |         self.html += self.text_html | ||||||
|  |  | ||||||
|     def build_date_time(self): |     def build_date_time(self): | ||||||
|         self.date_time = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%m-m-%S-s")).replace(':','-') |         self.date_time = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-h-%m-m-%S-s")).replace(':', '-') | ||||||
|         return self.date_time |         return self.date_time | ||||||
|  |  | ||||||
|     def build_path_date_time(self): |     def build_path_date_time(self): | ||||||
|         try:  |         try: | ||||||
|             self.path_date_time = os.path.join(self.path,self.date_time) |             self.path_date_time = os.path.join(self.path, self.date_time) | ||||||
|             os.mkdir(self.path_date_time) |             os.mkdir(self.path_date_time) | ||||||
|         except: |         except: | ||||||
|             curr_dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))       |             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) |             self.path_date_time = os.path.join(curr_dir_path, self.date_time) | ||||||
|             os.mkdir(self.path_date_time)        |             os.mkdir(self.path_date_time) | ||||||
|  |  | ||||||
|     def build_table(self): |     def build_table(self): | ||||||
|         self.dataframe_html = self.dataframe.to_html(index=False, justify='center')  # have the index be able to be passed in. |         self.dataframe_html = self.dataframe.to_html(index=False, | ||||||
|  |                                                      justify='center')  # have the index be able to be passed in. | ||||||
|         self.html += self.dataframe_html |         self.html += self.dataframe_html | ||||||
|  |  | ||||||
|     def test_setup_table(self,test_setup_data, value): |     def test_setup_table(self, test_setup_data, value): | ||||||
|         if test_setup_data is None: |         if test_setup_data is None: | ||||||
|             return None |             return None | ||||||
|         else: |         else: | ||||||
| @@ -471,7 +472,7 @@ class lf_report(): | |||||||
|                             <table width='700px' border='1' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'> |                             <table width='700px' border='1' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'> | ||||||
|                                  |                                  | ||||||
|                                 <tr> |                                 <tr> | ||||||
|                                   <td>"""+ str(value) + """</td> |                                   <td>""" + str(value) + """</td> | ||||||
|                                   <td> |                                   <td> | ||||||
|                                     <table width='100%' border='0' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'> |                                     <table width='100%' border='0' cellpadding='2' cellspacing='0' style='border-top-color: gray; border-top-style: solid; border-top-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px'> | ||||||
|                                       """ + var + """ |                                       """ + var + """ | ||||||
| @@ -571,34 +572,35 @@ function copyTextToClipboard(ele) { | |||||||
|     def end_content_div(self): |     def end_content_div(self): | ||||||
|         self.html += "\n</div><!-- end contentDiv -->\n" |         self.html += "\n</div><!-- end contentDiv -->\n" | ||||||
|  |  | ||||||
|  |  | ||||||
| # Unit Test | # Unit Test | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     parser = argparse.ArgumentParser( |     parser = argparse.ArgumentParser( | ||||||
|         prog="lf_report.py", |         prog="lf_report.py", | ||||||
|         formatter_class=argparse.RawTextHelpFormatter, |         formatter_class=argparse.RawTextHelpFormatter, | ||||||
|         description="Reporting library Unit Test") |         description="Reporting library Unit Test") | ||||||
|     parser.add_argument('--lfmgr', help='sample argument: where LANforge GUI is running', default='localhost')     |     parser.add_argument('--lfmgr', help='sample argument: where LANforge GUI is running', default='localhost') | ||||||
|     # the args parser is not really used , this is so the report is not generated when testing  |     # the args parser is not really used , this is so the report is not generated when testing  | ||||||
|     # the imports with --help |     # the imports with --help | ||||||
|     args = parser.parse_args() |     args = parser.parse_args() | ||||||
|     print("LANforge manager {lfmgr}".format(lfmgr=args.lfmgr)) |     print("LANforge manager {lfmgr}".format(lfmgr=args.lfmgr)) | ||||||
|  |  | ||||||
|  |     # Testing: generate data frame | ||||||
|     # Testing: generate data frame  |  | ||||||
|     dataframe = pd.DataFrame({ |     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'], |         'product': ['CT521a-264-1ac-1n', 'CT521a-1ac-1ax', 'CT522-264-1ac2-1n', 'CT523c-2ac2-db-10g-cu', | ||||||
|     'radios':[1,1,2,2,6,9,3], |                     'CT523c-3ac2-db-10g-cu', 'CT523c-8ax-ac10g-cu', 'CT523c-192-2ac2-1ac-10g'], | ||||||
|     'MIMO':['N','N','N','Y','Y','Y','Y'], |         'radios': [1, 1, 2, 2, 6, 9, 3], | ||||||
|     'stations':[200,64,200,128,384,72,192], |         'MIMO': ['N', 'N', 'N', 'Y', 'Y', 'Y', 'Y'], | ||||||
|     'mbps':[300,300,300,10000,10000,10000,10000] |         'stations': [200, 64, 200, 128, 384, 72, 192], | ||||||
|  |         'mbps': [300, 300, 300, 10000, 10000, 10000, 10000] | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     print(dataframe) |     print(dataframe) | ||||||
|  |  | ||||||
|     # Testing: generate data frame  |     # Testing: generate data frame  | ||||||
|     dataframe2 = pd.DataFrame({ |     dataframe2 = pd.DataFrame({ | ||||||
|      'station':[1,2,3,4,5,6,7], |         'station': [1, 2, 3, 4, 5, 6, 7], | ||||||
|      'time_seconds':[23,78,22,19,45,22,25] |         'time_seconds': [23, 78, 22, 19, 45, 22, 25] | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     report = lf_report() |     report = lf_report() | ||||||
| @@ -617,14 +619,13 @@ if __name__ == "__main__": | |||||||
|     report.set_table_dataframe(dataframe2) |     report.set_table_dataframe(dataframe2) | ||||||
|     report.build_table() |     report.build_table() | ||||||
|  |  | ||||||
|     #report.build_all() |     # report.build_all() | ||||||
|     #report.build_footer() |     # report.build_footer() | ||||||
|     report.build_footer_no_png() |     report.build_footer_no_png() | ||||||
|  |  | ||||||
|     html_file = report.write_html()  |     html_file = report.write_html() | ||||||
|     print("returned file ") |     print("returned file ") | ||||||
|     print(html_file) |     print(html_file) | ||||||
|     report.write_pdf() |     report.write_pdf() | ||||||
|  |  | ||||||
|     print("report path {}".format(report.get_path())) |     print("report path {}".format(report.get_path())) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Matthew Stidham
					Matthew Stidham