import json from datetime import datetime from sqlalchemy.ext.hybrid import hybrid_property 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', nullable=True, default=None) child_virtual_commands = db.relationship('VirtualCommand', back_populates='parent_virtual_command') 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)