Beispiel #1
0
class Comment(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'), nullable=False)
    text = db.Column(db.Text())
    date = db.Column(db.TIMESTAMP(), server_default=func.now())
    task_id = db.Column(db.Integer(), db.ForeignKey('task.id'), nullable=False)

    def __repr__(self):
        return '<Comment: {}>'.format(self.text[:15])
Beispiel #2
0
class Comment(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(255))
    text = db.Column(db.Text())
    date = db.Column(db.DateTime())
    post_id = db.Column(db.Integer(), db.ForeignKey('post.id'))
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))

    def __repr__(self):
        return "<Comment '{}'>".format(self.text[:15])
Beispiel #3
0
class MapPoint(db.Model):
    __tablename__ = "map_point"

    index = db.Column(db.Integer, primary_key=True, autoincrement=True)

    map_code = db.Column(db.String(32),
                         db.ForeignKey("map.code"),
                         nullable=False)
    map = db.relationship("Map", foreign_keys=[map_code])

    monster_code = db.Column(db.String(32),
                             db.ForeignKey("monster.code"),
                             nullable=False)
    monster = db.relationship("Monster", foreign_keys=[monster_code])

    x = db.Column(db.Integer, nullable=False)
    y = db.Column(db.Integer, nullable=False)
    z = db.Column(db.Integer, nullable=False)

    def to_dict(
        self,
        monster_dict: bool = False,
        map_dict: bool = False,
    ) -> dict:
        if monster_dict:
            return {
                "monster": self.monster.to_dict(minimal=True),
                "pos": {
                    "x": self.x,
                    "y": self.y,
                    "z": self.z,
                },
            }

        elif map_dict:
            return {
                "map": self.map.to_dict(minimal=True),
                "pos": {
                    "x": self.x,
                    "y": self.y,
                    "z": self.z,
                },
            }

        return {
            "map": self.map.to_dict(minimal=True),
            "monster": self.monster.to_dict(minimal=True),
            "pos": {
                "x": self.x,
                "y": self.y,
                "z": self.z,
            },
        }
Beispiel #4
0
class PetSkillStone(
        db.Model,
        BaseMixin,
        DroppedByMixin,
        RandomBoxMixin,
):
    __tablename__ = "pet_skill_stone"

    _mapper_utils = {
        "files": {
            "server": ["s_PetSkillStoneItem.bin"],
            "client": ["c_PetSkillStoneItemRes.bin"],
            "string": ["PetSkillStoneItemStr.dat"],
        }
    }

    skill_code = CustomColumn(db.String(32),
                              db.ForeignKey("pet_skill.code"),
                              nullable=False,
                              mapper_key="대상코드")

    skill_data = db.relationship("PetSkill", foreign_keys=[skill_code])

    def to_dict(self, minimal: bool = False) -> dict:
        minimal_dict = BaseMixin.to_dict(self, minimal)

        if minimal:
            return minimal_dict

        return {
            **minimal_dict,
            "skill": self.skill_data.to_dict(),
            **DroppedByMixin.to_dict(self),
            **RandomBoxMixin.to_dict(self),
        }
Beispiel #5
0
class ProductBook(db.Model, BaseMixin, SoldByMixin):
    __tablename__ = "product_book"

    _mapper_utils = {
        "files": {
            "server": ["s_ProductBook.bin"],
            "client": ["c_ProductRes.bin"],
            "string": ["ProductStr.dat"],
        },
    }

    production_code = CustomColumn(db.String(32),
                                   db.ForeignKey("production.code"),
                                   nullable=False,
                                   mapper_key="대상코드")

    production = db.relationship("Production",
                                 foreign_keys=[production_code],
                                 uselist=False)

    def to_dict(self, minimal: bool = False) -> dict:
        minimal_dict = BaseMixin.to_dict(self, minimal)

        if minimal:
            return minimal_dict

        return {
            **minimal_dict,
            "production": self.production.to_dict(minimal=True),
            **SoldByMixin.to_dict(self),
        }
