Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion src/datacollective/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@
from enum import Enum
from typing import Any, ClassVar

from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
from pydantic import (
BaseModel,
ConfigDict,
Field,
computed_field,
field_validator,
model_validator,
)


class UploadPart(BaseModel):
Expand Down Expand Up @@ -284,6 +291,13 @@ def _validate_pricing(self) -> DatasetSubmission:
)
return self

@computed_field( # type: ignore[prop-decorator]
description="Currency for `basePriceCents`. Always `usd`, the only currency the platform currently supports."
)
@property
def currency(self) -> str | None:
return "usd" if self.isPaid else None


class DatasetDetails(Dataset):
"""
Expand Down Expand Up @@ -377,6 +391,7 @@ def get(self, key: str, default: Any = None) -> Any:
"exclusivityOptOut",
"isPaid",
"basePriceCents",
"currency",
}
SUBMIT_FIELDS = {"agreeToSubmit"}

Expand Down
15 changes: 15 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,21 @@ def test_price_requires_paid_dataset() -> None:
DatasetSubmission(isPaid=False, basePriceCents=25_000)


def test_currency_is_set_only_when_paid() -> None:
free = DatasetSubmission(name="Free")
assert free.currency is None
assert "currency" not in free.model_dump(exclude_none=True)

paid = DatasetSubmission(isPaid=True, basePriceCents=25_000)
assert paid.currency == "usd"
assert paid.model_dump(mode="json", exclude_none=True)["currency"] == "usd"


def test_currency_is_not_a_settable_field() -> None:
with pytest.raises(ValidationError):
DatasetSubmission(isPaid=True, basePriceCents=25_000, currency="eur")


def test_dataset_details_requires_id() -> None:
with pytest.raises(ValidationError):
DatasetDetails.model_validate({"filename": "dataset.tar.gz"})
Expand Down
Loading