Загрузка данных
# -*- coding: utf-8 -*-
"""
Рабочий контроллер для создания проектов.
"""
import os
import sqlite3
from pathlib import Path
from modules.data.project_database import ProjectDatabase
from modules.data.database_module import get_db_connection
class ProjectCreateController:
DB_DIRECTORY = "project_dbs"
def __init__(self, manager: ProjectDatabase):
self.db = db
def create_project(self, project_data: dict) -> bool:
human_name = project_data.get("name")
project_code = project_data.get("code")
db_path = Path(self.DB_DIRECTORY) / f"{project_code}.db"
try:
# Проверка существования после паузы
time.sleep(0.1) # Минимальная задержка
if db_path.exists():
from tkinter import messagebox
messagebox.showerror(
"Файл уже существует",
("Проект с таким кодом уже создан физически.")
)
return False
# Создаем объект Project
project = Project(name=human_name)
project.id = project_code
# Сохранение через менеджер (создает пустой .db)
success = self.manager.add_project(project)
if not success:
return False
# Инициализация структуры таблиц внутри новой БД
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS project_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_code TEXT UNIQUE NOT NULL,
created_at TEXT NOT NULL
)
""")
conn.commit()
conn.close()
print(f"[SUCCESS] Проект '{human_name}' создан.")
return True
except Exception as e:
print(f"[FATAL] Create failed: {e}")
if db_path.exists():
try:
os.remove(db_path)
except OSError:
pass
from tkinter import messagebox
messagebox.showerror("Ошибка", f"Не удалось записать данные:\n{e}")
return False
def create_project(self, data: dict) -> bool:
"""
Создает запись о новом проекте в базе данных.
Возвращает True при успехе, False при ошибке.
"""
name = data.get("name")
code = data.get("code")
if not name or not code:
return False
try:
# Используем наш менеджер соединений из database_module
with get_db_connection() as conn:
cursor = conn.cursor()
# Проверяем, занят ли код проекта (если есть таблица projects)
# Если таблицы проектов еще нет, ее нужно создать в init_database()
cursor.execute(
"INSERT INTO projects (name, code) VALUES (?, ?)",
(name, code)
)
conn.commit()
messagebox.showinfo("Успех", f"Проект '{name}' успешно создан.")
return True
except sqlite3.IntegrityError:
# Ошибка возникает, если UNIQUE-ограничение нарушено (код уже существует)
messagebox.showerror("Ошибка", f"Проект с кодом '{code}' уже существует!")
return False
except Exception as e:
messagebox.showerror("Критическая ошибка", f"Не удалось сохранить проект: {e}")
return False