import re
from typing import TYPE_CHECKING, Any, Optional, cast
from LOGS.Auxiliary.CustomFieldValueTypeChecker import CustomFieldValueTypeChecker
from LOGS.Auxiliary.Exceptions import EntityNotConnectedException
from LOGS.Auxiliary.Tools import Tools
from LOGS.Entities.CustomFieldModels import CustomFieldDataType
from LOGS.Entities.CustomTypeEntityTypeMapper import CustomFieldValueType
from LOGS.Interfaces.ICustomValue import ITypedCustomValue
from LOGS.LOGSConnection import LOGSConnection
if TYPE_CHECKING:
from LOGS.Entity.ConnectedEntity import ConnectedEntity
[docs]
class ICustomFieldValue(ITypedCustomValue):
_type: CustomFieldValueType = CustomFieldValueType.CustomField
_valueTypeChecker: CustomFieldValueTypeChecker = cast(
CustomFieldValueTypeChecker, None
)
_newLineRe = re.compile(r"[\n\r\t\b\f]+")
_connection: Optional[LOGSConnection] = None
_id: Optional[int] = None
_dataType: CustomFieldDataType
_value: Optional[Any] = None
_name: Optional[str] = None
def __init__(self, ref=None, dataType: Optional[CustomFieldDataType] = None):
if not dataType:
raise Exception("Data type is not set")
self._dataType = dataType
self._setTypeChecker()
super().__init__(ref)
def _getConnection(self):
if not self._connection:
raise EntityNotConnectedException(cast("ConnectedEntity", self))
return self._connection
def _setTypeChecker(self):
self._valueTypeChecker = CustomFieldValueTypeChecker(
self._dataType, self._getConnection()
)
def _contentToString(self) -> str:
if self._valueTypeChecker._isArrayType:
v = [str(f) for f in self.value] if self.value is not None else []
t = ", ".join(v)
else:
t = str(self.value) if self.value is not None else ""
t = self._newLineRe.sub(" ", t)
return Tools.truncString(t, 100)
def __str__(self):
id = f" [{'' + self._dataType.name + ']' if self._dataType else ''}{' ID:' + str(self.id) if self.id else ''}"
return f"<{type(self).__name__}{id}>"
@property
def identifier(self):
name = (
f" '{getattr(self, 'name')}'"
if hasattr(self, "name") and getattr(self, "name")
else ""
)
return "%s(id:%s)%s" % (
type(self).__name__,
str(self.id),
name,
)
@property
def id(self) -> Optional[int]:
return self._id
@property
def dataType(self) -> Optional[CustomFieldDataType]:
return self._dataType
@property
def value(self) -> Optional[Any]:
return self._value
@value.setter
def value(self, value):
if not self._dataType:
raise Exception("Data type is not set")
self._value = self._valueTypeChecker.checkAndConvert(value, type(self).__name__)
@property
def name(self) -> Optional[str]:
return self._name