Files
agentic-studio/zipit/projekti_clean/prompts/3_coder_main.py.md
2026-04-12 18:48:14 +03:00

8.4 KiB

3 — Coder (coder) — main.py

Malli: qwen-coder

System Prompt

You are an expert Python developer. Write complete, production-ready code.

CRITICAL RULES:
1. Include ALL imports at the top of every file
2. Import from other project files: from models import User, SessionLocal
3. Pydantic schemas use different names than SQLAlchemy models: UserCreate, UserResponse (not User)
4. SQLAlchemy engine: create_engine(url, connect_args={"check_same_thread": False})
5. SessionLocal: sessionmaker(autocommit=False, autoflush=False, bind=engine)
6. FastAPI dependencies: def get_db(): db = SessionLocal(); try: yield db; finally: db.close()
7. Pydantic v2: use model_dump() not dict(), class Config: from_attributes = True
8. All CRUD endpoints: POST (201), GET list, GET by id, PUT, DELETE (204)

NEVER:
- Add explanations or comments like "# Add routes here"
- Leave placeholder code or TODO comments
- Use Flask syntax (app.run) in FastAPI projects
- Forget to import from other project files
- Use requirements.txt or Poetry — always use pyproject.toml with [project] format (PEP 621)
- Use pip install — use uv (e.g. uv run uvicorn main:app --reload)

Syöte

You are an expert Python developer. Write complete, production-ready code.

CRITICAL RULES:
1. Include ALL imports at the top of every file
2. Import from other project files: from models import User, SessionLocal
3. Pydantic schemas use different names than SQLAlchemy models: UserCreate, UserResponse (not User)
4. SQLAlchemy engine: create_engine(url, connect_args={"check_same_thread": False})
5. SessionLocal: sessionmaker(autocommit=False, autoflush=False, bind=engine)
6. FastAPI dependencies: def get_db(): db = SessionLocal(); try: yield db; finally: db.close()
7. Pydantic v2: use model_dump() not dict(), class Config: from_attributes = True
8. All CRUD endpoints: POST (201), GET list, GET by id, PUT, DELETE (204)

NEVER:
- Add explanations or comments like "# Add routes here"
- Leave placeholder code or TODO comments
- Use Flask syntax (app.run) in FastAPI projects
- Forget to import from other project files
- Use requirements.txt or Poetry — always use pyproject.toml with [project] format (PEP 621)
- Use pip install — use uv (e.g. uv run uvicorn main:app --reload)

EXAMPLE of main.py (for a different project, adapt to this one):

from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.orm import Session from models import Base, engine, SessionLocal, Item from schemas import ItemCreate, ItemResponse

Base.metadata.create_all(bind=engine) app = FastAPI()

def get_db(): db = SessionLocal() try: yield db finally: db.close()

@app.post("/items/", response_model=ItemResponse, status_code=201) def create_item(item: ItemCreate, db: Session = Depends(get_db)): db_item = Item(**item.model_dump()) db.add(db_item) db.commit() db.refresh(db_item) return db_item

@app.get("/items/", response_model=list[ItemResponse]) def list_items(db: Session = Depends(get_db)): return db.query(Item).all()

@app.get("/items/{item_id}", response_model=ItemResponse) def get_item(item_id: int, db: Session = Depends(get_db)): item = db.query(Item).filter(Item.id == item_id).first() if not item: raise HTTPException(status_code=404, detail="Not found") return item

@app.put("/items/{item_id}", response_model=ItemResponse) def update_item(item_id: int, item: ItemCreate, db: Session = Depends(get_db)): db_item = db.query(Item).filter(Item.id == item_id).first() if not db_item: raise HTTPException(status_code=404, detail="Not found") for key, value in item.model_dump().items(): setattr(db_item, key, value) db.commit() db.refresh(db_item) return db_item

@app.delete("/items/{item_id}", status_code=204) def delete_item(item_id: int, db: Session = Depends(get_db)): db_item = db.query(Item).filter(Item.id == item_id).first() if not db_item: raise HTTPException(status_code=404, detail="Not found") db.delete(db_item) db.commit()


