db.py 2.7 KB

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