metadata_review.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from __future__ import annotations
  2. from typing import Any
  3. from sqlalchemy.dialects.postgresql import JSONB
  4. from app import db
  5. from app.core.common.timezone_utils import now_china_naive
  6. class MetadataReviewRecord(db.Model):
  7. __tablename__ = "metadata_review_records"
  8. __table_args__ = {"schema": "public"}
  9. id = db.Column(db.BigInteger, primary_key=True)
  10. record_type = db.Column(db.String(20), nullable=False) # redundancy | change
  11. source = db.Column(db.String(50), nullable=False, default="ddl")
  12. business_domain_id = db.Column(db.BigInteger, nullable=True)
  13. new_meta = db.Column(JSONB, nullable=False)
  14. candidates = db.Column(JSONB, nullable=False, default=list)
  15. old_meta = db.Column(JSONB, nullable=True)
  16. status = db.Column(db.String(20), nullable=False, default="pending")
  17. resolution_action = db.Column(db.String(30), nullable=True)
  18. resolution_payload = db.Column(JSONB, nullable=True)
  19. notes = db.Column(db.Text, nullable=True)
  20. created_at = db.Column(db.DateTime, nullable=False, default=now_china_naive)
  21. updated_at = db.Column(db.DateTime, nullable=False, default=now_china_naive)
  22. resolved_at = db.Column(db.DateTime, nullable=True)
  23. resolved_by = db.Column(db.String(100), nullable=True)
  24. def to_dict(self) -> dict[str, Any]:
  25. return {
  26. "id": self.id,
  27. "record_type": self.record_type,
  28. "source": self.source,
  29. "business_domain_id": self.business_domain_id,
  30. "new_meta": self.new_meta,
  31. "candidates": self.candidates,
  32. "old_meta": self.old_meta,
  33. "status": self.status,
  34. "resolution_action": self.resolution_action,
  35. "resolution_payload": self.resolution_payload,
  36. "notes": self.notes,
  37. "created_at": self.created_at.isoformat() if self.created_at else None,
  38. "updated_at": self.updated_at.isoformat() if self.updated_at else None,
  39. "resolved_at": self.resolved_at.isoformat() if self.resolved_at else None,
  40. "resolved_by": self.resolved_by,
  41. }
  42. class MetadataVersionHistory(db.Model):
  43. __tablename__ = "metadata_version_history"
  44. __table_args__ = {"schema": "public"}
  45. id = db.Column(db.BigInteger, primary_key=True)
  46. meta_id = db.Column(db.BigInteger, nullable=False)
  47. change_source = db.Column(db.String(50), nullable=False, default="ddl")
  48. before_snapshot = db.Column(JSONB, nullable=False)
  49. after_snapshot = db.Column(JSONB, nullable=False)
  50. created_at = db.Column(db.DateTime, nullable=False, default=now_china_naive)
  51. created_by = db.Column(db.String(100), nullable=True)
  52. def to_dict(self) -> dict[str, Any]:
  53. return {
  54. "id": self.id,
  55. "meta_id": self.meta_id,
  56. "change_source": self.change_source,
  57. "before_snapshot": self.before_snapshot,
  58. "after_snapshot": self.after_snapshot,
  59. "created_at": self.created_at.isoformat() if self.created_at else None,
  60. "created_by": self.created_by,
  61. }
  62. def update_review_record_resolution(
  63. record: MetadataReviewRecord,
  64. action: str,
  65. payload: dict[str, Any] | None = None,
  66. resolved_by: str | None = None,
  67. notes: str | None = None,
  68. ) -> None:
  69. record.status = "resolved" if action != "ignore" else "ignored"
  70. record.resolution_action = action
  71. record.resolution_payload = payload or {}
  72. record.resolved_by = resolved_by
  73. record.resolved_at = now_china_naive()
  74. record.updated_at = now_china_naive()
  75. if notes is not None:
  76. record.notes = notes