diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-01-25 12:55:46 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-25 20:55:46 +0000 |
commit | f7c9865de766445f8dad630400c5125b12550dac (patch) | |
tree | e1a4e78da0394d8ec2c855ab97e1d0ef5a4a3408 | |
parent | 305b8656378dff73f4d3268f96c95797b447b80f (diff) |
hotfix/insider-trading: Fix #5988 (#5990)
* fix validation errors
* empty strings
* validator
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
Co-authored-by: teh_coderer <me@tehcoderer.com>
-rw-r--r-- | openbb_platform/core/openbb_core/provider/standard_models/insider_trading.py | 71 | ||||
-rw-r--r-- | openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py | 46 |
2 files changed, 68 insertions, 49 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/insider_trading.py b/openbb_platform/core/openbb_core/provider/standard_models/insider_trading.py index 950527c0fec..94a893421f6 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/insider_trading.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/insider_trading.py @@ -1,6 +1,10 @@ """Insider Trading Standard Model.""" -from datetime import date, datetime, time +from datetime import ( + date as dateType, + datetime, + time, +) from typing import List, Optional, Set, Union from dateutil import parser @@ -36,52 +40,55 @@ class InsiderTradingData(Data): """Insider Trading Data.""" symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) - company_cik: int = Field(description="Company CIK of the insider trading.") - filing_date: datetime = Field(description="Filing date of the insider trading.") - transaction_date: Optional[date] = Field( - default=None, description="Transaction date of the insider trading." + company_cik: Optional[Union[int, str]] = Field( + default=None, description="CIK number of the company." + ) + filing_date: Optional[Union[dateType, datetime]] = Field( + default=None, description="Filing date of the trade." + ) + transaction_date: Optional[dateType] = Field( + default=None, description="Date of the transaction." + ) + owner_cik: Optional[Union[int, str]] = Field( + default=None, description="Reporting individual's CIK." + ) + owner_name: Optional[str] = Field( + default=None, description="Name of the reporting individual." ) - owner_cik: int = Field(description="Reporting CIK of the insider trading.") - owner_name: str = Field(description="Reporting name of the insider trading.") owner_title: Optional[str] = Field( - default=None, description="Designation of owner of the insider trading." + default=None, description="The title held by the reporting individual." ) - transaction_type: str = Field( - description="Transaction type of the insider trading." + transaction_type: Optional[str] = Field( + default=None, description="Type of transaction being reported." ) acquisition_or_disposition: Optional[str] = Field( - default=None, - description="Acquisition or disposition of the insider trading.", + default=None, description="Acquisition or disposition of the shares." ) security_type: Optional[str] = Field( - default=None, description="Security type of the insider trading." + default=None, description="The type of security transacted." ) securities_owned: Optional[float] = Field( - default=None, description="Number of securities owned in the insider trading." + default=None, + description="Number of securities owned by the reporting individual.", ) securities_transacted: Optional[float] = Field( - default=None, description="Securities transacted of the insider trading." + default=None, + description="Number of securities transacted by the reporting individual.", ) transaction_price: Optional[float] = Field( - default=None, - description="Price of the insider trading.", + default=None, description="The price of the transaction." ) - filing_url: str = Field(description="Link of the insider trading.") + filing_url: Optional[str] = Field(default=None, description="Link to the filing.") - @field_validator("symbol", mode="before", check_fields=False) - @classmethod - def upper_symbol(cls, v: Union[str, List[str], Set[str]]): - """Convert symbol to uppercase.""" - if isinstance(v, str): - return v.upper() - return ",".join([symbol.upper() for symbol in list(v)]) - - @field_validator("filing_date", mode="before", check_fields=False) + @field_validator( + "filing_date", "transaction_date", mode="before", check_fields=False + ) @classmethod def date_validate(cls, v): # pylint: disable=E0213 """Return formatted datetime.""" - filing_date = parser.isoparse(str(v)) - - if filing_date.time() == time(0, 0): - return datetime.combine(filing_date.date(), time(0, 0, 0)) - return filing_date + if v: + filing_date = parser.isoparse(str(v)) + if filing_date.time() == time(0, 0): + return filing_date.date() + return filing_date + return None diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py index a371818ba36..eed2a18b442 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py @@ -4,7 +4,7 @@ from datetime import ( date as dateType, datetime, ) -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, Union from dateutil.relativedelta import relativedelta from openbb_core.provider.abstract.fetcher import Fetcher @@ -15,7 +15,7 @@ from openbb_core.provider.standard_models.insider_trading import ( from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS from openbb_core.provider.utils.helpers import get_querystring from openbb_intrinio.utils.helpers import get_data_many -from pydantic import Field +from pydantic import Field, model_validator class IntrinioInsiderTradingQueryParams(InsiderTradingQueryParams): @@ -57,25 +57,25 @@ class IntrinioInsiderTradingData(InsiderTradingData): company_name: str = Field(description="Name of the company.") conversion_exercise_price: Optional[float] = Field( default=None, - description="Conversion/Exercise price of the insider trading.", + description="Conversion/Exercise price of the shares.", ) deemed_execution_date: Optional[dateType] = Field( default=None, - description="Deemed execution date of the insider trading.", + description="Deemed execution date of the trade.", ) exercise_date: Optional[dateType] = Field( default=None, - description="Exercise date of the insider trading.", + description="Exercise date of the trade.", ) expiration_date: Optional[dateType] = Field( default=None, - description="Expiration date of the insider trading.", + description="Expiration date of the derivative.", ) underlying_security_title: Optional[str] = Field( default=None, description="Name of the underlying non-derivative security related to this derivative transaction.", ) - underlying_shares: Optional[int] = Field( + underlying_shares: Optional[Union[int, float]] = Field( default=None, description="Number of underlying shares related to this derivative transaction.", ) @@ -83,20 +83,32 @@ class IntrinioInsiderTradingData(InsiderTradingData): default=None, description="Nature of ownership of the insider trading.", ) - director: bool = Field(description="Whether the owner is a director.") - officer: bool = Field(description="Whether the owner is an officer.") - ten_percent_owner: bool = Field(description="Whether the owner is a 10% owner.") - other_relation: bool = Field( - description="Whether the owner is having another relation." + director: Optional[bool] = Field( + default=None, description="Whether the owner is a director." ) - derivative_transaction: bool = Field( - description="Whether the owner is having a derivative transaction." + officer: Optional[bool] = Field( + default=None, description="Whether the owner is an officer." ) - report_line_number: Optional[int] = Field( + ten_percent_owner: Optional[bool] = Field( + default=None, description="Whether the owner is a 10% owner." + ) + other_relation: Optional[bool] = Field( + default=None, description="Whether the owner is having another relation." + ) + derivative_transaction: Optional[bool] = Field( default=None, - description="Report line number of the insider trading.", + description="Whether the owner is having a derivative transaction.", ) - filing_url: str = Field(description="URL of the filing.") + report_line_number: Optional[int] = Field( + default=None, description="Report line number of the insider trading." + ) + filing_url: Optional[str] = Field(default=None, description="URL of the filing.") + + @model_validator(mode="before") + @classmethod + def empty_strings(cls, values): # pylint: disable=no-self-argument + """Check for empty strings and replace with None.""" + return {k: None if v == "" else v for k, v in values.items()} class IntrinioInsiderTradingFetcher( |