sift_py.data_import.status

  1import time
  2from datetime import datetime
  3from enum import Enum
  4from typing import Optional, Union
  5from urllib.parse import urljoin
  6
  7from pydantic import BaseModel, ConfigDict, field_validator
  8from pydantic.alias_generators import to_camel
  9from pydantic_core import PydanticCustomError
 10from typing_extensions import Self
 11
 12from sift_py.rest import SiftRestConfig, _RestService
 13
 14
 15class DataImportStatusType(Enum):
 16    """Status of the data import."""
 17
 18    SUCCEEDED = "DATA_IMPORT_STATUS_SUCCEEDED"
 19    PENDING = "DATA_IMPORT_STATUS_PENDING"
 20    IN_PROGRESS = "DATA_IMPORT_STATUS_IN_PROGRESS"
 21    FAILED = "DATA_IMPORT_STATUS_FAILED"
 22
 23    @classmethod
 24    def from_str(cls, val: str) -> Optional[Self]:
 25        try:
 26            return cls(val)
 27        except ValueError:
 28            return None
 29
 30    def as_human_str(self) -> str:
 31        return self.value
 32
 33
 34class DataImport(BaseModel):
 35    """Metadata regarding the data import."""
 36
 37    model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
 38
 39    data_import_id: str
 40    created_date: datetime
 41    modified_date: datetime
 42    source_url: str = ""
 43    status: Union[str, DataImportStatusType]
 44    error_message: str = ""
 45    csv_config: dict
 46
 47    @field_validator("status", mode="before")
 48    @classmethod
 49    def convert_status(cls, raw: Union[str, DataImportStatusType]) -> DataImportStatusType:
 50        if isinstance(raw, DataImportStatusType):
 51            return raw
 52        elif isinstance(raw, str):
 53            value = DataImportStatusType.from_str(raw)
 54            if value is not None:
 55                return value
 56
 57        raise PydanticCustomError(
 58            "invalid_data_import_error", f"Invalid data import status: {raw}."
 59        )
 60
 61
 62class DataImportService(_RestService):
 63    """
 64    Service used to retrieve information about a particular data import.
 65    """
 66
 67    STATUS_PATH = "/api/v1/data-imports"
 68    _data_import_id: str
 69
 70    # TODO: rename restconf to rest_conf for consistency between services
 71    def __init__(self, restconf: SiftRestConfig, data_import_id: str):
 72        super().__init__(rest_conf=restconf)
 73        self._data_import_id = data_import_id
 74        self._status_uri = urljoin(self._base_uri, self.STATUS_PATH)
 75
 76    def get_data_import(self) -> DataImport:
 77        """
 78        Returns information about the data import.
 79        """
 80        response = self._session.get(
 81            url=f"{self._status_uri}/{self._data_import_id}",
 82        )
 83        response.raise_for_status()
 84        data = response.json().get("dataImport")
 85        data_import = DataImport(**data)
 86        return data_import
 87
 88    def wait_until_complete(self) -> DataImport:
 89        """
 90        Blocks until the data import is completed. Check the status to determine
 91        if the import was successful or not.
 92        """
 93        polling_interval = 1
 94        while True:
 95            data_import = self.get_data_import()
 96            status: DataImportStatusType = data_import.status  # type: ignore
 97            if status in [
 98                DataImportStatusType.SUCCEEDED,
 99                DataImportStatusType.FAILED,
100            ]:
101                return data_import
102            elif status in [
103                DataImportStatusType.PENDING,
104                DataImportStatusType.IN_PROGRESS,
105            ]:
106                pass
107            else:
108                raise Exception(f"Unknown status: {status}")
109            time.sleep(polling_interval)
110            polling_interval = min(polling_interval * 2, 60)
class DataImportStatusType(enum.Enum):
16class DataImportStatusType(Enum):
17    """Status of the data import."""
18
19    SUCCEEDED = "DATA_IMPORT_STATUS_SUCCEEDED"
20    PENDING = "DATA_IMPORT_STATUS_PENDING"
21    IN_PROGRESS = "DATA_IMPORT_STATUS_IN_PROGRESS"
22    FAILED = "DATA_IMPORT_STATUS_FAILED"
23
24    @classmethod
25    def from_str(cls, val: str) -> Optional[Self]:
26        try:
27            return cls(val)
28        except ValueError:
29            return None
30
31    def as_human_str(self) -> str:
32        return self.value

