6
0

Result.py 1.6 KB

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