Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -18,11 +18,10 @@ class KDChecker:
|
|
| 18 |
self.known_docs = ["Э3", "В4", "ПЭ3", "ВО", "ТЭ5", "СБ", "С5", "ОЛ", "Э1", "Э4", "Э7", "Д3", "Э6"]
|
| 19 |
|
| 20 |
def load_excel_db(self, excel_path):
|
| 21 |
-
# --- ЛОГГЕР ---
|
| 22 |
log = [f"[{datetime.now().strftime('%H:%M:%S')}] Старт функции загрузки"]
|
| 23 |
|
| 24 |
if excel_path is None:
|
| 25 |
-
return "Файл не передан (excel_path is None)", gr.
|
| 26 |
|
| 27 |
log.append(f"Путь к файлу: {excel_path}")
|
| 28 |
|
|
@@ -31,13 +30,13 @@ class KDChecker:
|
|
| 31 |
log.append(f"Размер файла: {size} байт")
|
| 32 |
except Exception as e:
|
| 33 |
log.append(f"Ошибка доступа к файлу: {e}")
|
| 34 |
-
return "\n".join(log), gr.
|
| 35 |
|
| 36 |
try:
|
| 37 |
import openpyxl
|
| 38 |
log.append("Библиотека openpyxl найдена.")
|
| 39 |
except ImportError:
|
| 40 |
-
return "ОШИБКА: Библиотека openpyxl не установлена на сервере!", gr.
|
| 41 |
|
| 42 |
all_data = []
|
| 43 |
sheets_log = []
|
|
@@ -52,7 +51,6 @@ class KDChecker:
|
|
| 52 |
cab_col_idx = -1
|
| 53 |
rem_col_idx = -1
|
| 54 |
|
| 55 |
-
# Поиск заголовков
|
| 56 |
for i in range(min(20, len(df_raw))):
|
| 57 |
row_values = [str(x).lower().strip() for x in df_raw.iloc[i].values]
|
| 58 |
c_idx = -1
|
|
@@ -68,7 +66,6 @@ class KDChecker:
|
|
| 68 |
|
| 69 |
if header_row_index != -1:
|
| 70 |
df = pd.read_excel(excel_path, sheet_name=sheet_name, header=header_row_index, engine='openpyxl')
|
| 71 |
-
# Проверяем, что индексы колонок существуют в этом df
|
| 72 |
if cab_col_idx < len(df.columns) and rem_col_idx < len(df.columns):
|
| 73 |
df_subset = df.iloc[:, [cab_col_idx, rem_col_idx]]
|
| 74 |
df_subset.columns = ["Cabinet", "Remark"]
|
|
@@ -89,7 +86,7 @@ class KDChecker:
|
|
| 89 |
|
| 90 |
if not all_data:
|
| 91 |
log.append("Не найдены данные ни на одном листе.")
|
| 92 |
-
return "\n".join(log), gr.
|
| 93 |
|
| 94 |
self.excel_db = pd.concat(all_data, ignore_index=True)
|
| 95 |
self.cabinet_list = sorted(self.excel_db["Cabinet"].unique().tolist())
|
|
@@ -97,14 +94,14 @@ class KDChecker:
|
|
| 97 |
log.append("Успешно объединили данные.")
|
| 98 |
msg = f"✅ База знаний загружена успешно!\nВсего записей: {len(self.excel_db)}\nОбработаны листы: {', '.join(sheets_log)}"
|
| 99 |
|
| 100 |
-
#
|
| 101 |
-
return msg, gr.
|
| 102 |
|
| 103 |
except Exception as e:
|
| 104 |
log.append(f"КРИТИЧЕСКАЯ ОШИБКА: {str(e)}")
|
| 105 |
import traceback
|
| 106 |
log.append(traceback.format_exc())
|
| 107 |
-
return "\n".join(log), gr.
|
| 108 |
|
| 109 |
def extract_text(self, pdf_path):
|
| 110 |
try:
|
|
@@ -323,8 +320,8 @@ class KDChecker:
|
|
| 323 |
paragraphs = task.split('\n')
|
| 324 |
|
| 325 |
if y < 80:
|
| 326 |
-
c.showPage()
|
| 327 |
-
y = height - 50
|
| 328 |
c.setFont(font_name, 10)
|
| 329 |
|
| 330 |
c.rect(50, y - 10, 10, 10)
|
|
@@ -342,13 +339,14 @@ class KDChecker:
|
|
| 342 |
if len(cur_line) + len(w) + 1 <= max_len:
|
| 343 |
cur_line += w + " "
|
| 344 |
else:
|
| 345 |
-
lines.append(cur_line)
|
|
|
|
| 346 |
lines.append(cur_line)
|
| 347 |
|
| 348 |
for l in lines:
|
| 349 |
if text_start_y < 40:
|
| 350 |
-
c.showPage()
|
| 351 |
-
text_start_y = height - 50
|
| 352 |
c.setFont(font_name, 10)
|
| 353 |
try:
|
| 354 |
c.drawString(65, text_start_y, l.strip())
|
|
@@ -380,10 +378,14 @@ def create_app():
|
|
| 380 |
|
| 381 |
db_in = gr.File(label="Загрузить Excel (.xlsx)", type="filepath")
|
| 382 |
|
| 383 |
-
#
|
| 384 |
-
manual_cab = gr.Dropdown(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 385 |
|
| 386 |
-
db_out = gr.Textbox(label="Статус загрузки", lines=8
|
| 387 |
|
| 388 |
db_in.upload(checker.load_excel_db, inputs=[db_in], outputs=[db_out, manual_cab])
|
| 389 |
|
|
@@ -393,7 +395,7 @@ def create_app():
|
|
| 393 |
btn = gr.Button("Сформировать чек-лист", variant="primary")
|
| 394 |
|
| 395 |
with gr.Row():
|
| 396 |
-
res_txt = gr.Textbox(label="Результат проверки", lines=8
|
| 397 |
res_pdf = gr.File(label="Скачать PDF чек-лист")
|
| 398 |
|
| 399 |
btn.click(checker.check_files, inputs=[files_in, manual_cab], outputs=[res_txt, res_pdf])
|
|
|
|
| 18 |
self.known_docs = ["Э3", "В4", "ПЭ3", "ВО", "ТЭ5", "СБ", "С5", "ОЛ", "Э1", "Э4", "Э7", "Д3", "Э6"]
|
| 19 |
|
| 20 |
def load_excel_db(self, excel_path):
|
|
|
|
| 21 |
log = [f"[{datetime.now().strftime('%H:%M:%S')}] Старт функции загрузки"]
|
| 22 |
|
| 23 |
if excel_path is None:
|
| 24 |
+
return "Файл не передан (excel_path is None)", gr.update(choices=[], value=None)
|
| 25 |
|
| 26 |
log.append(f"Путь к файлу: {excel_path}")
|
| 27 |
|
|
|
|
| 30 |
log.append(f"Размер файла: {size} байт")
|
| 31 |
except Exception as e:
|
| 32 |
log.append(f"Ошибка доступа к файлу: {e}")
|
| 33 |
+
return "\n".join(log), gr.update(choices=[], value=None)
|
| 34 |
|
| 35 |
try:
|
| 36 |
import openpyxl
|
| 37 |
log.append("Библиотека openpyxl найдена.")
|
| 38 |
except ImportError:
|
| 39 |
+
return "ОШИБКА: Библиотека openpyxl не установлена на сервере!", gr.update(choices=[], value=None)
|
| 40 |
|
| 41 |
all_data = []
|
| 42 |
sheets_log = []
|
|
|
|
| 51 |
cab_col_idx = -1
|
| 52 |
rem_col_idx = -1
|
| 53 |
|
|
|
|
| 54 |
for i in range(min(20, len(df_raw))):
|
| 55 |
row_values = [str(x).lower().strip() for x in df_raw.iloc[i].values]
|
| 56 |
c_idx = -1
|
|
|
|
| 66 |
|
| 67 |
if header_row_index != -1:
|
| 68 |
df = pd.read_excel(excel_path, sheet_name=sheet_name, header=header_row_index, engine='openpyxl')
|
|
|
|
| 69 |
if cab_col_idx < len(df.columns) and rem_col_idx < len(df.columns):
|
| 70 |
df_subset = df.iloc[:, [cab_col_idx, rem_col_idx]]
|
| 71 |
df_subset.columns = ["Cabinet", "Remark"]
|
|
|
|
| 86 |
|
| 87 |
if not all_data:
|
| 88 |
log.append("Не найдены данные ни на одном листе.")
|
| 89 |
+
return "\n".join(log), gr.update(choices=[], value=None)
|
| 90 |
|
| 91 |
self.excel_db = pd.concat(all_data, ignore_index=True)
|
| 92 |
self.cabinet_list = sorted(self.excel_db["Cabinet"].unique().tolist())
|
|
|
|
| 94 |
log.append("Успешно объединили данные.")
|
| 95 |
msg = f"✅ База знаний загружена успешно!\nВсего записей: {len(self.excel_db)}\nОбработаны листы: {', '.join(sheets_log)}"
|
| 96 |
|
| 97 |
+
# ИЗМЕНЕНО: gr.update() вместо gr.Dropdown()
|
| 98 |
+
return msg, gr.update(choices=self.cabinet_list, value=None)
|
| 99 |
|
| 100 |
except Exception as e:
|
| 101 |
log.append(f"КРИТИЧЕСКАЯ ОШИБКА: {str(e)}")
|
| 102 |
import traceback
|
| 103 |
log.append(traceback.format_exc())
|
| 104 |
+
return "\n".join(log), gr.update(choices=[], value=None)
|
| 105 |
|
| 106 |
def extract_text(self, pdf_path):
|
| 107 |
try:
|
|
|
|
| 320 |
paragraphs = task.split('\n')
|
| 321 |
|
| 322 |
if y < 80:
|
| 323 |
+
c.showPage()
|
| 324 |
+
y = height - 50
|
| 325 |
c.setFont(font_name, 10)
|
| 326 |
|
| 327 |
c.rect(50, y - 10, 10, 10)
|
|
|
|
| 339 |
if len(cur_line) + len(w) + 1 <= max_len:
|
| 340 |
cur_line += w + " "
|
| 341 |
else:
|
| 342 |
+
lines.append(cur_line)
|
| 343 |
+
cur_line = w + " "
|
| 344 |
lines.append(cur_line)
|
| 345 |
|
| 346 |
for l in lines:
|
| 347 |
if text_start_y < 40:
|
| 348 |
+
c.showPage()
|
| 349 |
+
text_start_y = height - 50
|
| 350 |
c.setFont(font_name, 10)
|
| 351 |
try:
|
| 352 |
c.drawString(65, text_start_y, l.strip())
|
|
|
|
| 378 |
|
| 379 |
db_in = gr.File(label="Загрузить Excel (.xlsx)", type="filepath")
|
| 380 |
|
| 381 |
+
# ИЗМЕНЕНО: choices=[] вместо choices=None
|
| 382 |
+
manual_cab = gr.Dropdown(
|
| 383 |
+
label="Или выберите шкаф-аналог вручную",
|
| 384 |
+
choices=[],
|
| 385 |
+
interactive=True
|
| 386 |
+
)
|
| 387 |
|
| 388 |
+
db_out = gr.Textbox(label="Статус загрузки", lines=8)
|
| 389 |
|
| 390 |
db_in.upload(checker.load_excel_db, inputs=[db_in], outputs=[db_out, manual_cab])
|
| 391 |
|
|
|
|
| 395 |
btn = gr.Button("Сформировать чек-лист", variant="primary")
|
| 396 |
|
| 397 |
with gr.Row():
|
| 398 |
+
res_txt = gr.Textbox(label="Результат проверки", lines=8)
|
| 399 |
res_pdf = gr.File(label="Скачать PDF чек-лист")
|
| 400 |
|
| 401 |
btn.click(checker.check_files, inputs=[files_in, manual_cab], outputs=[res_txt, res_pdf])
|