Status of the data import.

SUCCEEDED = <DataImportStatusType.SUCCEEDED: 'DATA_IMPORT_STATUS_SUCCEEDED'>
PENDING = <DataImportStatusType.PENDING: 'DATA_IMPORT_STATUS_PENDING'>
IN_PROGRESS = <DataImportStatusType.IN_PROGRESS: 'DATA_IMPORT_STATUS_IN_PROGRESS'>
FAILED = <DataImportStatusType.FAILED: 'DATA_IMPORT_STATUS_FAILED'>
@classmethod
def from_str(cls, val: str) -> Union[typing_extensions.Self, NoneType]:
24    @classmethod
25    def from_str(cls, val: str) -> Optional[Self]:
26        try:
27            return cls(val)
28        except ValueError:
29            return None
def as_human_str(self) -> str:
31    def as_human_str(self) -> str:
32        return self.value
Inherited Members
enum.Enum
name
value
class DataImport(pydantic.main.BaseModel):
35class DataImport(BaseModel):
36    """Metadata regarding the data import."""
37
38    model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
39
40    data_import_id: str
41    created_date: datetime
42    modified_date: datetime
43    source_url: str = ""
44    status: Union[str, DataImportStatusType]
45    error_message: str = ""
46    csv_config: dict
47
48    @field_validator("status", mode="before")
49    @classmethod
50    def convert_status(cls, raw: Union[str, DataImportStatusType]) -> DataImportStatusType:
51        if isinstance(raw, DataImportStatusType):
52            return raw
53        elif isinstance(raw, str):
54            value = DataImportStatusType.from_str(raw)
55            if value is not None:
56                return value
57
58        raise PydanticCustomError(
59            "invalid_data_import_error", f"Invalid data import status: {raw}."
60        )

Metadata regarding the data import.

model_config = {'alias_generator': <function to_camel>, 'populate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

data_import_id: str
created_date: datetime.datetime
modified_date: datetime.datetime
source_url: str
status: Union[str, DataImportStatusType]
error_message: str
csv_config: dict
@field_validator('status', mode='before')
@classmethod
def convert_status( cls, raw: Union[str, DataImportStatusType]) -> DataImportStatusType:
48    @field_validator("status", mode="before")
49    @classmethod
50    def convert_status(cls, raw: Union[str, DataImportStatusType]) -> DataImportStatusType:
51        if isinstance(raw, DataImportStatusType):
52            return raw
53        elif isinstance(raw, str):
54            value = DataImportStatusType.from_str(raw)
55            if value is not None:
56                return value
57
58        raise PydanticCustomError(
59            "invalid_data_import_error", f"Invalid data import status: {raw}."
60        )
model_fields: ClassVar[Dict[str, pydantic.fields.FieldInfo]] = {'data_import_id': FieldInfo(annotation=str, required=True, alias='dataImportId', alias_priority=1), 'created_date': FieldInfo(annotation=datetime, required=True, alias='createdDate', alias_priority=1), 'modified_date': FieldInfo(annotation=datetime, required=True, alias='modifiedDate', alias_priority=1), 'source_url': FieldInfo(annotation=str, required=False, default='', alias='sourceUrl', alias_priority=1), 'status': FieldInfo(annotation=Union[str, DataImportStatusType], required=True, alias='status', alias_priority=1), 'error_message': FieldInfo(annotation=str, required=False, default='', alias='errorMessage', alias_priority=1), 'csv_config': FieldInfo(annotation=dict, required=True, alias='csvConfig', alias_priority=1)}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

This replaces Model.__fields__ from Pydantic V1.

model_computed_fields: ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]] = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

