1. app/models.py
class Task:
def __init__(self, id, title, completed=False):
self.id = id
self.title = title
self.completed = completed
def __str__(self):
status = "✓" if self.completed else "✗"
return f"[{status}] ({self.id}) {self.title}"
class Event:
def __init__(self, id, name, event_date):
self.id = id
self.name = name
self.event_date = event_date
def __str__(self):
return f"({self.id}) {self.name} - {self.event_date}"
2. app/db.py
import sqlite3
DB_PATH = "database/app.db"
def connect_db():
return sqlite3.connect(DB_PATH)
def init_db():
conn = connect_db()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
completed INTEGER NOT NULL DEFAULT 0
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
event_date TEXT NOT NULL
)
""")
conn.commit()
conn.close()
3. app/utils.py
from datetime import datetime
def parse_date(date_str):
return datetime.strptime(date_str, "%Y-%m-%d").date()
def days_until(date_str):
event_date = parse_date(date_str)
today = datetime.now().date()
return (event_date - today).days
4. app/task_service.py
from app.db import connect_db
from app.models import Task
def add_task(title):
conn = connect_db()
cursor = conn.cursor()
cursor.execute("INSERT INTO tasks (title, completed) VALUES (?, ?)", (title, 0))
conn.commit()
conn.close()
def get_tasks():
conn = connect_db()
cursor = conn.cursor()
cursor.execute("SELECT id, title, completed FROM tasks")
rows = cursor.fetchall()
conn.close()
return [Task(id=row[0], title=row[1], completed=bool(row[2])) for row in rows]
def complete_task(task_id):
conn = connect_db()
cursor = conn.cursor()
cursor.execute("UPDATE tasks SET completed = 1 WHERE id = ?", (task_id,))
conn.commit()
affected = cursor.rowcount
conn.close()
return affected > 0
5. app/event_service.py
from app.db import connect_db
from app.models import Event
def add_event(name, event_date):
conn = connect_db()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO events (name, event_date) VALUES (?, ?)",
(name, event_date)
)
conn.commit()
conn.close()
def get_events():
conn = connect_db()
cursor = conn.cursor()
cursor.execute("SELECT id, name, event_date FROM events")
rows = cursor.fetchall()
conn.close()
return [Event(id=row[0], name=row[1], event_date=row[2]) for row in rows]
6. app/__init__.py
# Package initializer
7. main.py
from app.db import init_db
from app.task_service import add_task, get_tasks, complete_task
from app.event_service import add_event, get_events
from app.utils import parse_date, days_until
def show_menu():
print("\n=== Personal Task & Event Manager ===")
print("1. Add task")
print("2. View tasks")
print("3. Complete task")
print("4. Add event")
print("5. View events")
print("6. Exit")
def handle_add_task():
title = input("Enter task title: ").strip()
if not title:
print("Task title cannot be empty.")
return
add_task(title)
print("Task added successfully.")
def handle_view_tasks():
tasks = get_tasks()
if not tasks:
print("No tasks found.")
return
print("\n--- Tasks ---")
for task in tasks:
print(task)
def handle_complete_task():
try:
task_id = int(input("Enter task ID to mark as completed: "))
if complete_task(task_id):
print("Task marked as completed.")
else:
print("Task not found.")
except ValueError:
print("Invalid task ID.")
def handle_add_event():
name = input("Enter event name: ").strip()
date_str = input("Enter event date (YYYY-MM-DD): ").strip()
if not name:
print("Event name cannot be empty.")
return
try:
parse_date(date_str)
add_event(name, date_str)
print("Event added successfully.")
except ValueError:
print("Invalid date format. Please use YYYY-MM-DD.")
def handle_view_events():
events = get_events()
if not events:
print("No events found.")
return
print("\n--- Events ---")
for event in events:
remaining = days_until(event.event_date)
print(event)
if remaining > 0:
print(f" Days remaining: {remaining}")
elif remaining == 0:
print(" This event is today!")
else:
print(" This event has already passed.")
def main():
init_db()
while True:
show_menu()
choice = input("Choose an option: ").strip()
if choice == "1":
handle_add_task()
elif choice == "2":
handle_view_tasks()
elif choice == "3":
handle_complete_task()
elif choice == "4":
handle_add_event()
elif choice == "5":
handle_view_events()
elif choice == "6":
print("Goodbye.")
break
else:
print("Invalid option. Please choose from 1 to 6.")
if __name__ == "__main__":
main()