from uuid import UUID from pydantic import BaseModel class BulkDownloadRequest(BaseModel): """A request to assemble a Download Package (ADR-0060). The front end creates the app-owned Task first and writes the **selection config** into ``task.inputs`` (a JSON object of ``{project_codes?: str[], landlord_property_ids?: str[], portfolio_id?: int}`` — so a large selection never travels in an HTTP body), then passes only the ``task_id`` here. The backend reads the selection from ``task.inputs`` and resolves it to the distinct ``landlord_property_id`` set (the key ``uploaded_files`` is matched on): the union of every property in the named HubSpot ``project_codes`` (from ``hubspot_deal_data``) and the hand-picked ``landlord_property_ids``. At least one of the two must be given; ``portfolio_id`` is optional and used only to name the package. """ task_id: UUID