141 lines
4.2 KiB
Python
141 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Personal Calendar - CLI приложение для управления событиями
|
||
"""
|
||
|
||
import sys
|
||
from datetime import datetime
|
||
from models import Event
|
||
from storage import load_events, add_event, remove_event, get_events_by_date
|
||
|
||
try:
|
||
from prettytable import PrettyTable
|
||
except ImportError:
|
||
print("Ошибка: установите prettytable: pip install prettytable")
|
||
sys.exit(1)
|
||
|
||
|
||
def show_menu():
|
||
"""Показывает главное меню"""
|
||
print("\n" + "=" * 40)
|
||
print(" 📅 PERSONAL CALENDAR")
|
||
print("=" * 40)
|
||
print("1. Добавить событие")
|
||
print("2. Показать все события")
|
||
print("3. Показать события на дату")
|
||
print("4. Удалить событие")
|
||
print("5. Выйти")
|
||
print("=" * 40)
|
||
|
||
|
||
def add_event_interactive():
|
||
"""Интерактивное добавление события"""
|
||
print("\n--- Добавление события ---")
|
||
title = input("Название: ").strip()
|
||
if not title:
|
||
print("Ошибка: название не может быть пустым")
|
||
return
|
||
|
||
date = input("Дата (ГГГГ-ММ-ДД): ").strip()
|
||
try:
|
||
datetime.strptime(date, "%Y-%m-%d")
|
||
except ValueError:
|
||
print("Ошибка: неверный формат даты")
|
||
return
|
||
|
||
time = input("Время (ЧЧ:ММ) - необязательно: ").strip()
|
||
description = input("Описание: ").strip()
|
||
|
||
event = Event(title, date, time, description)
|
||
add_event(event)
|
||
print(f"✅ Событие добавлено: {event}")
|
||
|
||
|
||
def show_all_events():
|
||
"""Показывает все события в виде таблицы"""
|
||
events = load_events()
|
||
|
||
if not events:
|
||
print("\n📭 Нет сохранённых событий")
|
||
return
|
||
|
||
table = PrettyTable()
|
||
table.field_names = ["№", "Дата", "Время", "Название", "Описание"]
|
||
table.align = "l"
|
||
|
||
for i, event in enumerate(events, 1):
|
||
table.add_row([
|
||
i,
|
||
event.date,
|
||
event.time if event.time else "-",
|
||
event.title[:30],
|
||
event.description[:40] if event.description else "-"
|
||
])
|
||
|
||
print("\n" + str(table))
|
||
|
||
|
||
def show_events_by_date():
|
||
"""Показывает события на конкретную дату"""
|
||
date = input("\nВведите дату (ГГГГ-ММ-ДД): ").strip()
|
||
|
||
try:
|
||
datetime.strptime(date, "%Y-%m-%d")
|
||
except ValueError:
|
||
print("Ошибка: неверный формат даты")
|
||
return
|
||
|
||
events = get_events_by_date(date)
|
||
|
||
if not events:
|
||
print(f"\n📭 Нет событий на {date}")
|
||
return
|
||
|
||
print(f"\n📅 События на {date}:")
|
||
for i, event in enumerate(events, 1):
|
||
print(f" {i}. {event}")
|
||
|
||
|
||
def remove_event_interactive():
|
||
"""Интерактивное удаление события"""
|
||
show_all_events()
|
||
events = load_events()
|
||
|
||
if not events:
|
||
return
|
||
|
||
try:
|
||
index = int(input("\nВведите номер события для удаления: ")) - 1
|
||
if remove_event(index):
|
||
print("✅ Событие удалено")
|
||
else:
|
||
print("❌ Неверный номер")
|
||
except ValueError:
|
||
print("Ошибка: введите число")
|
||
|
||
|
||
def main():
|
||
"""Основная функция"""
|
||
print("Добро пожаловать в Personal Calendar!")
|
||
|
||
while True:
|
||
show_menu()
|
||
choice = input("\nВыберите действие (1-5): ").strip()
|
||
|
||
if choice == "1":
|
||
add_event_interactive()
|
||
elif choice == "2":
|
||
show_all_events()
|
||
elif choice == "3":
|
||
show_events_by_date()
|
||
elif choice == "4":
|
||
remove_event_interactive()
|
||
elif choice == "5":
|
||
print("\n👋 До свидания!")
|
||
break
|
||
else:
|
||
print("❌ Неверный выбор. Попробуйте снова.")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |