Skip to content

Schemas

All response models are frozen Pydantic v2 models based on ForecastModel, which configures extra="allow", populate_by_name=True, str_strip_whitespace=True, and frozen=True. The extra="allow" setting means any additional fields returned by the API are accessible as attributes even if they aren't explicitly declared.

Base model

ForecastModel

Bases: BaseModel

model_config class-attribute instance-attribute

model_config = ConfigDict(
    extra="allow",
    populate_by_name=True,
    str_strip_whitespace=True,
    frozen=True,
)

Resources

Assignment

Bases: ForecastModel

id instance-attribute

id: int

start_date instance-attribute

start_date: date

end_date instance-attribute

end_date: date

allocation class-attribute instance-attribute

allocation: int | None = None

notes class-attribute instance-attribute

notes: str | None = None

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

project_id class-attribute instance-attribute

project_id: int | None = None

person_id class-attribute instance-attribute

person_id: int | None = None

placeholder_id class-attribute instance-attribute

placeholder_id: int | None = None

repeated_assignment_set_id class-attribute instance-attribute

repeated_assignment_set_id: int | None = None

harvest_project_task_id class-attribute instance-attribute

harvest_project_task_id: int | None = None

active_on_days_off class-attribute instance-attribute

active_on_days_off: bool = False

Client

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

harvest_id class-attribute instance-attribute

harvest_id: int | None = None

archived class-attribute instance-attribute

archived: bool = False

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

Milestone

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

date instance-attribute

date: date

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

project_id class-attribute instance-attribute

project_id: int | None = None

Person

Bases: ForecastModel

id instance-attribute

id: int

first_name instance-attribute

first_name: str

last_name instance-attribute

last_name: str

email class-attribute instance-attribute

email: str | None = None

login class-attribute instance-attribute

login: str | None = None

admin class-attribute instance-attribute

admin: bool = False

archived class-attribute instance-attribute

archived: bool = False

subscribed class-attribute instance-attribute

subscribed: bool = False

avatar_url class-attribute instance-attribute

avatar_url: str | None = None

teams class-attribute instance-attribute

teams: list[str] = Field(default_factory=list[str])

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

harvest_user_id class-attribute instance-attribute

harvest_user_id: int | None = None

weekly_capacity class-attribute instance-attribute

weekly_capacity: int | None = None

working_days class-attribute instance-attribute

working_days: WorkingDays | None = None

color_blind class-attribute instance-attribute

color_blind: bool = False

roles class-attribute instance-attribute

roles: list[str] = Field(default_factory=list[str])

invitation_code_id class-attribute instance-attribute

invitation_code_id: int | None = None

personal_feed_token_id class-attribute instance-attribute

personal_feed_token_id: int | None = None

Placeholder

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

archived class-attribute instance-attribute

archived: bool = False

teams class-attribute instance-attribute

teams: list[str] = Field(default_factory=list[str])

roles class-attribute instance-attribute

roles: list[str] = Field(default_factory=list[str])

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

Project

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

color class-attribute instance-attribute

color: str | None = None

code class-attribute instance-attribute

code: str | None = None

notes class-attribute instance-attribute

notes: str | None = None

start_date class-attribute instance-attribute

start_date: date | None = None

end_date class-attribute instance-attribute

end_date: date | None = None

harvest_id class-attribute instance-attribute

harvest_id: int | None = None

archived class-attribute instance-attribute

archived: bool = False

budget_by class-attribute instance-attribute

budget_by: str | None = None

budget_is_monthly class-attribute instance-attribute

budget_is_monthly: bool = False

updated_at instance-attribute

updated_at: datetime

updated_by_id class-attribute instance-attribute

updated_by_id: int | None = None

client_id class-attribute instance-attribute

client_id: int | None = None

tags class-attribute instance-attribute

tags: list[str] = Field(default_factory=list[str])

Role

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

placeholder_ids class-attribute instance-attribute

placeholder_ids: list[int] = Field(
    default_factory=list[int]
)

person_ids class-attribute instance-attribute

person_ids: list[int] = Field(default_factory=list[int])

harvest_role_id class-attribute instance-attribute

harvest_role_id: int | None = None

RepeatedAssignmentSet

Bases: ForecastModel

id instance-attribute

id: int

first_start_date class-attribute instance-attribute

first_start_date: date | None = None

last_end_date class-attribute instance-attribute

last_end_date: date | None = None

assignment_ids class-attribute instance-attribute

assignment_ids: list[int] = Field(default_factory=list[int])

Assignment filter and request

AssignmentFilter dataclass

AssignmentFilter(
    project_id: int | None = None,
    person_id: int | None = None,
    start_date: date | None = None,
    end_date: date | None = None,
    repeated_assignment_set_id: int | None = None,
    state: str | None = None,
)

project_id class-attribute instance-attribute

project_id: int | None = None

person_id class-attribute instance-attribute

person_id: int | None = None

start_date class-attribute instance-attribute

start_date: date | None = None

end_date class-attribute instance-attribute

end_date: date | None = None

repeated_assignment_set_id class-attribute instance-attribute

repeated_assignment_set_id: int | None = None

state class-attribute instance-attribute

state: str | None = None

to_params

to_params() -> dict[str, str]
Source code in src/harvest_forecast/schemas.py
def to_params(self) -> dict[str, str]:
    params: dict[str, str] = {}
    for f in fields(self):
        value = getattr(self, f.name)
        if value is None:
            continue
        if isinstance(value, date):
            params[f.name] = value.isoformat()
        else:
            params[f.name] = str(value)
    return params

AssignmentRequest dataclass

AssignmentRequest(
    start_date: date,
    end_date: date,
    project_id: int,
    person_id: int,
    allocation: int | None = None,
    notes: str | None = None,
    placeholder_id: int | None = None,
    repeated_assignment_set_id: int | None = None,
    active_on_days_off: bool = False,
    harvest_project_task_id: int | None = None,
)

start_date instance-attribute

start_date: date

end_date instance-attribute

end_date: date

project_id instance-attribute

project_id: int

person_id instance-attribute

person_id: int

allocation class-attribute instance-attribute

allocation: int | None = None

notes class-attribute instance-attribute

notes: str | None = None

placeholder_id class-attribute instance-attribute

placeholder_id: int | None = None

repeated_assignment_set_id class-attribute instance-attribute

repeated_assignment_set_id: int | None = None

active_on_days_off class-attribute instance-attribute

active_on_days_off: bool = False

harvest_project_task_id class-attribute instance-attribute

harvest_project_task_id: int | None = None

to_payload

to_payload() -> dict[str, Any]
Source code in src/harvest_forecast/schemas.py
def to_payload(self) -> dict[str, Any]:
    payload: dict[str, Any] = {
        "start_date": self.start_date.isoformat(),
        "end_date": self.end_date.isoformat(),
        "project_id": self.project_id,
        "person_id": self.person_id,
        "active_on_days_off": self.active_on_days_off,
    }
    if self.allocation is not None:
        payload["allocation"] = self.allocation
    if self.notes is not None:
        payload["notes"] = self.notes
    if self.placeholder_id is not None:
        payload["placeholder_id"] = self.placeholder_id
    if self.repeated_assignment_set_id is not None:
        payload["repeated_assignment_set_id"] = self.repeated_assignment_set_id
    if self.harvest_project_task_id is not None:
        payload["harvest_project_task_id"] = self.harvest_project_task_id
    return {"assignment": payload}

Meta

CurrentUser

Bases: ForecastModel

id instance-attribute

id: int

account_ids class-attribute instance-attribute

account_ids: list[int] = Field(default_factory=list[int])

identity_user_id class-attribute instance-attribute

identity_user_id: int | None = None

Account

Bases: ForecastModel

id instance-attribute

id: int

name instance-attribute

name: str

weekly_capacity class-attribute instance-attribute

weekly_capacity: int | None = None

color_labels class-attribute instance-attribute

color_labels: list[ColorLabel] = Field(
    default_factory=list[ColorLabel]
)

harvest_subdomain class-attribute instance-attribute

harvest_subdomain: str | None = None
harvest_link: str | None = None

saml_sign_in_required class-attribute instance-attribute

saml_sign_in_required: bool = False

harvest_name class-attribute instance-attribute

harvest_name: str | None = None

weekends_enabled class-attribute instance-attribute

weekends_enabled: bool = False

created_at class-attribute instance-attribute

created_at: datetime | None = None

creator_first_name class-attribute instance-attribute

creator_first_name: str | None = None

creator_last_name class-attribute instance-attribute

creator_last_name: str | None = None

billing_status class-attribute instance-attribute

billing_status: str | None = None

gdpr class-attribute instance-attribute

gdpr: bool = False

ColorLabel

Bases: ForecastModel

name instance-attribute

name: str

label instance-attribute

label: str

WorkingDays

Bases: ForecastModel

monday class-attribute instance-attribute

monday: bool = False

tuesday class-attribute instance-attribute

tuesday: bool = False

wednesday class-attribute instance-attribute

wednesday: bool = False

thursday class-attribute instance-attribute

thursday: bool = False

friday class-attribute instance-attribute

friday: bool = False

saturday class-attribute instance-attribute

saturday: bool = False