Beispiel #6
0
class UserProfile(db.Model):

    __tablename__ = 'user_profiles'

    PER_PAGE = 20

    user_id = db.Column(db.Integer,
                        db.ForeignKey('users.id', ondelete='CASCADE'),
                        primary_key=True)

    gender = db.Column(db.String(1), default='n')  #n, m, f
    description = db.Column(db.String(100))
    image_url = db.Column(db.String(100))
    url = db.Column(db.String(100))
    followers_count = db.Column(db.Integer)
    verified = db.Column(db.Boolean, default=False)
    location = db.Column(db.String(20))
    updatetime = db.Column(db.DateTime,
                           default=datetime.now,
                           onupdate=datetime.now)

    def __init__(self, *args, **kwargs):
        super(UserProfile, self).__init__(*args, **kwargs)

    def __str__(self):
        return self.user_id

    def __repr__(self):
        return "<%s>" % self

    @property
    def get_city(self):
        r = self.city if self.city else self.province
        return r if r else ''
Beispiel #7
0
class UserMapper(db.Model):
    """ 微博用户授权信息
        source: sina, qq
        app: 我们下面将会有多个app
    """

    __tablename__ = "user_mappers"

    id = db.Column(db.Integer, primary_key=True)
    access_token = db.Column(db.String(255))
    access_secret = db.Column(db.String(255))
    source = db.Column(db.String(50))
    app = db.Column(db.String(10))  # taoke,

    user_id = db.Column(db.Integer,
                        db.ForeignKey('users.id', ondelete='CASCADE'))

    user = db.relation('User', backref='mappers')

    def __init__(self, *args, **kwargs):
        super(UserMapper, self).__init__(*args, **kwargs)

    def __str__(self):
        return u"%s - %s(%s)" % (self.user_id, self.app, self.source)

    def __repr__(self):
        return "<%s>" % self
Beispiel #8
0
class FinanceRecord(db.Model):

    __tablename__ = "finance_records"

    PER_PAGE = 20

    BUY = 100  # 购买
    COMM = 200  # 推荐成功
    EXTRACT = 300  # 提取

    WAIT = 100
    SUCCESS = 200

    id = db.Column(db.Integer, primary_key=True)
    source = db.Column(db.Integer(3), nullable=False)  #BUY, COMM, EXTRACT
    money = db.Column(db.Numeric(9, 2))  # 支出(EXTRACT)为负数
    status = db.Column(db.Integer(3), default=WAIT)  # WAIT, SUCCESS
    created_date = db.Column(db.DateTime, default=datetime.now)

    report_id = db.Column(
        db.Integer, db.ForeignKey('taoke_reports.id', ondelete='CASCADE'))

    report = db.relation('TaokeReport', backref='finance_records')

    user_id = db.Column(db.Integer,
                        db.ForeignKey('users.id', ondelete='CASCADE'))

    user = db.relation('User', backref='finance_records')

    def __init__(self, *args, **kwargs):
        super(FinanceRecord, self).__init__(*args, **kwargs)

    def __str__(self):
        return u"%s: %s" % (self.user_id, self.money)

    def __repr__(self):
        return "<%s>" % self

    @cached_property
    def name(self):
        data = {100: u"购买商品", 200: u"推荐分成", 300: u"提现"}
        return data.get(self.source, u'未知方式')

    @cached_property
    def get_status(self):
        data = {100: u"等待处理", 200: u"成功"}
        return data.get(self.status, u'无状态')
Beispiel #9
0
class Myfeeling(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    text = db.Column(db.Text())
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
    timestamp = db.Column(db.DateTime())

    def __repr__(self):
        return "<My feeling '{}'>".format(self.text[:15])
Beispiel #10
0
class Messageboard(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(255))
    text = db.Column(db.Text())
    timestamp = db.Column(db.DateTime())
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))

    def __repr__(self):
        return "<Messageboard '{}'>".format(self.text[:15])
