db.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from flask_sqlalchemy import SQLAlchemy
  2. from datetime import datetime
  3. db = SQLAlchemy()
  4. class Job(db.Model):
  5. __tablename__ = "jobs"
  6. id = db.Column(db.Integer, primary_key=True)
  7. name = db.Column(db.Text, nullable=False)
  8. type = db.Column(db.Text, nullable=False) # ynh_app|ynh_system|custom_dir|mysql|postgresql
  9. config_json = db.Column(db.Text)
  10. cron_expr = db.Column(db.Text, nullable=False)
  11. retention_mode = db.Column(db.Text, nullable=False) # count|daily|gfs
  12. retention_value = db.Column(db.Integer, nullable=False)
  13. enabled = db.Column(db.Boolean, default=True)
  14. core_only = db.Column(db.Boolean, default=False)
  15. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  16. updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
  17. runs = db.relationship("Run", backref="job", lazy=True, cascade="all, delete-orphan")
  18. def next_run(self):
  19. from scheduler import get_next_run
  20. return get_next_run(self.id)
  21. class Run(db.Model):
  22. __tablename__ = "runs"
  23. id = db.Column(db.Integer, primary_key=True)
  24. job_id = db.Column(db.Integer, db.ForeignKey("jobs.id"), nullable=False)
  25. started_at = db.Column(db.DateTime)
  26. finished_at = db.Column(db.DateTime)
  27. status = db.Column(db.Text) # running|success|error
  28. log_text = db.Column(db.Text)
  29. archive_name = db.Column(db.Text)
  30. size_bytes = db.Column(db.Integer)
  31. @property
  32. def duration_seconds(self):
  33. if self.started_at and self.finished_at:
  34. return int((self.finished_at - self.started_at).total_seconds())
  35. return None
  36. @property
  37. def size_human(self):
  38. if not self.size_bytes:
  39. return "—"
  40. n = float(self.size_bytes)
  41. for unit in ("o", "Ko", "Mo", "Go"):
  42. if n < 1024:
  43. return f"{n:.0f} {unit}"
  44. n /= 1024
  45. return f"{n:.1f} To"