from flask import Flask, jsonify, request, render_template from datetime import datetime import uuid app = Flask(__name__) # In-memory task store (no DB needed — works out of the box) tasks = {} def make_task(title, priority="medium", due_date=None, category="general"): return { "id": str(uuid.uuid4())[:8], "title": title, "priority": priority, # low | medium | high "category": category, "due_date": due_date, "done": False, "created_at": datetime.now().strftime("%Y-%m-%d %H:%M"), } # Seed with sample tasks for t in [ make_task("Design the landing page", "high", "2026-06-25", "work"), make_task("Buy groceries", "low", "2026-06-22", "personal"), make_task("Review pull request #42", "high", "2026-06-23", "work"), make_task("Read Clean Code book", "medium", "2026-06-30", "learning"), make_task("Call the dentist", "medium", "2026-06-24", "personal"), ]: tasks[t["id"]] = t # ── HTML ────────────────────────────────────────────────────────────────────── @app.route("/") def index(): return render_template("index.html") # ── REST API ────────────────────────────────────────────────────────────────── @app.route("/api/tasks", methods=["GET"]) def get_tasks(): filter_done = request.args.get("done") filter_priority = request.args.get("priority") filter_category = request.args.get("category") result = list(tasks.values()) if filter_done is not None: result = [t for t in result if t["done"] == (filter_done == "true")] if filter_priority: result = [t for t in result if t["priority"] == filter_priority] if filter_category: result = [t for t in result if t["category"] == filter_category] # Sort: undone first, then by priority priority_order = {"high": 0, "medium": 1, "low": 2} result.sort(key=lambda t: (t["done"], priority_order.get(t["priority"], 9))) return jsonify({"tasks": result, "total": len(result)}) @app.route("/api/tasks", methods=["POST"]) def create_task(): data = request.get_json() or {} title = data.get("title", "").strip() if not title: return jsonify({"error": "Title is required"}), 400 task = make_task( title=title, priority=data.get("priority", "medium"), due_date=data.get("due_date"), category=data.get("category", "general"), ) tasks[task["id"]] = task return jsonify(task), 201 @app.route("/api/tasks/", methods=["PATCH"]) def update_task(task_id): task = tasks.get(task_id) if not task: return jsonify({"error": "Task not found"}), 404 data = request.get_json() or {} for field in ("title", "priority", "due_date", "category", "done"): if field in data: task[field] = data[field] return jsonify(task) @app.route("/api/tasks/", methods=["DELETE"]) def delete_task(task_id): if task_id not in tasks: return jsonify({"error": "Task not found"}), 404 del tasks[task_id] return jsonify({"deleted": task_id}) @app.route("/api/stats", methods=["GET"]) def stats(): all_tasks = list(tasks.values()) return jsonify({ "total": len(all_tasks), "done": sum(1 for t in all_tasks if t["done"]), "pending": sum(1 for t in all_tasks if not t["done"]), "high_priority": sum(1 for t in all_tasks if t["priority"] == "high" and not t["done"]), }) if __name__ == "__main__": print("\n TaskMaster running → http://127.0.0.1:5000\n") app.run(debug=True)