Beispiel #11
0
class Photos(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
    timestamp = db.Column(db.DateTime())
    pic_url = db.Column(db.Text())
    description = db.Column(db.Text())

    def __repr__(self):
        return "<My Photos '{}'".format(self.text[:15])
Beispiel #12
0
class Session(db.Model):
    __tablename__ = 'session'

    id = db.Column(db.Integer, primary_key=True)
    start_time = db.Column(db.DateTime,
                           server_default=func.now(),
                           nullable=False)
    duration_s = db.Column(db.Integer, nullable=False)

    #? 1 course - Many sessions
    course_code = db.Column(db.String(7), db.ForeignKey('course.code'))
    course = db.relationship('Course', back_populates='sessions')
    #? 1 user - Many study blocks
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', back_populates='sessions')

    db.UniqueConstraint(start_time, user_id)

    def __repr__(self):
        return f"Session<id={self.id}, start={self.start_time}, duration={self.duration_s}, course_code={self.course_code}, user={self.user_id}>"

    def save(self):
        db.session.add(self)
        db.session.commit()

    def add_article(self, article):
        self.articles.append(article)
        self.save()

    def remove_article(self, article_id):
        article = Article.find_by_id(article_id)
        self.articles.remove(article)
        self.save()

    @classmethod
    def find_by_id(cls, session_id):
        return cls.query.filter(cls.id == session_id).first()

    @classmethod
    def find_course_sessions(cls, user_id, course_code):
        return cls.query.filter(cls.user_id == user_id).filter(
            cls.course_code == course_code).all()
Beispiel #13
0
class MonsterMessage(db.Model):
    __tablename__ = "monster_message"

    _mapper_utils = {
        "files": {
            "server": [
            ],
            "client": [
                "c_ObjChat.bin"
            ],
            "string": [
                "ObjChatDesc.dat"
            ],
        },
        "options": {
            "image_key": "모델명"
        },
    }

    code = CustomColumn(db.String(32), db.ForeignKey("monster.messages_code"),
                        primary_key=True, nullable=False, mapper_key="대사코드")

    idle_0 = CustomColumn(db.Text, mapper_key="Idle0")
    idle_1 = CustomColumn(db.Text, mapper_key="Idle1")

    attack_0 = CustomColumn(db.Text, mapper_key="Attack0")
    attack_1 = CustomColumn(db.Text, mapper_key="Attack1")

    damage_0 = CustomColumn(db.Text, mapper_key="Damage0")
    damage_1 = CustomColumn(db.Text, mapper_key="Damage1")

    critical_0 = CustomColumn(db.Text, mapper_key="Critical0")
    critical_1 = CustomColumn(db.Text, mapper_key="Critical1")

    die_0 = CustomColumn(db.Text, mapper_key="Die0")
    die_1 = CustomColumn(db.Text, mapper_key="Die1")

    regen_0 = CustomColumn(db.Text, mapper_key="ObjRegen0")
    regen_1 = CustomColumn(db.Text, mapper_key="ObjRegen1")

    def to_dict(self) -> dict:
        strings = ["idle", "attack", "damage", "critical",
                   "die", "regen"]

        resp = {}
        for string in strings:
            resp[string] = []

            for i in range(0, 2):
                value = getattr(self, f"{string}_{i}")
                if value:
                    resp[string].append(value)

        return resp
Beispiel #14
0
class Likes(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), nullable=False)
    task_id = db.Column(db.Integer(),
                        db.ForeignKey('task.id'),
                        index=True,
                        nullable=False)
    liked_user = db.Column(db.Integer(),
                           db.ForeignKey('user.id'),
                           index=True,
                           nullable=False)

    def i_like(self, task_id):
        task = Task.query.get(task_id)
        self.user_id = session['user_id']
        self.task_id = task.id
        self.liked_user = task.user_id

    def __repr__(self):
        return '{}'.format(self.user_id)
Beispiel #15
0
class QuestMission(db.Model):
    __tablename__ = "quest_mission"

    index = db.Column(db.Integer, primary_key=True, autoincrement=True)
    work_type = db.Column(db.Enum(QuestWorkType), nullable=False)
    work_value = db.Column(db.String(32))

    quest_code = db.Column(db.String(32),
                           db.ForeignKey("quest.code"),
                           nullable=False)

    quest = db.relationship("Quest", foreign_keys=[quest_code])

    map_code = db.Column(db.String(32), db.ForeignKey("map.code"))
    map = db.relationship("Map", foreign_keys=[map_code], uselist=False)

    x = db.Column(db.Float)
    y = db.Column(db.Float)

    count = db.Column(db.Integer, nullable=False)

    npc_code = db.Column(db.String(32), db.ForeignKey("npc.code"))
    npc = db.relationship("Npc", foreign_keys=[npc_code], uselist=False)

    item_code = db.Column(db.String(32), db.ForeignKey("item_list.code"))
    item = db.relationship("ItemList", foreign_keys=[item_code], uselist=False)

    monster_code = db.Column(db.String(32), db.ForeignKey("monster.code"))
    monster = db.relationship("Monster",
                              foreign_keys=[monster_code],
                              uselist=False)

    quest_item_code = db.Column(db.String(32),
                                db.ForeignKey("quest_item.code"))
    quest_item = db.relationship("QuestItem",
                                 foreign_keys=[quest_item_code],
                                 uselist=False)

    def to_dict(self) -> dict:
        return {
            "work_type":
            self.work_type.to_dict(),
            "work_value":
            self.work_value,
            "map": (self.map.to_dict(minimal=True) if self.map else None),
            "pos": {
                "x": self.x,
                "y": self.y,
            },
            "count":
            self.count,
            "npc":
            self.npc.to_dict(minimal=True) if self.npc else None,
            "item":
            self.item.to_dict() if self.item else None,
            "monster":
            (self.monster.to_dict(minimal=True) if self.monster else None),
            "quest_item": (self.quest_item.to_dict(
                minimal=True) if self.quest_item else None)
        }
