1
1

Result.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import json
  2. import typing as T
  3. from pycs import db
  4. from pycs.database.base import BaseModel
  5. from pycs.database.util import commit_on_return
  6. class Result(BaseModel):
  7. """ DB Model for projects """
  8. file_id = db.Column(
  9. db.Integer,
  10. db.ForeignKey("file.id", ondelete="CASCADE"),
  11. nullable=False)
  12. origin = db.Column(db.String, nullable=False)
  13. type = db.Column(db.String, nullable=False)
  14. label_id = db.Column(
  15. db.Integer,
  16. db.ForeignKey("label.id", ondelete="SET NULL"),
  17. nullable=True)
  18. data_encoded = db.Column(db.String)
  19. serialize_only = BaseModel.serialize_only + (
  20. "file_id",
  21. "origin",
  22. "type",
  23. "label_id",
  24. "data",
  25. )
  26. def serialize(self):
  27. """ extends the default serialize with the decoded data attribute """
  28. result = super().serialize()
  29. result["data"] = self.data
  30. return result
  31. @property
  32. def data(self) -> T.Optional[dict]:
  33. """ getter for the decoded data attribute """
  34. return None if self.data_encoded is None else json.loads(self.data_encoded)
  35. @data.setter
  36. def data(self, value):
  37. """
  38. setter for the decoded data attribute
  39. The attribute is encoded property before assigned to the object.
  40. """
  41. if isinstance(value, str) or value is None:
  42. self.data_encoded = value
  43. elif isinstance(value, (dict, list)):
  44. self.data_encoded = json.dumps(value)
  45. else:
  46. raise ValueError(f"Not supported type: {type(value)}")
  47. @commit_on_return
  48. def set_origin(self, origin: str):
  49. """
  50. set this results origin
  51. :param origin: either 'user' or 'pipeline'
  52. :return:
  53. """
  54. self.origin = origin
  55. @commit_on_return
  56. def set_label(self, label: int):
  57. """
  58. set this results origin
  59. :param label: label ID
  60. :return:
  61. """
  62. self.label_id = label