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'>
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].
status: Union[str, DataImportStatusType]
@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
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)
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.
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.