Beispiel #16
0
class QuestSelectableItem(db.Model):
    __tablename__ = "quest_selectable_item"

    index = db.Column(db.Integer, primary_key=True, autoincrement=True)

    quest_code = db.Column(db.String(32),
                           db.ForeignKey("quest.code"),
                           nullable=False)
    quest = db.relationship("Quest", foreign_keys=[quest_code])

    item_code = db.Column(db.String(32),
                          db.ForeignKey("item_list.code"),
                          nullable=False)
    item = db.relationship("ItemList", foreign_keys=[item_code], uselist=False)

    amount = db.Column(db.Integer, nullable=False)

    def to_dict(self) -> dict:
        return {
            "item": self.item.to_dict(),
            "amount": self.amount,
        }
Beispiel #17
0
class ArticleRatings(db.Model):
    __tablename__ = 'article_ratings'

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    user = db.relationship('User', back_populates='article_ratings')

    article_id = db.Column(db.Integer,
                           db.ForeignKey('article.id'),
                           primary_key=True)
    rating = db.Column(db.Integer, nullable=False)

    def __repr__(self):
        return f'Rating<user_id: {self.user_id}, article_id: {self.article_id}, rating: {self.rating}>'

    def remove(self):
        db.session.delete(self)
        db.session.commit()

    @classmethod
    def find_by_id(cls, user_id, article_id):
        return cls.query.filter(cls.user_id == user_id).filter(
            cls.article_id == article_id).first()
Beispiel #18
0
class Connection(db.Model):

    __tablename__ = "connections"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    provider_id = db.Column(db.String(255))
    provider_user_id = db.Column(db.String(255))
    access_token = db.Column(db.String(255))
    secret = db.Column(db.String(255))
    display_name = db.Column(db.String(255))
    profile_url = db.Column(db.String(512))
    image_url = db.Column(db.String(512))
    rank = db.Column(db.Integer)
Beispiel #19
0
class Post(db.Model):
    id = db.Column(db.Integer(),primary_key=True)
    title = db.Column(db.String(255))
    text = db.Column(db.Text())
    publish_date = db.Column(db.DateTime())
    user_id = db.Column(db.Integer(),db.ForeignKey('user.id'))
    comments = db.relationship('Comment',backref = 'post',lazy = 'dynamic')
    tags=db.relationship(
        'Tag',secondary =tags,backref = db.backref('posts',lazy='dynamic')
    )
    def __init__(self,title):
        self.title = title
    
    def __repr__(self):
        return "<Post '{}'>".format(self.title)
Beispiel #20
0
class Drop(db.Model):
    __tablename__ = "drop"

    index = db.Column(db.Integer, primary_key=True, autoincrement=True)
    quantity = db.Column(db.Integer, nullable=False, default=1)

    monster_code = db.Column(db.String(32),
                             db.ForeignKey("monster.code"),
                             nullable=False)

    monster = db.relationship("Monster",
                              foreign_keys=[monster_code])

    item_code = db.Column(db.String(32),
                          db.ForeignKey("item_list.code"),
                          nullable=False)

    item = db.relationship("ItemList",
                           foreign_keys=[item_code])

    def to_dict(
        self,
        item_dict: bool = False,
        monster_dict: bool = False
    ) -> dict:
        if item_dict:
            return {
                "item": self.item.to_dict(with_item_data=True),
                "quantity": self.quantity,
            }

        elif monster_dict:
            return {
                "monster": self.monster.to_dict(minimal=True),
                "quantity": self.quantity,
            }
