friction_loss.outputs.create_user_manual
1import io 2import shutil 3from pathlib import Path 4 5from custom_plugin_base.server.calculation import SolveFileContent 6from custom_plugin_base.utils.service_enum import LangEnum 7from polydoc.polypage import polypage, polybook, tab 8 9from friction_loss.outputs.create_template import create_excel_table 10from friction_loss._version import __version__ 11from friction_loss.utils.const import LANG_LIST, DEFAULT_VALUE_TEMPLATE 12from friction_loss.utils.converting_units import convert_template_data 13from friction_loss.utils.set_language import (MANUAL_TRANSLATOR, PAGES_NAMES_TRANSLATOR, PARAMETERS_NAMES_TRANSLATOR, 14 PARAMETERS_COMMENTS_TRANSLATOR, COLUMNS_PUMP_DATABASE_TRANSLATOR) 15 16manual_folder = 'User_manual' 17picture_folder_path = Path.cwd() / 'friction_loss' / 'resources' 18 19 20def create_user_manual() -> SolveFileContent: 21 # Create a temporary folder 22 temp_path = Path.cwd() / "TempFiles" 23 temp_path.mkdir(exist_ok=True) 24 25 try: 26 temp_folder = temp_path / manual_folder 27 temp_folder.mkdir(exist_ok=True) 28 29 # Cоздание веб-документа с описанием плагина 30 polybook(root_folder=str(temp_path), title=manual_folder, langlist=LANG_LIST, 31 headerbar=True, footer=True, create_book=create_book) 32 33 for lang in LANG_LIST: 34 # Создание шаблона файла входных данных 35 file_name = PAGES_NAMES_TRANSLATOR[LangEnum(lang)]['params_file'] 36 path_to_file = (temp_path / manual_folder / f"{lang}_{manual_folder}" / 37 MANUAL_TRANSLATOR[LangEnum(lang)]['user manual'] / 38 MANUAL_TRANSLATOR[LangEnum(lang)]['input params'] / f'{file_name}.xlsx') 39 40 default_val = convert_template_data(data=DEFAULT_VALUE_TEMPLATE, units='Russian', language=LangEnum(lang)) 41 create_excel_table(language=LangEnum(lang), unit='Russian', path=path_to_file, data=default_val) 42 43 # Архивация папки 44 shutil.make_archive(str(temp_folder), 'zip', temp_folder) 45 46 # Преобразование в байты 47 with open(str(temp_folder) + '.zip', 'rb') as file: 48 output = io.BytesIO(file.read()) 49 encoded_folder = output.getvalue() 50 51 output = SolveFileContent(name=manual_folder + '.zip', 52 content_type='zip', 53 content=encoded_folder) 54 55 finally: 56 # Deleting the temporary folder 57 shutil.rmtree(temp_path) 58 59 return output 60 61 62def create_book(**kwargs) -> None: 63 path = Path(kwargs['root_folder']) / manual_folder / f"{kwargs['language']}_{kwargs['title']}" 64 language = LangEnum(kwargs['language']) 65 _text = MANUAL_TRANSLATOR[language] 66 67 page = polypage(content_line_height=2, p_style=dict(font_size='1.5em', line_height=2.5), **kwargs) 68 page.locale['ru']['Fig.'] = 'Рис.' 69 70 page.copy_file(str(path / 'img' / 'header.png'), str(path / _text['user manual'] / 'img')) 71 page.copy_file(str(path / 'img' / 'body.png'), str(path / _text['user manual'] / 'img')) 72 73 # Создание страниц отчета host_page-главная страница 74 host_page = page.add_page(title=_text['user manual'], home_page=True, background_image_header='header.png', 75 background_image_body='body.png', image_folder='img', footer=True, headerbar=True, 76 langlist=LANG_LIST) 77 78 title_page = create_title_page(host_page, _text) 79 80 input_params_page = create_input_params_page(host_page, _text, language) 81 create_well_construction_page(input_params_page, _text, language, path) 82 create_pump_page(input_params_page, _text, language) 83 84 create_webreport_page(host_page, _text, language, path) 85 86 # Создали подвижную панель слева 87 host_iframe = host_page.add_content_and_iframe(home_page=title_page, 88 left_offset='20%', 89 breadcrumbs=False, 90 item_style=dict(fz='x-large'), 91 counter_format='plain') 92 93 name_project = [dict(text=_text['user manual'], target=title_page)] 94 host_page.add_navbar(navbar=name_project, target=host_iframe, refresh_footer=True) 95 96 # Создание страниц документа 97 page.locale = False # для того чтобы не создавался файлик locale.xlsx 98 page.create_pages() 99 100 101def create_title_page(page, _text) -> polypage: 102 """ 103 Создание титульной страницы 104 105 Parameters 106 ---------- 107 page: polypage 108 Родительская страница 109 _text: dict 110 Словарь-переводчик 111 112 Returns 113 ------- 114 title_page: polypage 115 Титульная страница 116 """ 117 title_page = page.add_page(title=_text['start'], footer=False, headerbar=False, 118 background_image_body='body.ong', image_folder='img') 119 title_page.hold.add_h(level=2, content=_text['name plugin']) 120 title_page.hold.add_h(level=2, content=_text['author']) 121 title_page.hold.add_h(level=2, content=_text['version']+__version__) 122 title_page.hold.add_h(level=2, content=_text['purpose']) 123 title_page.hold.add_h(level=2, content=_text['start']+':') 124 title_page.hold.add_h(level=2, content=tab(8)+_text['start1']) 125 title_page.hold.add_h(level=2, content=tab(8)+_text['start2']) 126 title_page.hold.add_h(level=2, content=tab(8)+_text['start3']) 127 title_page.hold.add_h(level=2, content=tab(8)+_text['start4']) 128 129 return title_page 130 131 132def create_input_params_page(page, _text, language) -> polypage: 133 """ 134 Создание страницы с описанием входных данных 135 136 Parameters 137 ---------- 138 page: polypage 139 Родительская страница 140 _text: dict 141 Словарь-переводчик 142 language: LangEnum 143 Язык веб-страницы 144 145 Returns 146 ------- 147 input_params_page: polypage 148 Страница с описанием входных данных 149 """ 150 input_params_page = page.add_page(title=_text['input params'], footer=False, headerbar=False, 151 background_image_body='body.ong', image_folder='img') 152 input_params_page.hold.add_h(level=2, content=_text['get_template1']) 153 154 # Добавление кнопки загрузки файла 155 file_name = PAGES_NAMES_TRANSLATOR[language]['params_file'] 156 input_params_page.hold.add_a(level=2, content=_text['get_template2'], style="text-align:left", 157 subtag=f'href="{file_name}.xlsx" download=f"{file_name}.xlsx", download') 158 159 return input_params_page 160 161 162def create_well_construction_page(page, _text, language, path) -> None: 163 """ 164 Создание страницы с описанием отчета 165 166 Parameters 167 ---------- 168 page: polypage 169 Родительская страница 170 _text: dict 171 Словарь-переводчик 172 language: LangEnum 173 Язык веб-страницы 174 path: Path 175 Полный путь до корневой пакпи отчета 176 """ 177 well_construction_page = page.add_page(title=_text['well construction'], footer=False, headerbar=False, 178 background_image_body='body.ong', image_folder='img') 179 180 name = [_text['name param']] + [i for i in PARAMETERS_NAMES_TRANSLATOR[language].values()] 181 value = [_text['definition']] + [i for i in PARAMETERS_COMMENTS_TRANSLATOR[language].values()] 182 value[-2] = COLUMNS_PUMP_DATABASE_TRANSLATOR[language]['name'] 183 value[-1] = _text['generation report'] 184 table_style = dict(pl=0.5, b='s1', fc='black') 185 186 cells = ', '.join(f'({i + 1}, *)' for i in range(0, len(name), 2)) 187 cell_style = {'(1,*)': dict(fw='bold', b='b2'), 188 f'({cells})': dict(fc='black', b='s1', bc='ws')} 189 190 # Добавили таблицу 191 well_construction_page.add_table(well_construction_page.hold, data=[*map(list, zip(name, value))], 192 table_style=table_style, cell_style=cell_style, margin_left=3, width=80, 193 height=40, border='gr2') 194 195 # Добавили картинку пример MD координат 196 well_construction_page.hold.add_break(count=2) 197 path = path / _text['user manual'] / _text['input params'] / _text['well construction'] / 'img' 198 well_construction_page.copy_file(picture_folder_path / 'MD.png', str(path)) 199 well_construction_page.add_figure(classname='pkd_base', width='100%; margin-left:30px', src='img/MD.png', 200 href='img/MD.png', ref='live_plot', title=_text['md coord'], number=1, 201 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.']) 202 203 204def create_pump_page(page, _text, language) -> None: 205 """ 206 Создание страницы с описанием параметров насоса 207 208 Parameters 209 ---------- 210 page: polypage 211 Родительская страница 212 _text: dict 213 Словарь-переводчик 214 language: LangEnum 215 Язык веб-страницы 216 """ 217 pump_page = page.add_page(title=_text['pump db'], footer=False, headerbar=False, 218 background_image_body='body.ong', image_folder='img') 219 name = [i.split(',')[0] for i in COLUMNS_PUMP_DATABASE_TRANSLATOR[language].values()] 220 name[4] += _text['pump diam'] 221 222 pump_page.hold.add_h(level=1, content=_text['pump']) 223 pump_page.hold.add_list(content=name, 224 style=dict(list_style_type='circle; font-size: 25px; line-height: 1.5; color: darkblue;')) 225 226 pump_page.hold.add_h(level=2, content=_text['pump2']) 227 228 pump_page.hold.add_h(level=2, content=_text['pump3']) 229 230 231def create_webreport_page(page, _text, language, path) -> None: 232 """ 233 Создание страницы с описанием отчета 234 235 Parameters 236 ---------- 237 page: polypage 238 Родительская страница 239 _text: dict 240 Словарь-переводчик 241 language: LangEnum 242 Язык веб-страницы 243 path: Path 244 Полный путь до корневой пакпи отчета 245 """ 246 web_report_page = page.add_page(title=_text['report'], footer=False, headerbar=False, 247 background_image_body='body.png', image_folder='img') 248 249 web_report_page.hold.add_h(level=2, content=_text['report1']) 250 251 path = path / _text['user manual'] / _text['report'] / 'img' 252 name = f"{PAGES_NAMES_TRANSLATOR[language]['downhole']}" 253 web_report_page.hold.add_h(level=2, content=tab(8) + name) 254 web_report_page.copy_file(picture_folder_path / f"{name}.svg", str(path)) 255 web_report_page.copy_file(picture_folder_path / f"{name}.html", str(path)) 256 web_report_page.add_figure(classname='pkd_base', width='100; margin-left:30px', src=f'img/{name}.svg', 257 href=f'img/{name}.html', ref='live_plot', title=name, number=2, 258 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.']) 259 260 web_report_page.hold.add_break(count=2) 261 name = f"{PAGES_NAMES_TRANSLATOR[language]['profile']}" 262 web_report_page.hold.add_h(level=2, content=tab(8) + name) 263 web_report_page.copy_file(picture_folder_path / f"{name}.svg", str(path)) 264 web_report_page.copy_file(picture_folder_path / f"{name}.html", str(path)) 265 web_report_page.add_figure(classname='pkd_base', width='100%; margin-left:30px', src=f'img/{name}.svg', 266 href=f'img/{name}.html', ref='live_plot', title=name, number=3, 267 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.'])
21def create_user_manual() -> SolveFileContent: 22 # Create a temporary folder 23 temp_path = Path.cwd() / "TempFiles" 24 temp_path.mkdir(exist_ok=True) 25 26 try: 27 temp_folder = temp_path / manual_folder 28 temp_folder.mkdir(exist_ok=True) 29 30 # Cоздание веб-документа с описанием плагина 31 polybook(root_folder=str(temp_path), title=manual_folder, langlist=LANG_LIST, 32 headerbar=True, footer=True, create_book=create_book) 33 34 for lang in LANG_LIST: 35 # Создание шаблона файла входных данных 36 file_name = PAGES_NAMES_TRANSLATOR[LangEnum(lang)]['params_file'] 37 path_to_file = (temp_path / manual_folder / f"{lang}_{manual_folder}" / 38 MANUAL_TRANSLATOR[LangEnum(lang)]['user manual'] / 39 MANUAL_TRANSLATOR[LangEnum(lang)]['input params'] / f'{file_name}.xlsx') 40 41 default_val = convert_template_data(data=DEFAULT_VALUE_TEMPLATE, units='Russian', language=LangEnum(lang)) 42 create_excel_table(language=LangEnum(lang), unit='Russian', path=path_to_file, data=default_val) 43 44 # Архивация папки 45 shutil.make_archive(str(temp_folder), 'zip', temp_folder) 46 47 # Преобразование в байты 48 with open(str(temp_folder) + '.zip', 'rb') as file: 49 output = io.BytesIO(file.read()) 50 encoded_folder = output.getvalue() 51 52 output = SolveFileContent(name=manual_folder + '.zip', 53 content_type='zip', 54 content=encoded_folder) 55 56 finally: 57 # Deleting the temporary folder 58 shutil.rmtree(temp_path) 59 60 return output
63def create_book(**kwargs) -> None: 64 path = Path(kwargs['root_folder']) / manual_folder / f"{kwargs['language']}_{kwargs['title']}" 65 language = LangEnum(kwargs['language']) 66 _text = MANUAL_TRANSLATOR[language] 67 68 page = polypage(content_line_height=2, p_style=dict(font_size='1.5em', line_height=2.5), **kwargs) 69 page.locale['ru']['Fig.'] = 'Рис.' 70 71 page.copy_file(str(path / 'img' / 'header.png'), str(path / _text['user manual'] / 'img')) 72 page.copy_file(str(path / 'img' / 'body.png'), str(path / _text['user manual'] / 'img')) 73 74 # Создание страниц отчета host_page-главная страница 75 host_page = page.add_page(title=_text['user manual'], home_page=True, background_image_header='header.png', 76 background_image_body='body.png', image_folder='img', footer=True, headerbar=True, 77 langlist=LANG_LIST) 78 79 title_page = create_title_page(host_page, _text) 80 81 input_params_page = create_input_params_page(host_page, _text, language) 82 create_well_construction_page(input_params_page, _text, language, path) 83 create_pump_page(input_params_page, _text, language) 84 85 create_webreport_page(host_page, _text, language, path) 86 87 # Создали подвижную панель слева 88 host_iframe = host_page.add_content_and_iframe(home_page=title_page, 89 left_offset='20%', 90 breadcrumbs=False, 91 item_style=dict(fz='x-large'), 92 counter_format='plain') 93 94 name_project = [dict(text=_text['user manual'], target=title_page)] 95 host_page.add_navbar(navbar=name_project, target=host_iframe, refresh_footer=True) 96 97 # Создание страниц документа 98 page.locale = False # для того чтобы не создавался файлик locale.xlsx 99 page.create_pages()
102def create_title_page(page, _text) -> polypage: 103 """ 104 Создание титульной страницы 105 106 Parameters 107 ---------- 108 page: polypage 109 Родительская страница 110 _text: dict 111 Словарь-переводчик 112 113 Returns 114 ------- 115 title_page: polypage 116 Титульная страница 117 """ 118 title_page = page.add_page(title=_text['start'], footer=False, headerbar=False, 119 background_image_body='body.ong', image_folder='img') 120 title_page.hold.add_h(level=2, content=_text['name plugin']) 121 title_page.hold.add_h(level=2, content=_text['author']) 122 title_page.hold.add_h(level=2, content=_text['version']+__version__) 123 title_page.hold.add_h(level=2, content=_text['purpose']) 124 title_page.hold.add_h(level=2, content=_text['start']+':') 125 title_page.hold.add_h(level=2, content=tab(8)+_text['start1']) 126 title_page.hold.add_h(level=2, content=tab(8)+_text['start2']) 127 title_page.hold.add_h(level=2, content=tab(8)+_text['start3']) 128 title_page.hold.add_h(level=2, content=tab(8)+_text['start4']) 129 130 return title_page
Создание титульной страницы
Parameters
page: polypage Родительская страница _text: dict Словарь-переводчик
Returns
title_page: polypage Титульная страница
133def create_input_params_page(page, _text, language) -> polypage: 134 """ 135 Создание страницы с описанием входных данных 136 137 Parameters 138 ---------- 139 page: polypage 140 Родительская страница 141 _text: dict 142 Словарь-переводчик 143 language: LangEnum 144 Язык веб-страницы 145 146 Returns 147 ------- 148 input_params_page: polypage 149 Страница с описанием входных данных 150 """ 151 input_params_page = page.add_page(title=_text['input params'], footer=False, headerbar=False, 152 background_image_body='body.ong', image_folder='img') 153 input_params_page.hold.add_h(level=2, content=_text['get_template1']) 154 155 # Добавление кнопки загрузки файла 156 file_name = PAGES_NAMES_TRANSLATOR[language]['params_file'] 157 input_params_page.hold.add_a(level=2, content=_text['get_template2'], style="text-align:left", 158 subtag=f'href="{file_name}.xlsx" download=f"{file_name}.xlsx", download') 159 160 return input_params_page
Создание страницы с описанием входных данных
Parameters
page: polypage Родительская страница _text: dict Словарь-переводчик language: LangEnum Язык веб-страницы
Returns
input_params_page: polypage Страница с описанием входных данных
163def create_well_construction_page(page, _text, language, path) -> None: 164 """ 165 Создание страницы с описанием отчета 166 167 Parameters 168 ---------- 169 page: polypage 170 Родительская страница 171 _text: dict 172 Словарь-переводчик 173 language: LangEnum 174 Язык веб-страницы 175 path: Path 176 Полный путь до корневой пакпи отчета 177 """ 178 well_construction_page = page.add_page(title=_text['well construction'], footer=False, headerbar=False, 179 background_image_body='body.ong', image_folder='img') 180 181 name = [_text['name param']] + [i for i in PARAMETERS_NAMES_TRANSLATOR[language].values()] 182 value = [_text['definition']] + [i for i in PARAMETERS_COMMENTS_TRANSLATOR[language].values()] 183 value[-2] = COLUMNS_PUMP_DATABASE_TRANSLATOR[language]['name'] 184 value[-1] = _text['generation report'] 185 table_style = dict(pl=0.5, b='s1', fc='black') 186 187 cells = ', '.join(f'({i + 1}, *)' for i in range(0, len(name), 2)) 188 cell_style = {'(1,*)': dict(fw='bold', b='b2'), 189 f'({cells})': dict(fc='black', b='s1', bc='ws')} 190 191 # Добавили таблицу 192 well_construction_page.add_table(well_construction_page.hold, data=[*map(list, zip(name, value))], 193 table_style=table_style, cell_style=cell_style, margin_left=3, width=80, 194 height=40, border='gr2') 195 196 # Добавили картинку пример MD координат 197 well_construction_page.hold.add_break(count=2) 198 path = path / _text['user manual'] / _text['input params'] / _text['well construction'] / 'img' 199 well_construction_page.copy_file(picture_folder_path / 'MD.png', str(path)) 200 well_construction_page.add_figure(classname='pkd_base', width='100%; margin-left:30px', src='img/MD.png', 201 href='img/MD.png', ref='live_plot', title=_text['md coord'], number=1, 202 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.'])
Создание страницы с описанием отчета
Parameters
page: polypage Родительская страница _text: dict Словарь-переводчик language: LangEnum Язык веб-страницы path: Path Полный путь до корневой пакпи отчета
205def create_pump_page(page, _text, language) -> None: 206 """ 207 Создание страницы с описанием параметров насоса 208 209 Parameters 210 ---------- 211 page: polypage 212 Родительская страница 213 _text: dict 214 Словарь-переводчик 215 language: LangEnum 216 Язык веб-страницы 217 """ 218 pump_page = page.add_page(title=_text['pump db'], footer=False, headerbar=False, 219 background_image_body='body.ong', image_folder='img') 220 name = [i.split(',')[0] for i in COLUMNS_PUMP_DATABASE_TRANSLATOR[language].values()] 221 name[4] += _text['pump diam'] 222 223 pump_page.hold.add_h(level=1, content=_text['pump']) 224 pump_page.hold.add_list(content=name, 225 style=dict(list_style_type='circle; font-size: 25px; line-height: 1.5; color: darkblue;')) 226 227 pump_page.hold.add_h(level=2, content=_text['pump2']) 228 229 pump_page.hold.add_h(level=2, content=_text['pump3'])
Создание страницы с описанием параметров насоса
Parameters
page: polypage Родительская страница _text: dict Словарь-переводчик language: LangEnum Язык веб-страницы
232def create_webreport_page(page, _text, language, path) -> None: 233 """ 234 Создание страницы с описанием отчета 235 236 Parameters 237 ---------- 238 page: polypage 239 Родительская страница 240 _text: dict 241 Словарь-переводчик 242 language: LangEnum 243 Язык веб-страницы 244 path: Path 245 Полный путь до корневой пакпи отчета 246 """ 247 web_report_page = page.add_page(title=_text['report'], footer=False, headerbar=False, 248 background_image_body='body.png', image_folder='img') 249 250 web_report_page.hold.add_h(level=2, content=_text['report1']) 251 252 path = path / _text['user manual'] / _text['report'] / 'img' 253 name = f"{PAGES_NAMES_TRANSLATOR[language]['downhole']}" 254 web_report_page.hold.add_h(level=2, content=tab(8) + name) 255 web_report_page.copy_file(picture_folder_path / f"{name}.svg", str(path)) 256 web_report_page.copy_file(picture_folder_path / f"{name}.html", str(path)) 257 web_report_page.add_figure(classname='pkd_base', width='100; margin-left:30px', src=f'img/{name}.svg', 258 href=f'img/{name}.html', ref='live_plot', title=name, number=2, 259 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.']) 260 261 web_report_page.hold.add_break(count=2) 262 name = f"{PAGES_NAMES_TRANSLATOR[language]['profile']}" 263 web_report_page.hold.add_h(level=2, content=tab(8) + name) 264 web_report_page.copy_file(picture_folder_path / f"{name}.svg", str(path)) 265 web_report_page.copy_file(picture_folder_path / f"{name}.html", str(path)) 266 web_report_page.add_figure(classname='pkd_base', width='100%; margin-left:30px', src=f'img/{name}.svg', 267 href=f'img/{name}.html', ref='live_plot', title=name, number=3, 268 title_separator='  —  ', title_tag=page.locale[language.value]['Fig.'])
Создание страницы с описанием отчета
Parameters
page: polypage Родительская страница _text: dict Словарь-переводчик language: LangEnum Язык веб-страницы path: Path Полный путь до корневой пакпи отчета