No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

datas_base.py 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #-*- coding: utf-8 -*-
  2. import warnings
  3. import datetime
  4. import time
  5. import os
  6. from lodel.context import LodelContext
  7. LodelContext.expose_modules(globals(), {
  8. 'lodel.leapi.datahandlers.base_classes': ['DataField'],
  9. 'lodel.exceptions': ['LodelException', 'LodelExceptions',
  10. 'LodelFatalError', 'DataNoneValid', 'FieldValidationError']})
  11. ##@brief Data field designed to handle boolean values
  12. class Boolean(DataField):
  13. help = 'A basic boolean field'
  14. base_type = 'bool'
  15. ##@brief A boolean field
  16. def __init__(self, **kwargs):
  17. #if 'check_data_value' not in kwargs:
  18. # kwargs['check_data_value'] = self._check_data_value
  19. super().__init__(ftype='bool', **kwargs)
  20. ##@brief Check and cast value in appropriate type
  21. #@param value *
  22. #@throw FieldValidationError if value is unappropriate or can not be cast
  23. #@return value
  24. def _check_data_value(self, value):
  25. value = super()._check_data_value(value)
  26. if not isinstance(value, bool):
  27. raise FieldValidationError("The value '%s' is not, and will never, be a boolean" % value)
  28. return value
  29. ##@brief Data field designed to handle integer values
  30. class Integer(DataField):
  31. help = 'Basic integer field'
  32. base_type = 'int'
  33. cast_type = int
  34. def __init__(self, **kwargs):
  35. super().__init__( **kwargs)
  36. ##@brief Check and cast value in appropriate type
  37. #@param value *
  38. #@param strict bool : if True, checks if the given value is strictly of the Integer type, if False, it tries to cast it to an Integer
  39. #@throw FieldValidationError if value is unappropriate or can not be cast
  40. #@return value
  41. def _check_data_value(self, value, strict = False):
  42. value = super()._check_data_value(value)
  43. if (strict and not isinstance(value, int)):
  44. raise FieldValidationError("The value '%s' is not a python type integer" % value)
  45. try:
  46. if strict:
  47. value = int(value)
  48. else:
  49. value = int(float(value))
  50. except(ValueError, TypeError):
  51. raise FieldValidationError("The value '%s' is not, and will never, be an integer" % value)
  52. return value
  53. ##@brief Data field designed to handle string
  54. class Varchar(DataField):
  55. help = 'Basic string (varchar) field. Default size is 64 characters'
  56. base_type = 'char'
  57. ##@brief A string field
  58. # @brief max_length int: The maximum length of this field
  59. def __init__(self, max_length=64, **kwargs):
  60. self.max_length = int(max_length)
  61. super().__init__(**kwargs)
  62. ##@brief checks if this class can override the given data handler
  63. # @param data_handler DataHandler
  64. # @return bool
  65. def can_override(self, data_handler):
  66. if not super().can_override(data_handler):
  67. return False
  68. if data_handler.max_length != self.max_length:
  69. return False
  70. return True
  71. ##@brief Check and cast value in appropriate type
  72. #@param value *
  73. #@throw FieldValidationError if value is unappropriate or can not be cast
  74. #@return value
  75. def _check_data_value(self, value):
  76. value = super()._check_data_value(value)
  77. if not isinstance(value, str):
  78. raise FieldValidationError("The value '%s' can't be a str" % value)
  79. if len(value) > self.max_length:
  80. raise FieldValidationError("The value '%s' is longer than the maximum length of this field (%s)" % (value, self.max_length))
  81. return value
  82. ##@brief Data field designed to handle date & time
  83. class DateTime(DataField):
  84. help = 'A datetime field. Take two boolean options now_on_update and now_on_create'
  85. base_type = 'datetime'
  86. ##@brief A datetime field
  87. # @param now_on_update bool : If true, the date is set to NOW on update
  88. # @param now_on_create bool : If true, the date is set to NEW on creation
  89. # @param **kwargs
  90. def __init__(self, now_on_update=False, now_on_create=False, **kwargs):
  91. self.now_on_update = now_on_update
  92. self.now_on_create = now_on_create
  93. self.datetime_format = '%Y-%m-%d' if 'format' not in kwargs else kwargs['format']
  94. super().__init__(**kwargs)
  95. ##@brief Check and cast value in appropriate type
  96. #@param value *
  97. #@throw FieldValidationError if value is unappropriate or can not be cast
  98. #@return value
  99. def _check_data_value(self, value):
  100. value = super()._check_data_value(value)
  101. if isinstance(value,str):
  102. try:
  103. value = datetime.datetime.fromtimestamp(time.mktime(time.strptime(value, self.datetime_format)))
  104. except ValueError:
  105. raise FieldValidationError("The value '%s' cannot be converted as a datetime" % value)
  106. if not isinstance(value, datetime.datetime):
  107. raise FieldValidationError("Tue value has to be a string or a datetime")
  108. return value
  109. def _construct_data(self, emcomponent, fname, datas, cur_value):
  110. if (self.now_on_create and cur_value is None) or self.now_on_update:
  111. return datetime.datetime.now()
  112. return cur_value
  113. ##@brief Data field designed to handle long string
  114. class Text(DataField):
  115. help = 'A text field (big string)'
  116. base_type = 'text'
  117. def __init__(self, **kwargs):
  118. super(self.__class__, self).__init__(ftype='text', **kwargs)
  119. ##@brief Check and cast value in appropriate type
  120. #@param value *
  121. #@throw FieldValidationError if value is unappropriate or can not be cast
  122. #@return value
  123. def _check_data_value(self, value):
  124. value = super()._check_data_value(value)
  125. if not isinstance(value, str):
  126. raise FieldValidationError("The content passed to this Text field is not a convertible to a string")
  127. return value
  128. ##@brief Data field designed to handle Files
  129. class File(DataField):
  130. base_type = 'file'
  131. ##@brief a file field
  132. # @param upload_path str : None by default
  133. # @param **kwargs
  134. def __init__(self, upload_path=None, **kwargs):
  135. self.upload_path = upload_path
  136. super().__init__(**kwargs)
  137. # @todo Add here a check for the validity of the given value (should have a correct path syntax)
  138. def _check_data_value(self, value):
  139. return super()._check_data_value(value)