Beispiel #21
0
class Post(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(255))
    subtitle = db.Column(db.String(255))
    text = db.Column(db.Text())
    publish_date = db.Column(db.DateTime())
    private = db.Column(db.Boolean())
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
    comments = db.relationship('Comment', backref='post', lazy='dynamic')
    body_html = db.Column(db.Text())
    tags = db.relationship('Tag',
                           secondary=tags,
                           backref=db.backref('posts', lazy='dynamic'))
    '''
    @staticmethod
    def on_changed_body(target,value,oldvalue,intitiator):
        allowed_tag = ['a','abbr','acronym','b','blockquote','code','div','em','i','li','ol','pre','strong','table','thead','tbody','tr','th','ul','h1','h2','h3','h4','h5','h6','p',]
        target.body_html = bleach.linkify(bleach.clean(markdown(value,output_html = 'html'),tags=allowed_tag,strip=True))
    '''

    #处理body字段变化的函数
    @staticmethod
    def on_changed_post(target, value, oldvalue, initiaor):
        allow_tags = [
            'a', 'abbr', 'acronym', 'b', 'blockquote', 'code', 'em', 'i', 'li',
            'ol', 'pre', 'strong', 'ul', 'h1', 'h2', 'h3', 'p', 'img'
        ]
        #转换markdown为html,并清洗html标签

        target.body_html = bleach.linkify(
            bleach.clean(
                markdown(value,
                         output_form='html',
                         extensions=['extra', 'codehilite']),
                tags=allow_tags,
                strip=True,
                attributes={
                    '*': ['class'],
                    'a': ['href', 'rel'],
                    'img': ['src', 'alt'],  #支持<img src …>标签和属性
                }))

    def __repr__(self):
        return "<Post '{}'>".format(self.title)
Beispiel #22
0
class Message(db.Model):
    __tablename__ = 'messages'

    id = db.Column(db.Integer, primary_key=True)
    time = db.Column(db.BigInteger)
    # 1 表示已经查看, 0 表示未查看
    checked = db.Column(db.String(10))
    sender = db.Column(db.String(255))
    content = db.Column(db.String(1000))
    href = db.Column(db.String(1000))
    message_type = db.Column(db.String(1000))

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, sender, content):
        self.sender = sender
        self.content = content

    def save(self):
        db.session.add(self)
        db.session.commit()

    def delete(self):
        db.session.delete(self)
        db.session.commit()

    @staticmethod
    def roll_back():
        db.session.rollback()

    # 查询指定用户的 unchecked messages
    @staticmethod
    def user_unchecked_messages(user_id):
        sql = '''
            SELECT messages.id, messages.sender, messages.checked, messages.content, messages.time
            FROM messages
            WHERE messages.user_id={} AND messages.checked='0'
        '''.format(user_id)
        ret = db.engine.execute(sql).fetchall()
        return [dict(r) for r in ret]
Beispiel #23
0
class SkillBook(
    db.Model, BaseMixin,
    SoldByMixin
):
    __tablename__ = "skill_book"

    _mapper_utils = {
        "files": {
            "server": [
                "s_SkillBookItem.bin"
            ],
            "client": [
                "c_SkillBookItemRes.bin"
            ],
            "string": [
                "SkillBookItemStr.dat"
            ],
        },
    }

    skill_code = CustomColumn(
        db.String(32), db.ForeignKey("player_skill.code"),
        nullable=False, mapper_key="대상코드")

    skill = db.relationship("PlayerSkill", foreign_keys=[skill_code],
                            uselist=False)

    def to_dict(self, minimal: bool = False) -> dict:
        minimal_dict = BaseMixin.to_dict(self, minimal)

        if minimal:
            return minimal_dict

        return {
            **minimal_dict,
            "skill": self.skill.to_dict() if self.skill else None,
            **SoldByMixin.to_dict(self),
        }
Beispiel #24
0
class QuestDescription(db.Model):
    __tablename__ = "quest_description"

    index = db.Column(db.Integer, primary_key=True, autoincrement=True)
    language = db.Column(db.String(4), nullable=False)

    quest_code = db.Column(db.String(32),
                           db.ForeignKey("quest.code"),
                           nullable=False)

    title = db.Column(db.Text(256))

    mission_1 = db.Column(db.Text(1024))
    mission_2 = db.Column(db.Text(1024))
    mission_3 = db.Column(db.Text(1024))

    description = db.Column(db.Text(2048))

    pre_dialog = db.Column(db.Text(2048))
    start_dialog = db.Column(db.Text(2048))
    run_dialog = db.Column(db.Text(2048))
    finish_dialog = db.Column(db.Text(2048))

    def to_dict(self) -> dict:
        return {
            "language": self.language,
            "title": self.title,
            "missions": [
                self.mission_1,
                self.mission_2,
                self.mission_3,
            ],
            "description": self.description,
            "pre_dialog": self.pre_dialog,
            "run_dialog": self.run_dialog,
            "start_dialog": self.start_dialog,
            "finish_dialog": self.finish_dialog,
        }
