class ScanProfile(db.Model): __table_args__ = (db.UniqueConstraint('name', 'owner_id', name='scan_profile_uniq'), ) id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) owner_id = db.Column(db.Integer, db.ForeignKey('users.id', name='scan_profile_fk', ondelete='CASCADE'), nullable=False) settings = db.relationship('ProfileSetting', lazy='dynamic', cascade="save-update, delete") def __repr__(self) -> str: return f'ScanProfile(name={self.name})' def to_dict(self) -> Dict[str, Dict[str, str]]: result = defaultdict(dict) for item in self.settings: if item.setting == 'credential': credential = AccountCredential.query.get(item.value) result[item.transport].update( dict(username=credential.username, password=credential.password)) continue result[item.transport][item.setting] = item.value return result
class Task(db.Model): __table_args__ = (db.UniqueConstraint('name', 'owner_id', name='task_uniq'), ) id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), index=True) status = db.Column( db.Enum(TaskStatus), default=TaskStatus.Idle, server_default=TaskStatus.Idle.name, nullable=False, ) uid = db.Column(db.String(128)) owner_id = db.Column(db.Integer, db.ForeignKey('users.id', name='task_fk', ondelete='CASCADE'), nullable=False) settings = db.relationship('TaskSetting', backref='task', lazy='dynamic') results = db.relationship('TaskResult', backref='task', lazy='dynamic', order_by='TaskResult.started') def to_list(self) -> List: return [ dict(address=item.hostname, **item.profile.to_dict()) for item in self.settings ] def update_status(self, status: TaskStatus): if status == TaskStatus.Wait: if self.status != TaskStatus.Idle: return self.status = TaskStatus.Wait elif status == TaskStatus.Idle: if self.uid is None: self.status = TaskStatus.Idle return if self.status == TaskStatus.Idle: return self.status = TaskStatus.Idle celery_task = AsyncResult(self.uid) if celery_task: CeleryControl(celery).revoke(self.uid, terminate=True) self.uid = None def __repr__(self): return f'Task(name={self.name})'
class Listing(db.Model): __tablename__ = 'listing' id = db.Column(db.Integer, primary_key=True, autoincrement=True) img = db.Column(db.String(250), default='') asin = db.Column(db.String(15), nullable=False) seller = db.Column(db.String(30), default='') status = db.Column(db.Integer, default=0) adtime = db.Column(db.DateTime, default=datetime.datetime.now) user_id = db.Column(db.Integer, db.ForeignKey("user.id")) __table_args__ = ( # θεε―δΈ db.UniqueConstraint('asin', 'seller'), )
class AccountCredential(db.Model): __table_args__ = (db.UniqueConstraint('name', 'owner_id', name='account_cred_uniq'), ) id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), index=True) username = db.Column(db.String(64), index=True) password = db.Column(db.String(128)) owner_id = db.Column(db.Integer, db.ForeignKey('users.id'), index=True, nullable=False) def __repr__(self) -> str: return f'AccountCredential({self.name})'
class ProfileSetting(db.Model): __table_args__ = (db.UniqueConstraint('transport', 'setting', 'profile_id', name='profile_setting_uniq'), ) id = db.Column(db.Integer, primary_key=True) transport = db.Column(db.String, nullable=False) setting = db.Column(db.String, nullable=False) value = db.Column(db.String, nullable=False) profile_id = db.Column(db.Integer, db.ForeignKey('scan_profile.id', ondelete='CASCADE', name='profile_setting_fk'), nullable=False, index=True) def __repr__(self): return f'ProfileSetting(transport={self.transport}, ' \ f'setting={self.setting})'
class TaskSetting(db.Model): __table_args__ = (db.UniqueConstraint('hostname', 'profile_id', 'task_id', name='task_setting_uniq'), ) id = db.Column(db.Integer, primary_key=True) hostname = db.Column(db.String(128)) profile_id = db.Column(db.Integer, db.ForeignKey('scan_profile.id', name='task_setting_fk', ondelete='SET NULL'), nullable=False) task_id = db.Column(db.Integer, db.ForeignKey('task.id', name='task_setting_fk2', ondelete='CASCADE'), nullable=False) profile = db.relationship('ScanProfile') def __repr__(self): return f'TaskSetting(hostname={self.hostname}, ' \ f'profile_id={self.profile_id})'