Already written files in THIS project:
--- models.py ---
from sqlalchemy import create_engine, Column, Integer, String, Date, Enum
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./todo.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class Todo(Base):
    __tablename__ = "todos"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(100), nullable=False)
    description = Column(String(500))
    due_date = Column(Date, nullable=False)
    status = Column(Enum('pending', 'completed'), default='pending')

--- schemas.py ---
from pydantic import BaseModel

class TodoCreate(BaseModel):
    title: str
    description: str | None = None
    due_date: date
    status: str = 'pending'

class TodoResponse(TodoCreate):
    id: int

    class Config:
        from_attributes = True

PROJECT REQUIREMENTS (from product owner):
1. **PROJECT NAME:** Todo-sovellus

2. **GOAL:** A simple task manager for individuals to keep track of their daily tasks and manage them efficiently.

3. **CORE FEATURES:**
   - Create new todos with title, description, due date.
   - Read/View all todos or a single todo by ID.
   - Update existing todos (title, description, status).
   - Delete completed or unnecessary todos.
   - Filter todos by status (e.g., pending, completed).

4. **DATA MODEL:**
   - Todo
     - id (integer, primary key)
     - title (string)
     - description (text)
     - due_date (date)
     - status (enum: 'pending', 'completed')

5. **API ENDPOINTS:**
   - GET /todos: Retrieve all todos.
   - GET /todos/{id}: Retrieve a single todo by ID.
   - POST /todos: Create a new todo.
   - PUT /todos/{id}: Update an existing todo.
   - DELETE /todos/{id}: Delete a todo.

6. **CONSTRAINTS:**
   - Must use SQLite as the database.
   - No authentication required for accessing endpoints.
   - Implement unit tests and integration tests to ensure functionality.

NOW write "main.py" for THIS project: Todo-sovellus FastAPI + SQLite, CRUD-endpointit ja testit
Create the FastAPI app with all CRUD endpoints:
- Import from models.py and schemas.py (use exact class names)
- create_all(bind=engine) at module level
- get_db dependency with yield pattern
- POST (201), GET list, GET by id, PUT, DELETE (204)
- Use response_model for type safety
- Use model_dump() not dict() (Pydantic v2)
Adapt to the project requirements. Import from already written files. Write ONLY the code, no explanations.

Tulos

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from models import Base, engine, SessionLocal, Todo
from schemas import TodoCreate, TodoResponse

Base.metadata.create_all(bind=engine)
app = FastAPI()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/todos/", response_model=TodoResponse, status_code=201)
def create_todo(todo: TodoCreate, db: Session = Depends(get_db)):
    db_todo = Todo(**todo.model_dump())
    db.add(db_todo)
    db.commit()
    db.refresh(db_todo)
    return db_todo

@app.get("/todos/", response_model=list[TodoResponse])
def list_todos(status: str | None = None, db: Session = Depends(get_db)):
    if status:
        query = db.query(Todo).filter_by(status=status)
    else:
        query = db.query(Todo)
    return query.all()

@app.get("/todos/{todo_id}", response_model=TodoResponse)
def get_todo(todo_id: int, db: Session = Depends(get_db)):
    todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if not todo:
        raise HTTPException(status_code=404, detail="Not found")
    return todo

@app.put("/todos/{todo_id}", response_model=TodoResponse)
def update_todo(todo_id: int, todo: TodoCreate, db: Session = Depends(get_db)):
    db_todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if not db_todo:
        raise HTTPException(status_code=404, detail="Not found")
    for key, value in todo.model_dump().items():
        setattr(db_todo, key, value)
    db.commit()
    db.refresh(db_todo)
    return db_todo

@app.delete("/todos/{todo_id}", status_code=204)
def delete_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if not db_todo:
        raise HTTPException(status_code=404, detail="Not found")
    db.delete(db_todo)
    db.commit()