示例#1
0
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
示例#2
0
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})'
示例#3
0
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'), )
示例#4
0
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})'
示例#5
0
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})'
示例#6
0
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})'