Add calendar implementation: models, storage, CLI

This commit is contained in:
Дедов Егор Сергеевич
2026-05-18 14:51:05 +03:00
parent 2a35a9ce78
commit 816c9f1cda
6 changed files with 228 additions and 0 deletions

141
calendar_cli.py Normal file
View File

@@ -0,0 +1,141 @@
#!/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()