Files
personal-calendar/calendar_cli.py
Дедов Егор Сергеевич 816c9f1cda Add calendar implementation: models, storage, CLI
2026-05-18 14:51:05 +03:00

141 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()