Beispiel #1
0
class Mission(UpdateModelBase):
    name = db.Column(db.VARCHAR(64), unique=True)
    # task id
    target = db.Column(db.Integer)
    # task id list
    task_line = db.Column(db.ARRAY(db.Integer, zero_indexes=True))
    # condition name
    can_run_before_each_task = db.Column(db.VARCHAR(64), server_default='')
    can_run_before_target = db.Column(db.VARCHAR(64), server_default='')

    # for celery
    is_valid = db.Column(db.Boolean, server_default='t')
    next_run_mission = db.Column(db.INTEGER, nullable=True)

    def __str__(self):
        return '[{} is valid: {}]'.format(self.name, self.is_valid)

    @classmethod
    def get_valid_missions(cls):
        return cls.query.filter_by(is_valid=True).all()

    @classmethod
    def get_valid_mission_id_line(cls):
        result = []
        for mission in cls.query.filter_by(
                is_valid=True).with_entities('id').all():
            result.append(mission[0])
        return result
Beispiel #2
0
class Task(db.Model):
    id = db.Column(db.INTEGER, primary_key=True)
    name = db.Column(db.VARCHAR(64), nullable=True)

    type = db.Column(db.INTEGER, server_default=str(TASK_TYPE_CLASS.Data))
    template_name = db.Column(db.VARCHAR(64))  # show for admin
    kwargs = db.Column(db.JSON)  # show for admin
    can_run = db.Column(db.VARCHAR(64))  # show for admin

    run_time = db.Column(db.VARCHAR(64))
Beispiel #3
0
class UpdateModelBase(db.Model):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)
    time = db.Column(db.VARCHAR(64), default=now_format_time)
    timestamp = db.Column(db.Integer, default=now_int_timestamp)
    update_time = db.Column(db.Integer, onupdate=now_int_timestamp)

    def save(self):
        db.session.add(self)
        safe_commit()
        return self

    @classmethod
    def get_last(cls, **kwargs):
        return cls.query.filter_by(**kwargs).order_by(desc(cls.id)).limit(1).first()

    @classmethod
    def create(cls, **kwargs):
        m = cls(**kwargs)
        m.save()
        return m
Beispiel #4
0
class Trade(UpdateModelBase, db.Model):
    symbol = db.Column(db.VARCHAR(64))
    amount = db.Column(db.Integer)
    price = db.Column(db.DECIMAL(10, 4))

    mission_id = db.Column(db.INTEGER)
    mission_name = db.Column(db.VARCHAR(64))
    missionary_id = db.Column(db.INTEGER)
    type = db.Column(db.VARCHAR(64))

    def __str__(self):
        return '[mission:{} {} {}, ]'.format(self.mission_name, self.type,
                                             self.symbol)
class ResultLog(UpdateModelBase):
    id = db.Column(db.Integer, primary_key=True)
    task_name = db.Column(db.VARCHAR(255))
    task_id = db.Column(db.SMALLINT)
    task_index = db.Column(db.SMALLINT)
    mission_id = db.Column(db.Integer)
    missionary_id = db.Column(db.Integer)

    msg = db.Column(db.VARCHAR(255))

    @classmethod
    def save_from_task_engine(cls, task_engine):
        result = cls(task_name=task_engine.task_name,
                     task_id=task_engine.task_id,
                     task_index=task_engine.task_index,
                     mission_id=task_engine.mission_id,
                     missionary_id=task_engine.missionary_id,
                     msg=task_engine.task.msg)
        result.save()
        return result
Beispiel #6
0
class Missionary(UpdateModelBase):
    mission_id = db.Column(db.Integer)
    next_task_index = db.Column(db.Integer, server_default='0')

    run_time = db.Column(db.VARCHAR(64), server_default='', nullable=False)
    is_end = db.Column(db.BOOLEAN, server_default='f')
    end_time = db.Column(db.Integer, server_default='0')
    result_log_id = db.Column(db.Integer, server_default='0')

    def add_task_index(self, save=True):
        self.next_task_index += 1
        if save:
            self.save()

    def finish(self):
        self.is_end = True
        self.end_time = now_int_timestamp()
        self.save()

    @classmethod
    def create(cls, mission_id):
        return cls(mission_id=mission_id).save()

    def create_new_after_finish(self):
        self.create(self.mission_id)

    @classmethod
    def create_by_mission(cls, mission: Mission):
        if len(mission.task_line) > 0:
            first_task_id = mission.task_line[0]
            run_time = get_task_run_time_by_id(first_task_id)
        else:
            run_time = '1min'
        return cls(mission_id=mission.id, run_time=run_time).save()

    @classmethod
    def get_or_create_by_mission(cls, mission):
        None_able = cls.query.filter_by(mission_id=mission.id,
                                        is_end=False).first()
        if None_able is None:
            return cls.create_by_mission(mission)
        return None_able

    @classmethod
    def get_valid_mission_id_to_missionary(cls):
        result = {}
        for missionary in cls.query.filter_by(is_end=False).all():
            result[missionary.mission_id] = missionary
        return result


# @event.listens_for(Mission, 'after_update')
# def my_append_listener(mapper, connect, instance: Mission):
#     if instance.is_valid:
#         update_missionary(mission=instance)
#     else:
#         del_missionary(instance.id)

# @models_committed.connect
# def on_models_committed(*args, **kwargs):
#     print(*args)
#     print(**kwargs)
# for obj, change in changes:
#     if change == 'insert' and hasattr(obj, '__commit_insert__'):
#         obj.__commit_insert__()
#     elif change == 'update' and hasattr(obj, '__commit_update__'):
#         obj.__commit_update__()
#     elif change == 'delete' and hasattr(obj, '__commit_delete__'):
#         obj.__commit_delete__()