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.'])
manual_folder = 'User_manual'
picture_folder_path = WindowsPath('C:/work/floss/friction_loss/resources')
def create_user_manual() -> custom_plugin_base.server.calculation.SolveFileContent:
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
def create_book(**kwargs) -> None:
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()
def create_title_page(page, _text) -> polydoc.polypage.polypage:
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 Титульная страница

def create_input_params_page(page, _text, language) -> polydoc.polypage.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 Страница с описанием входных данных

def create_well_construction_page(page, _text, language, path) -> None:
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 Полный путь до корневой пакпи отчета

def create_pump_page(page, _text, language) -> None:
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 Язык веб-страницы

def create_webreport_page(page, _text, language, path) -> None:
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 Полный путь до корневой пакпи отчета