Result.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import typing as T
  2. from contextlib import closing
  3. from json import dumps, loads
  4. from pycs import db
  5. from pycs.database.base import BaseModel
  6. from pycs.database.util import commit_on_return
  7. class Result(BaseModel):
  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. result = super().serialize()
  28. result["data"] = self.data
  29. return result
  30. @property
  31. def data(self):
  32. return None if self.data_encoded is None else json.loads(self.data_encoded)
  33. @data.setter
  34. def data(self, value):
  35. if isinstance(value, str) or value is None:
  36. self.data_encoded = value
  37. elif isinstance(value, (dict, list)):
  38. self.data_encoded = json.dumps(value)
  39. else:
  40. raise ValueError(f"Not supported type: {type(value)}")
  41. @commit_on_return
  42. def set_origin(self, origin: str):
  43. """
  44. set this results origin
  45. :param origin: either 'user' or 'pipeline'
  46. :return:
  47. """
  48. self.origin = origin
  49. @commit_on_return
  50. def set_label(self, label: int):
  51. """
  52. set this results origin
  53. :param label: label ID
  54. :return:
  55. """
  56. self.label_id = label