metadata_review.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from typing import Any, Optional
  4. from sqlalchemy.dialects.postgresql import JSONB
  5. from app import db
  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=datetime.utcnow)
  21. updated_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
  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=datetime.utcnow)
  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: Optional[dict[str, Any]] = None,
  66. resolved_by: Optional[str] = None,
  67. notes: Optional[str] = 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 = datetime.utcnow()
  74. record.updated_at = datetime.utcnow()
  75. if notes is not None:
  76. record.notes = notes