db.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 Setting(db.Model):
  38. __tablename__ = "settings"
  39. key = db.Column(db.Text, primary_key=True)
  40. value = db.Column(db.Text, nullable=False, default="")
  41. class Run(db.Model):
  42. __tablename__ = "runs"
  43. id = db.Column(db.Integer, primary_key=True)
  44. job_id = db.Column(db.Integer, db.ForeignKey("jobs.id"), nullable=False)
  45. started_at = db.Column(db.DateTime)
  46. finished_at = db.Column(db.DateTime)
  47. status = db.Column(db.Text) # running|success|error
  48. log_text = db.Column(db.Text)
  49. archive_name = db.Column(db.Text)
  50. size_bytes = db.Column(db.Integer)
  51. @property
  52. def duration_seconds(self):
  53. if self.started_at and self.finished_at:
  54. return int((self.finished_at - self.started_at).total_seconds())
  55. return None
  56. @property
  57. def size_human(self):
  58. if not self.size_bytes:
  59. return "—"
  60. n = float(self.size_bytes)
  61. for unit in ("o", "Ko", "Mo", "Go"):
  62. if n < 1024:
  63. return f"{n:.0f} {unit}"
  64. n /= 1024
  65. return f"{n:.1f} To"