From a788e9e23d9e6ccfc635d89e2b11c532b7aaff17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Tue, 23 Jun 2026 17:00:49 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.158:=20fix=20r.OK=E2=86=92r.ok=20(Python?= =?UTF-8?q?=20lowercase)=20+=20add=20/convert-doc=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/convert_server.py | 42 +++++++++++++++++++++++++++++++++++++++- index.cfm | 6 +++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/deploy/convert_server.py b/deploy/convert_server.py index ec92fa4..b5c9e0d 100755 --- a/deploy/convert_server.py +++ b/deploy/convert_server.py @@ -3,7 +3,7 @@ from http.server import HTTPServer, BaseHTTPRequestHandler from socketserver import ThreadingMixIn from urllib.parse import urlparse, parse_qs -import json, re +import json, re, os # ── DB auto-seed ────────────────────────────────────────────────────────── from db import prompts as db_prompts @@ -54,6 +54,8 @@ class Handler(BaseHTTPRequestHandler): self._handle_unzip() elif self.path == "/llm-ops": self._handle_llm_ops() + elif self.path == "/convert-doc": + self._handle_convert_doc() else: self.send_error(404) @@ -136,6 +138,44 @@ class Handler(BaseHTTPRequestHandler): except Exception as e: self._json({"ok": False, "error": str(e)}, 500) + # ── /convert-doc ────────────────────────────────────────────────────── + + def _handle_convert_doc(self): + """DOC → DOCX через LibreOffice.""" + import subprocess, tempfile + length = int(self.headers.get("Content-Length", 0)) + data = self.rfile.read(length) + + with tempfile.NamedTemporaryFile(suffix=".doc", delete=False) as f: + f.write(data) + doc_path = f.name + + tmpdir = tempfile.mkdtemp() + try: + subprocess.run( + ["libreoffice", "--headless", "--convert-to", "docx", "--outdir", tmpdir, doc_path], + timeout=30, capture_output=True, + ) + docx_files = [x for x in os.listdir(tmpdir) if x.endswith(".docx")] + if docx_files: + with open(os.path.join(tmpdir, docx_files[0]), "rb") as f: + result = f.read() + self.send_response(200) + self.send_header("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") + self.send_header("Content-Length", str(len(result))) + self._send_cors() + self.end_headers() + self.wfile.write(result) + else: + self.send_error(500, "conversion produced no output") + except Exception as e: + self.send_error(500, str(e)) + finally: + os.unlink(doc_path) + for x in os.listdir(tmpdir): + os.unlink(os.path.join(tmpdir, x)) + os.rmdir(tmpdir) + # ── /llm-ops (debug) ────────────────────────────────────────────────── def _handle_llm_ops(self): diff --git a/index.cfm b/index.cfm index e228184..a4e4d8f 100644 --- a/index.cfm +++ b/index.cfm @@ -75,7 +75,7 @@
Nubes - Сверка договоров — LLM AI-driven Event Sourcing v1.0.157 — Lucee + Сверка договоров — LLM AI-driven Event Sourcing v1.0.158 — Lucee
@@ -435,8 +435,8 @@ function uploadFile(file, onProgress) { xhr.onload = function() { try { var r = JSON.parse(xhr.responseText); - if (r.OK) resolve(r); - else reject(new Error(r.ERROR || 'Неизвестная ошибка')); + if (r.ok) resolve(r); + else reject(new Error(r.error || 'Неизвестная ошибка')); } catch(e) { reject(new Error('Некорректный ответ')); } }; xhr.onerror = function() { reject(new Error('Сеть')); };