sunday class-attribute instance-attribute

sunday: bool = False

UserConnection

Bases: ForecastModel

id instance-attribute

id: int

person_id class-attribute instance-attribute

person_id: int | None = None

last_active_at class-attribute instance-attribute

last_active_at: datetime | None = None

Subscription

Subscription

Bases: ForecastModel

id instance-attribute

id: int

interval_unit_amounts class-attribute instance-attribute

interval_unit_amounts: (
    SubscriptionIntervalUnitAmounts | None
) = None

next_billing_date class-attribute instance-attribute

next_billing_date: str | None = None

days_until_next_billing_date class-attribute instance-attribute

days_until_next_billing_date: int | None = None

amount class-attribute instance-attribute

amount: int | None = None

default_deactivation_at class-attribute instance-attribute

default_deactivation_at: datetime | None = None

receipt_recipient class-attribute instance-attribute

receipt_recipient: str | None = None

status class-attribute instance-attribute

status: str | None = None

purchased_people class-attribute instance-attribute

purchased_people: int | None = None

interval class-attribute instance-attribute

interval: str | None = None

discounts class-attribute instance-attribute

discounts: SubscriptionDiscounts | None = None

placeholder_limit class-attribute instance-attribute

placeholder_limit: int | None = None

invoiced class-attribute instance-attribute

invoiced: bool = False

days_until_due class-attribute instance-attribute

days_until_due: int | None = None

balance class-attribute instance-attribute

balance: int | None = None

past_due_balance class-attribute instance-attribute

past_due_balance: int | None = None

sales_tax_exempt class-attribute instance-attribute

sales_tax_exempt: bool = False

sales_tax_percentage class-attribute instance-attribute

sales_tax_percentage: float | None = None

converted_at class-attribute instance-attribute

converted_at: datetime | None = None

card class-attribute instance-attribute

card: SubscriptionCard | None = None

address class-attribute instance-attribute

address: SubscriptionAddress | None = None

SubscriptionAddress

Bases: ForecastModel

line_1 class-attribute instance-attribute

line_1: str | None = None

line_2 class-attribute instance-attribute

line_2: str | None = None

city class-attribute instance-attribute

city: str | None = None

state class-attribute instance-attribute

state: str | None = None

postal_code class-attribute instance-attribute

postal_code: str | None = None

country class-attribute instance-attribute

country: str | None = None

SubscriptionCard

Bases: ForecastModel

brand class-attribute instance-attribute

brand: str | None = None

last_four class-attribute instance-attribute

last_four: str | None = None

expiry_month class-attribute instance-attribute

expiry_month: int | None = None

expiry_year class-attribute instance-attribute

expiry_year: int | None = None

SubscriptionDiscounts

Bases: ForecastModel

monthly_percentage class-attribute instance-attribute

monthly_percentage: float = 0.0

yearly_percentage class-attribute instance-attribute

yearly_percentage: float = 0.0

SubscriptionIntervalUnitAmounts

Bases: ForecastModel

monthly class-attribute instance-attribute

monthly: int = 0

yearly class-attribute instance-attribute

yearly: int = 0

Aggregates

RemainingBudgetedHoursItem

Bases: ForecastModel

project_id instance-attribute

project_id: int

budget_by class-attribute instance-attribute

budget_by: str | None = None

budget_is_monthly class-attribute instance-attribute

budget_is_monthly: bool = False

hours class-attribute instance-attribute

hours: float | None = None

response_code class-attribute instance-attribute

response_code: int | None = None

FutureScheduledHoursItem

Bases: ForecastModel

project_id class-attribute instance-attribute

project_id: int | None = None

person_id class-attribute instance-attribute

person_id: int | None = None

placeholder_id class-attribute instance-attribute

placeholder_id: int | None = None

allocation class-attribute instance-attribute

allocation: float | None = None

ProjectHeatmapItem

Bases: ForecastModel

start_date class-attribute instance-attribute

start_date: str | None = None

end_date class-attribute instance-attribute

end_date: str | None = None

PersonHeatmapItem

Bases: ForecastModel

start_date class-attribute instance-attribute

start_date: str | None = None

end_date class-attribute instance-attribute

end_date: str | None = None

daily_allocation class-attribute instance-attribute

daily_allocation: int | None = None

daily_time_off class-attribute instance-attribute

daily_time_off: int | None = None

PlaceholderHeatmapItem

Bases: ForecastModel

start_date class-attribute instance-attribute

start_date: str | None = None

end_date class-attribute instance-attribute

end_date: str | None = None

daily_allocation class-attribute instance-attribute

daily_allocation: int | None = None

daily_time_off class-attribute instance-attribute

daily_time_off: int | None = None