Spaces:
Running on Zero
Running on Zero
| import os | |
| import json | |
| import logging | |
| from pathlib import Path | |
| from datetime import datetime | |
| from config import THESIS_DIR | |
| class TermWorkspace: | |
| """Manage all files for a single term study.""" | |
| def __init__(self, term: str, category: str): | |
| self.term = term | |
| self.category = category | |
| self.safe = term.replace(" ", "_") | |
| category_name = category # "tadeel" or "jarh" used directly in path | |
| self.base = THESIS_DIR / "01_terms" / category_name / self.safe | |
| self.raw_dir = self.base / "raw" | |
| self.ai_dir = self.base / "ai-output" | |
| self.processed_dir = self.base / "processed" | |
| self.docx_dir = self.base / "docx" | |
| self.logs_dir = self.base / "logs" | |
| self._dirs_created = False | |
| def _ensure_dirs(self): | |
| if self._dirs_created: | |
| return | |
| for d in [ | |
| self.raw_dir, | |
| self.ai_dir, | |
| self.processed_dir, | |
| self.docx_dir, | |
| self.logs_dir, | |
| ]: | |
| d.mkdir(parents=True, exist_ok=True) | |
| self._dirs_created = True | |
| def save_raw_search(self, draft: dict): | |
| self._ensure_dirs() | |
| path = self.raw_dir / "search_results.json" | |
| path.write_text( | |
| json.dumps(draft, ensure_ascii=False, indent=2), encoding="utf-8" | |
| ) | |
| return path | |
| def save_raw_draft_md(self, md_text: str): | |
| self._ensure_dirs() | |
| path = self.raw_dir / "draft.md" | |
| path.write_text(md_text, encoding="utf-8") | |
| return path | |
| def save_research_before_ai(self, content: str): | |
| self._ensure_dirs() | |
| path = self.raw_dir / "research-before-ai.md" | |
| path.write_text(content, encoding="utf-8") | |
| return path | |
| def save_prompt(self, prompt_text: str, section_name: str = "full"): | |
| self._ensure_dirs() | |
| path = self.raw_dir / f"prompt-{section_name}.md" | |
| path.write_text(prompt_text, encoding="utf-8") | |
| return path | |
| def save_ai_section(self, section_num: int, section_name: str, content: str): | |
| self._ensure_dirs() | |
| path = self.ai_dir / f"section_{section_num:02d}_{section_name}.md" | |
| path.write_text(content, encoding="utf-8") | |
| return path | |
| def save_ai_full(self, content: str): | |
| self._ensure_dirs() | |
| path = self.ai_dir / "full_raw.md" | |
| path.write_text(content, encoding="utf-8") | |
| return path | |
| def save_processed(self, content: str, filename: str = "study.md"): | |
| self._ensure_dirs() | |
| path = self.processed_dir / filename | |
| path.write_text(content, encoding="utf-8") | |
| return path | |
| def save_docx(self, content: bytes, filename: str = None): | |
| self._ensure_dirs() | |
| if filename is None: | |
| filename = f"{self.safe}.docx" | |
| path = self.docx_dir / filename | |
| path.write_bytes(content) | |
| return path | |
| def get_log_path(self, log_type: str = "general") -> Path: | |
| return self.logs_dir / f"{log_type}.log" | |
| def save_meta(self, meta: dict): | |
| self._ensure_dirs() | |
| path = self.base / "meta.json" | |
| existing = {} | |
| if path.exists(): | |
| existing = json.loads(path.read_text(encoding="utf-8")) | |
| existing.update(meta) | |
| existing["last_updated"] = datetime.now().isoformat() | |
| path.write_text( | |
| json.dumps(existing, ensure_ascii=False, indent=2), encoding="utf-8" | |
| ) | |
| return path | |
| def load_meta(self) -> dict: | |
| path = self.base / "meta.json" | |
| if path.exists(): | |
| return json.loads(path.read_text(encoding="utf-8")) | |
| return {} | |