Beispiel #25
0
class QuestScroll(
        db.Model,
        BaseMixin,
        DroppedByMixin,
        SoldByMixin,
):
    __tablename__ = "quest_scroll"

    _mapper_utils = {
        "files": {
            "server": ["s_QuestScrollItem.bin"],
            "client": ["c_QuestScrollItemRes.bin"],
            "string": ["QuestScrollItemStr.dat"],
        },
    }

    quest_code = CustomColumn(db.String(32),
                              db.ForeignKey("quest.code"),
                              nullable=False,
                              mapper_key="대상코드")

    quest = db.relationship("Quest", foreign_keys=[quest_code], uselist=False)

    def to_dict(self, minimal: bool = False) -> dict:
        minimal_dict = BaseMixin.to_dict(self, minimal)

        if minimal:
            return minimal_dict

        return {
            **minimal_dict,
            "quest":
            self.quest.to_dict(minimal=True) if self.quest else None,
            **SoldByMixin.to_dict(self),
            **DroppedByMixin.to_dict(self),
        }
Beispiel #26
0
from webapp.extensions import db

from sqlalchemy.dialects.postgresql import TEXT

# Associatoin table
session_articles = db.Table(
    'session_articles',
    db.Column('session_id',
              db.Integer,
              db.ForeignKey('session.id'),
              primary_key=True),
    db.Column('article_id',
              db.Integer,
              db.ForeignKey('article.id'),
              primary_key=True))


class Article(db.Model):
    __tablename__ = 'article'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), nullable=False)
    author = db.Column(db.String(80))
    full_text = db.Column(TEXT, nullable=False)
    link = db.Column(db.String(250), nullable=False)

    sessions = db.relationship('Session',
                               secondary=session_articles,
                               lazy='subquery',
                               backref=db.backref('articles', lazy=True))
