```python
from typing import List, Dict

def assign_berths(berths: List[Dict], quota: Dict[str, int], requests: List[Dict]) -> List[str]:
    occupied = {}
    results = []

    for request in requests:
        if request["op"] == "dock":
            boat_id, owner, size = request["boat"], request["owner"], request["size"]
            if boat_id in occupied:
                results.append("rejected:already_docked")
                continue
            if owner in quota and len([b for b in occupied.values() if b["owner"] == owner]) >= quota[owner]:
                results.append("rejected:over_quota")
                continue
            for berth in berths:
                if berth["size"] >= size:
                    occupied[boat_id] = {"id": berth["id"], "owner": owner}
                    results.append(berth["id"])
                    break
            else:
                results.append("rejected:no_berth")
        elif request["op"] == "leave":
            boat_id = request["boat"]
            if boat_id not in occupied:
                results.append("rejected:not_docked")
            else:
                del occupied[boat_id]
                results.append("left")
        else:
            raise ValueError(f"Invalid operation: {request['op']}")

    return results
```