import json from datetime import datetime from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import backref from backend import db # This is the association table for the many-to-many relationship between # virtual commands and recorder commands. virtual_command_recorder_command_table = db.Table( "virtual_command_recorder_command", db.Column( "virtual_command_id", db.Integer, db.ForeignKey("virtual_command.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True, ), db.Column( "recorder_command_id", db.Integer, db.ForeignKey("recorder_command.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True, ), ) # This is the association table for the many-to-many relationship between # virtual commands and recorder commands. virtual_command_recorder_table = db.Table( "virtual_command_recorder", db.Column( "virtual_command_id", db.Integer, db.ForeignKey("virtual_command.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True, ), db.Column( "recorder_id", db.Integer, db.ForeignKey("recorder.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True, ), ) class VirtualCommand(db.Model): id = db.Column(db.Integer, autoincrement=True, primary_key=True) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) name = db.Column(db.Unicode(63), unique=True, nullable=False) description = db.Column(db.Unicode(255), unique=False, nullable=True, default="") recorders = db.relationship( "Recorder", secondary=virtual_command_recorder_table, back_populates="virtual_commands", ) recorder_commands = db.relationship( "RecorderCommand", secondary=virtual_command_recorder_command_table, back_populates="virtual_commands", ) # parent_virtual_command = db.relationship('VirtualCommand', back_populates='child_virtual_commands') parent_virtual_command_id = db.Column( db.Integer, db.ForeignKey("virtual_command.id") ) child_virtual_commands = db.relationship( "VirtualCommand", backref=backref("parent_virtual_command", remote_side=[id]) ) command_order_string = db.Column(db.String) def __init__(self, **kwargs): super(VirtualCommand, self).__init__(**kwargs) @staticmethod def get_by_name(name): """ Find group by name :param name: :return: """ return VirtualCommand.query.filter(VirtualCommand.name == name).first() @staticmethod def get_all(): """ Return all groups :return: """ return VirtualCommand.query.all() @hybrid_property def command_order(self): if self.command_order_string is None: return [] return json.loads(self.command_order_string) @command_order.setter def command_order(self, ordered_list_of_commands: list): self.command_order_string = json.dumps(ordered_list_of_commands) def __str__(self): return self.name def to_dict(self): return dict(id=self.id, name=self.name, description=self.description) def toJSON(self): return json.dumps( self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 )