summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-01-25 12:55:46 -0800
committerGitHub <noreply@github.com>2024-01-25 20:55:46 +0000
commitf7c9865de766445f8dad630400c5125b12550dac (patch)
treee1a4e78da0394d8ec2c855ab97e1d0ef5a4a3408
parent305b8656378dff73f4d3268f96c95797b447b80f (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.py71
-rw-r--r--openbb_platform/providers/intrinio/openbb_intrinio/models/insider_trading.py46
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(