Загрузка данных
# -*- coding: utf-8 -*-
# project_create.py
import datetime
import os
import tkinter as tk
from tkinter import Toplevel, messagebox, ttk
from gui.project_manager import Project, ProjectManager
from modules.project_database import ProjectDatabase
class CreateProjectWindow:
"""
Диалоговое окно для создания нового проекта.
"""
MIN_CODE_LENGTH = 3
MAX_NAME_LENGTH = 100
def __init__(self, manager: ProjectManager):
"""
:param manager: Экземпляр ProjectManager для добавления проекта.
"""
self.manager = manager
self.window = Toplevel()
self.window.title("Создание нового проекта")
self.window.geometry("450x300")
self.window.resizable(False, False)
# Главный фрейм с сеткой для аккуратного размещения
main_frame = ttk.Frame(self.window, padding="10")
main_frame.pack(fill="both", expand=True)
main_frame.columnconfigure(1, weight=1) # Второй столбец растягивается
# --- 1. Поля ввода ---
ttk.Label(main_frame, text="Название проекта:").grid(
row=0, column=0, padx=5, pady=5, sticky="e"
)
self.name_entry = ttk.Entry(main_frame, width=40)
self.name_entry.grid(row=0, column=1, padx=5, pady=5, sticky="we")
ttk.Label(main_frame, text="Код проекта:").grid(
row=1, column=0, padx=5, pady=5, sticky="e"
)
self.code_entry = ttk.Entry(main_frame, width=40)
self.code_entry.grid(row=1, column=1, padx=5, pady=5, sticky="we")
ttk.Label(main_frame, text="Описание:").grid(
row=2, column=0, padx=5, pady=5, sticky="e"
)
self.desc_entry = ttk.Entry(main_frame, width=40)
self.desc_entry.grid(row=2, column=1, padx=5, pady=5, sticky="we")
ttk.Label(main_frame, text="Дата открытия:").grid(
row=3, column=0, padx=5, pady=5, sticky="e"
)
self.date_entry = ttk.Entry(main_frame, width=15)
default_date = datetime.datetime.now().strftime("%Y-%m-%d")
self.date_entry.insert(0, default_date)
self.date_entry.grid(row=3, column=1, padx=5, pady=5)
ttk.Label(main_frame, text="Ответственный:").grid(
row=4, column=0, padx=5, pady=5, sticky="e"
)
self.resp_entry = ttk.Entry(main_frame, width=40)
self.resp_entry.grid(row=4, column=1, padx=5, pady=5, sticky="we")
# --- 2. Кнопки действий ---
# Фрейм для выравнивания кнопок справа внизу окна
button_frame = ttk.Frame(self.window)
button_frame.pack(pady=(20, 10), fill="x")
# Кнопка "Отмена"
ttk.Button(button_frame, text="Отмена", command=self.window.destroy).pack(
side="right", padx=(0, 10)
)
# Кнопка "Создать"
ttk.Button(button_frame, text="Создать", command=self.create_project).pack(
side="right"
)
def create_project(self):
"""Обрабатывает нажатие кнопки 'Создать'."""
# Получаем данные из формы
human_name = self.name_entry.get() # Название проекта
project_code = self.code_entry.get() # Код проекта
# Проверка на пустые поля
if not human_name or not project_code:
messagebox.showerror("Ошибка", "Введите название и код проекта!")
return
try:
# --- 1. Проверка существования базы данных (ПОДАВЛЕНИЕ ВЫВОДА) ---
# Создаем объект БД внутри блока с перенаправлением stdout,
# чтобы скрыть служебные сообщения о создании папки и подключении.
import sys
import os
# Сохраняем стандартный вывод
old_stdout = sys.stdout
# Перенаправляем вывод в "пустоту"
sys.stdout = open(os.devnull, "w")
# Создаем объект и сразу пытаемся подключиться.
# Все print() внутри ProjectDatabase.__init__ и .connect() будут скрыты.
project_db = ProjectDatabase(project_code)
is_db_new = not os.path.exists(project_db.db_path) # Флаг: новая ли это БД?
conn = project_db.connect()
# Возвращаем стандартный вывод
sys.stdout = old_stdout
# Если база уже существует, показываем ошибку
if not is_db_new:
project_db.close() # Закрываем соединение перед возвратом
messagebox.showerror(
"Ошибка", f"База данных для кода '{project_code}' уже существует!"
)
return
# --- 2. Создание объекта Project и заполнение данных ---
project = Project(name=human_name)
project.id = project_code # Задаем ID (код проекта)
# Заполняем остальные поля из формы
project.description = self.desc_entry.get()
project.responsible = self.resp_entry.get()
project.date_opened = self.date_entry.get()
# --- 3. Сохранение проекта через менеджер ---
success = self.manager.add_project(project)
if success:
messagebox.showinfo("Успех", f"Проект '{human_name}' успешно создан!")
# Создаем таблицы в новой базе данных, если проект был добавлен
project_db.create_tables()
else:
messagebox.showerror("Ошибка", "Не удалось создать проект.")
except Exception as e:
messagebox.showerror(
"Критическая ошибка", f"Не удалось создать проект:\n{str(e)}"
)
finally:
self.window.destroy()