Beispiel #27
0
class Monster(db.Model):
    __tablename__ = "monster"

    _mapper_utils = {
        "files": {
            "server": ["s_MonsterChar.bin"],
            "client": ["c_MonsterCharRes.bin"],
            "string": ["MonsterCharStr.dat"],
        },
        "options": {
            "image_key": "모델명"
        },
    }

    index = db.Column(db.Integer, nullable=False)

    code = CustomColumn(db.String(32), primary_key=True, mapper_key="코드")

    name = CustomColumn(db.String(256), nullable=False, mapper_key="_name")

    icon = CustomColumn(db.String(32), nullable=False, mapper_key="_icon")

    rating_type = CustomColumn(db.Enum(RatingType),
                               nullable=False,
                               mapper_key="몬스터등급타입",
                               transform=lambda val: RatingType(val))

    level = CustomColumn(db.Integer, nullable=False, mapper_key="기준레벨")

    hp = CustomColumn(db.Integer, nullable=False, mapper_key="기준최대HP")

    range = CustomColumn(db.Enum(MonsterRange),
                         nullable=False,
                         mapper_key="공격거리타입",
                         transform=lambda val: MonsterRange(val))

    area = CustomColumn(db.Enum(Area),
                        nullable=False,
                        mapper_key="필드구분",
                        transform=lambda val: Area(val))

    experience = CustomColumn(db.Integer, nullable=False, mapper_key="보상경험치")

    minimal_damage = CustomColumn(db.Integer,
                                  nullable=False,
                                  mapper_key="최소물공력")

    maximal_damage = CustomColumn(db.Integer,
                                  nullable=False,
                                  mapper_key="최대물공력")

    physical_defense = CustomColumn(db.Integer,
                                    nullable=False,
                                    mapper_key="물방력")

    magic_defense = CustomColumn(db.Integer, nullable=False, mapper_key="마항력")

    attack_range = CustomColumn(db.Float,
                                nullable=False,
                                mapper_key="기본사정거리",
                                transform=florensia_meter_transform)

    tameable = CustomColumn(db.Boolean, mapper_key="테이밍", nullable=False)

    drops = db.relationship(
        "Drop", primaryjoin="foreign(Drop.monster_code) == Monster.code")

    map_points = db.relationship(
        "MapPoint",
        primaryjoin="foreign(MapPoint.monster_code) == Monster.code")

    quest_missions = db.relationship(
        "QuestMission",
        primaryjoin="foreign(QuestMission.monster_code) == Monster.code")

    vision_range = CustomColumn(db.Float,
                                nullable=False,
                                mapper_key="선공시야",
                                transform=florensia_meter_transform)

    # If you perform an action close to the range
    # attack vision range of the monster, you will
    # also get aggro
    attack_vision_range = CustomColumn(db.Float,
                                       nullable=False,
                                       mapper_key="요청시야",
                                       transform=florensia_meter_transform)

    messages_code = CustomColumn(db.String(32),
                                 mapper_key="오브젝트채팅",
                                 transform=lambda v: v if v != "#" else None)

    monster_message = db.relationship("MonsterMessage", uselist=False)

    # Skill 1
    skill_1_code = CustomColumn(db.String(32),
                                db.ForeignKey("monster_skill.code"),
                                mapper_key="부가Action1코드",
                                transform=lambda v: v if v != "#" else None)

    skill_1_chance = CustomColumn(db.Float,
                                  mapper_key="부가Action1선택율",
                                  transform=florensia_probability_transform)

    skill_1 = db.relationship("MonsterSkill", foreign_keys=[skill_1_code])

    # Skill 2
    skill_2_code = CustomColumn(db.String(32),
                                db.ForeignKey("monster_skill.code"),
                                mapper_key="부가Action2코드",
                                transform=lambda v: v if v != "#" else None)

    skill_2_chance = CustomColumn(db.Float,
                                  mapper_key="부가Action2선택율",
                                  transform=florensia_probability_transform)

    skill_2 = db.relationship("MonsterSkill", foreign_keys=[skill_2_code])

    def to_dict(self, minimal: bool = False) -> dict:
        minimal_dict = {
            "code": self.code,
            "name": self.name,
            "icon": self.icon,
            "rating": self.rating_type.to_dict(),
            "level": self.level,
            "area": self.area.to_dict(),
        }

        if minimal:
            return minimal_dict

        # Get monster skills as a list
        skills = []
        for i in range(1, 3):
            skill = getattr(self, f"skill_{i}")
            if skill:
                skill_dict = skill.to_dict()
                skill_dict["chance"] = getattr(self, f"skill_{i}_chance")
                skills.append(skill_dict)

        return {
            **minimal_dict, "hp":
            self.hp,
            "range":
            self.range.to_dict(),
            "experience":
            self.experience,
            "minimal_damage":
            self.minimal_damage,
            "maximal_damage":
            self.maximal_damage,
            "physical_defense":
            self.physical_defense,
            "magic_defense":
            self.magic_defense,
            "attack_range":
            self.attack_range,
            "tamable":
            self.tameable,
            "vision_range":
            self.vision_range,
            "attack_vision_range":
            self.attack_vision_range,
            "messages":
            (self.monster_message.to_dict() if self.monster_message else None),
            "skills":
            skills,
            "map_points":
            [point.to_dict(map_dict=True) for point in self.map_points],
            "drops": [drop.to_dict(item_dict=True) for drop in self.drops],
            "quests": [
                mission.quest.to_dict(minimal=True)
                for mission in self.quest_missions
            ]
        }
Beispiel #28
0
from webapp.extensions import bcrypt, db, loginmanager
from flask_login import UserMixin
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import current_app
from datetime import datetime

from markdown import markdown

import bleach