Inherited Members
pydantic.main.BaseModel
BaseModel
model_extra
model_fields_set
model_construct
model_copy
model_dump
model_dump_json
model_json_schema
model_parametrized_name
model_post_init
model_rebuild
model_validate
model_validate_json
model_validate_strings
dict
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class DataImportService(sift_py.rest._RestService):
 63class DataImportService(_RestService):
 64    """
 65    Service used to retrieve information about a particular data import.
 66    """
 67
 68    STATUS_PATH = "/api/v1/data-imports"
 69    _data_import_id: str
 70
 71    # TODO: rename restconf to rest_conf for consistency between services
 72    def __init__(self, restconf: SiftRestConfig, data_import_id: str):
 73        super().__init__(rest_conf=restconf)
 74        self._data_import_id = data_import_id
 75        self._status_uri = urljoin(self._base_uri, self.STATUS_PATH)
 76
 77    def get_data_import(self) -> DataImport:
 78        """
 79        Returns information about the data import.
 80        """
 81        response = self._session.get(
 82            url=f"{self._status_uri}/{self._data_import_id}",
 83        )
 84        response.raise_for_status()
 85        data = response.json().get("dataImport")
 86        data_import = DataImport(**data)
 87        return data_import
 88
 89    def wait_until_complete(self) -> DataImport:
 90        """
 91        Blocks until the data import is completed. Check the status to determine
 92        if the import was successful or not.
 93        """
 94        polling_interval = 1
 95        while True:
 96            data_import = self.get_data_import()
 97            status: DataImportStatusType = data_import.status  # type: ignore
 98            if status in [
 99                DataImportStatusType.SUCCEEDED,
100                DataImportStatusType.FAILED,
101            ]:
102                return data_import
103            elif status in [
104                DataImportStatusType.PENDING,
105                DataImportStatusType.IN_PROGRESS,
106            ]:
107                pass
108            else:
109                raise Exception(f"Unknown status: {status}")
110            time.sleep(polling_interval)
111            polling_interval = min(polling_interval * 2, 60)

Service used to retrieve information about a particular data import.

DataImportService(restconf: sift_py.rest.SiftRestConfig, data_import_id: str)
72    def __init__(self, restconf: SiftRestConfig, data_import_id: str):
73        super().__init__(rest_conf=restconf)
74        self._data_import_id = data_import_id
75        self._status_uri = urljoin(self._base_uri, self.STATUS_PATH)
STATUS_PATH = '/api/v1/data-imports'
def get_data_import(self) -> DataImport:
77    def get_data_import(self) -> DataImport:
78        """
79        Returns information about the data import.
80        """
81        response = self._session.get(
82            url=f"{self._status_uri}/{self._data_import_id}",
83        )
84        response.raise_for_status()
85        data = response.json().get("dataImport")
86        data_import = DataImport(**data)
87        return data_import

Returns information about the data import.

def wait_until_complete(self) -> DataImport:
 89    def wait_until_complete(self) -> DataImport:
 90        """
 91        Blocks until the data import is completed. Check the status to determine
 92        if the import was successful or not.
 93        """
 94        polling_interval = 1
 95        while True:
 96            data_import = self.get_data_import()
 97            status: DataImportStatusType = data_import.status  # type: ignore
 98            if status in [
 99                DataImportStatusType.SUCCEEDED,
100                DataImportStatusType.FAILED,
101            ]:
102                return data_import
103            elif status in [
104                DataImportStatusType.PENDING,
105                DataImportStatusType.IN_PROGRESS,
106            ]:
107                pass
108            else:
109                raise Exception(f"Unknown status: {status}")
110            time.sleep(polling_interval)
111            polling_interval = min(polling_interval * 2, 60)

Blocks until the data import is completed. Check the status to determine if the import was successful or not.