tags = db.Table('post_tags',
                db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
                db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')))


@loginmanager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


class User(UserMixin, db.Model):

    id = db.Column(db.Integer(), primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    location = db.Column(db.String(64))
    about_me = db.Column(db.Text())
    member_since = db.Column(db.DateTime(), default=datetime.utcnow)
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
    name = db.Column(db.String(64), unique=True)
    username = db.Column(db.String(255))
    password = db.Column(db.String(255))
Beispiel #29
0
from webapp.extensions import db
from werkzeug.security import check_password_hash, generate_password_hash
from flask_login import UserMixin, current_user
from sqlalchemy.sql import func
from sqlalchemy.sql.expression import or_, and_
from datetime import datetime
from flask import session

follows = db.Table('follows', db.Column('user_id', db.ForeignKey('user.id')),
                   db.Column('follow_id', db.ForeignKey('user.id')))


class User(db.Model, UserMixin):
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(20), unique=True)
    bio = db.Column(db.String(100))
    gender = db.Column(db.SmallInteger(), default=0)  # 1 男 2 女 0 未填写
    email = db.Column(db.String(50), unique=True, index=True)
    password = db.Column(db.String(255))
    reg_date = db.Column(db.TIMESTAMP(), server_default=func.now())
    last_login_date = db.Column(db.DateTime())
    wb_uid = db.Column(db.String(20))
    avatar = db.Column(db.String(500))
    tasks = db.relationship('Task', backref='user', lazy='dynamic')

    comments = db.relationship('Comment', backref='user', lazy='dynamic')

    following = db.relationship('User',
                                secondary=follows,
                                primaryjoin=(follows.c.user_id == id),
                                secondaryjoin=(follows.c.follow_id == id),
Beispiel #30
0
class Task(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(),
                        db.ForeignKey('user.id'),
                        nullable=False,
                        index=True)
    title = db.Column(db.String(100))
    text = db.Column(db.Text())
    create_time = db.Column(db.TIMESTAMP(), server_default=func.now())
    update_time = db.Column(db.DateTime(), onupdate=func.now())
    done_time = db.Column(db.DateTime())
    deadline = db.Column(db.DateTime(), nullable=False)
    status = db.Column(db.SmallInteger(), default=0)  # 0:进行中 1:已完成 2:暂停 9:删除
    public_level = db.Column(db.SmallInteger(), default=3,
                             index=True)  # 1:仅自己可见   2:我关注的人可见   3:所有人可见
    overtime = db.Column(db.Boolean, default=0)  # 任务结束后: 0:未超时 1:超时
    comment_allowed = db.Column(db.Boolean,
                                default=1)  # 0:禁止评论并隐藏所有评论内容 1:允许评论
    comments = db.relationship('Comment', backref='task', lazy='dynamic')

    liked = db.relationship('Likes', backref='task', lazy='dynamic')

    def __init__(self, title):
        self.title = title

    def __repr__(self):
        return '<Task: {}|User:{}>'.format(self.title, self.user_id)

    # 判断任务是否超时
    def is_overtime(self):
        if self.status == 0 and self.deadline > datetime.now():
            return False
        elif self.status == 1 and self.overtime == 0:
            return False
        else:
            return True

    # 超时时间
    def over_time(self):
        if self.status == 0 and self.deadline < datetime.now():
            over_time = datetime.now() - self.deadline
            if over_time.total_seconds() < 3600:
                return ''.join(
                    ['已超时',
                     str(int(over_time.total_seconds() / 60)), '分钟'])
            elif 3600 <= over_time.total_seconds() < 86400:
                return ''.join(
                    ['已超时',
                     str(int(over_time.total_seconds() / 3600)), '小时'])
            else:
                return ''.join(
                    ['已超时',
                     str(int(over_time.total_seconds() / 86400)), '天'])
        elif self.status == 1:
            over_time = self.done_time - self.deadline
            if over_time.total_seconds() < 3600:
                return ''.join(
                    ['超时',
                     str(int(over_time.total_seconds() / 60)), '分钟完成'])
            elif 3600 <= over_time.total_seconds() < 86400:
                return ''.join(
                    ['超时',
                     str(int(over_time.total_seconds() / 3600)), '小时完成'])
            else:
                return ''.join(
                    ['超时',
                     str(int(over_time.total_seconds() / 86400)), '天完成'])
        else:
            pass

    # 给任务点赞的所有user_id
    def liked_user(self):
        return list(u.user_id for u in self.liked.all())

    # 判断是否已点赞
    def check_liked(self):
        if current_user.id in self.liked_user():
            return True

    # 距离超时一小时
    def one_hour_deadline(self):
        the_time = self.deadline - datetime.now()
        if 0 < the_time.total_seconds() < 3600:
            return True

    # 判断当前用户是否有权限查看当前task
    def task_auth(self):
        task_user = User.query.get(self.user_id)
        if current_user.id == self.user_id or self.public_level == 3 or (
                current_user in task_user.follower.all()
                and self.public_level == 2):
            return True
        else:
            return False