Example #1
0
class Some(Document):
    citizenship = fields.StrField()  # Гражданство
    destination_country = fields.StrField()  # Страна назначения
    document = fields.StrField()  # Необходимый документ
    fields_groups = fields.ListField(fields.DictField())
    fields = fields.ListField(fields.DictField())
 class MyDoc(Document):
     e = fields.EmbeddedField(MyEmbeddedDocument)
     li = fields.ListField(fields.EmbeddedField(MyEmbeddedDocument))
     b = fields.IntField(required=True)
Example #3
0
 class MySchema(BaseSchema):
     d_list = fields.ListField(fields.IntField(), default=(1, 2, 3))
     c_list = fields.ListField(fields.IntField(),
                               default=lambda: (1, 2, 3))
Example #4
0
 class NestedDoc(EmbeddedDocument):
     simple = fields.StrField()
     listed = fields.ListField(fields.StrField())
        class Doc(Document):
            nested = fields.EmbeddedField(NestedDoc)
            listed = fields.ListField(fields.EmbeddedField(NestedDoc))

            class Meta:
                indexes = ['nested', 'nested.simple', 'listed', 'listed.simple', 'listed.listed']
Example #6
0
 class MyDoc(Document):
     embedded = fields.EmbeddedField(MyEmbedded)
     embedded_required = fields.EmbeddedField(MyEmbedded, required=True)
     embedded_list = fields.ListField(fields.EmbeddedField(MyEmbedded))
     embedded_dict = fields.DictField(
         values=fields.EmbeddedField(MyEmbedded))
Example #7
0
 class MySchema(Schema):
     list = fields.ListField(fields.IntField(),
                             attribute='in_mongo_list')
Example #8
0
 class Book(Document):
     title = fields.StrField(attribute='t')
     author = fields.EmbeddedField(Author, attribute='a')
     chapters = fields.ListField(fields.EmbeddedField(Chapter),
                                 attribute='c')
Example #9
0
class PokemonBase(MixinDocument):
    class Meta:
        strict = False
        abstract = True

    id = fields.ObjectIdField(attribute="_id")
    timestamp = fields.DateTimeField(default=datetime.utcnow)
    owner_id = fields.IntegerField(required=True)
    idx = fields.IntegerField(required=True)

    species_id = fields.IntegerField(required=True)
    level = fields.IntegerField(required=True)
    xp = fields.IntegerField(required=True)
    nature = fields.StringField(required=True)

    iv_hp = fields.IntegerField(required=True)
    iv_atk = fields.IntegerField(required=True)
    iv_defn = fields.IntegerField(required=True)
    iv_satk = fields.IntegerField(required=True)
    iv_sdef = fields.IntegerField(required=True)
    iv_spd = fields.IntegerField(required=True)

    nickname = fields.StringField(default=None)
    favorite = fields.BooleanField(default=False)

    shiny = fields.BooleanField(required=True)
    held_item = fields.IntegerField(default=None)

    moves = fields.ListField(fields.IntegerField, default=list)

    _hp = None
    ailments = None
    stages = None

    @classmethod
    def random(cls, **kwargs):
        return cls(
            iv_hp=random_iv(),
            iv_atk=random_iv(),
            iv_defn=random_iv(),
            iv_satk=random_iv(),
            iv_sdef=random_iv(),
            iv_spd=random_iv(),
            nature=random_nature(),
            shiny=random.randint(1, 4096) == 1,
            **kwargs,
        )

    @property
    def species(self):
        return self.bot.data.species_by_number(self.species_id)

    @property
    def max_xp(self):
        return 250 + 25 * self.level

    @property
    def max_hp(self):
        if self.species_id == 292:
            return 1
        return ((2 * self.species.base_stats.hp + self.iv_hp + 5) *
                self.level // 100 + self.level + 10)

    @property
    def hp(self):
        if self._hp is None:
            return self.max_hp
        return self._hp

    @hp.setter
    def hp(self, value):
        self._hp = value

    @property
    def atk(self):
        return math.floor(
            ((2 * self.species.base_stats.atk + self.iv_atk + 5) *
             self.level // 100 + 5) *
            constants.NATURE_MULTIPLIERS[self.nature]["atk"])

    @property
    def defn(self):
        return math.floor(
            ((2 * self.species.base_stats.defn + self.iv_defn + 5) *
             self.level // 100 + 5) *
            constants.NATURE_MULTIPLIERS[self.nature]["defn"])

    @property
    def satk(self):
        return math.floor(
            ((2 * self.species.base_stats.satk + self.iv_satk + 5) *
             self.level // 100 + 5) *
            constants.NATURE_MULTIPLIERS[self.nature]["satk"])

    @property
    def sdef(self):
        return math.floor(
            ((2 * self.species.base_stats.sdef + self.iv_sdef + 5) *
             self.level // 100 + 5) *
            constants.NATURE_MULTIPLIERS[self.nature]["sdef"])

    @property
    def spd(self):
        return math.floor(
            ((2 * self.species.base_stats.spd + self.iv_spd + 5) *
             self.level // 100 + 5) *
            constants.NATURE_MULTIPLIERS[self.nature]["spd"])

    @property
    def iv_percentage(self):
        return (self.iv_hp / 31 + self.iv_atk / 31 + self.iv_defn / 31 +
                self.iv_satk / 31 + self.iv_sdef / 31 + self.iv_spd / 31) / 6

    def get_next_evolution(self, is_day):
        if self.species.evolution_to is None or self.held_item == 13001:
            return None

        possible = []

        for evo in self.species.evolution_to.items:
            if not isinstance(evo.trigger, models.LevelTrigger):
                continue

            can = True

            if evo.trigger.level and self.level < evo.trigger.level:
                can = False
            if evo.trigger.item and self.held_item != evo.trigger.item_id:
                can = False
            if evo.trigger.move_id and evo.trigger.move_id not in self.moves:
                can = False
            if evo.trigger.move_type_id and not any([
                    self.bot.data.move_by_number(x).type_id
                    == evo.trigger.move_type_id for x in self.moves
            ]):
                can = False
            if (evo.trigger.time == "day" and not is_day
                    or evo.trigger.time == "night" and is_day):
                can = False

            if evo.trigger.relative_stats == 1 and self.atk <= self.defn:
                can = False
            if evo.trigger.relative_stats == -1 and self.defn <= self.atk:
                can = False
            if evo.trigger.relative_stats == 0 and self.atk != self.defn:
                can = False

            if can:
                possible.append(evo.target)

        if len(possible) == 0:
            return None

        return random.choice(possible)

    def can_evolve(self, ctx):
        return self.get_next_evolution() is not None
Example #10
0
 class IOStudent(Student):
     io_field = fields.ListField(
         fields.IntField(io_validate=io_validate), allow_none=True)
Example #11
0
 class MySchema(BaseSchema):
     a = fields.ListField(fields.IntField())
     b = fields.ListField(fields.IntField(), attribute='in_mongo_b')
Example #12
0
class Order(Document):
    order = fields.IntegerField(required=True, unique=True)
    products = fields.ListField(fields.ReferenceField(Product))
    user_id = fields.IntegerField(required=True, unique=True)
    order_time = fields.DateTimeField()
    deletion_time = fields.DateTimeField()
Example #13
0
 class MySchema(EmbeddedSchema):
     a = fields.EmbeddedField(MyEmbedded)
     b = fields.ListField(fields.IntField)
Example #14
0
 class MySchema(EmbeddedSchema):
     # EmbeddedField need instance to retrieve implementation
     listed = fields.ListField(
         fields.EmbeddedField(MyEmbedded, instance=self.instance))
     embedded = fields.EmbeddedField(MyEmbedded, instance=self.instance)
     required = fields.IntField(required=True)
Example #15
0
 class Bag(Document):
     id = fields.EmbeddedField(Accessory,
                               attribute='_id',
                               required=True)
     content = fields.ListField(fields.EmbeddedField(Accessory))
Example #16
0
 class MySchema(EmbeddedSchema):
     # EmbeddedField need instance to retrieve implementation
     a = fields.EmbeddedField(MyEmbedded, instance=self.instance)
     b = fields.ListField(fields.IntField)
Example #17
0
 class Bag(MyDocument):
     item = fields.EmbeddedField(Accessory)
     content = fields.ListField(fields.EmbeddedField(Accessory))
Example #18
0
class PokemonBase(MixinDocument):
    class Meta:
        strict = False
        abstract = True

    # General
    id = fields.ObjectIdField(attribute="_id")
    timestamp = fields.DateTimeField(default=datetime.utcnow)
    owner_id = fields.IntegerField(required=True)
    idx = fields.IntegerField(required=True)

    # Details
    species_id = fields.IntegerField(required=True)
    level = fields.IntegerField(required=True)
    xp = fields.IntegerField(required=True)
    nature = fields.StringField(required=True)
    shiny = fields.BooleanField(required=True)

    # Stats
    iv_hp = fields.IntegerField(required=True)
    iv_atk = fields.IntegerField(required=True)
    iv_defn = fields.IntegerField(required=True)
    iv_satk = fields.IntegerField(required=True)
    iv_sdef = fields.IntegerField(required=True)
    iv_spd = fields.IntegerField(required=True)

    iv_total = fields.IntegerField(required=False)

    # Customization
    nickname = fields.StringField(default=None)
    favorite = fields.BooleanField(default=False)
    held_item = fields.IntegerField(default=None)
    moves = fields.ListField(fields.IntegerField, default=list)
    has_color = fields.BooleanField(default=False)
    color = fields.IntegerField(default=None)

    _hp = None
    ailments = None
    stages = None

    def __format__(self, spec):
        if self.shiny:
            name = "✨ "
        else:
            name = ""

        if "l" in spec:
            name += f"Level {self.level} "

        elif "L" in spec:
            name += f"L{self.level} "

        if "p" in spec:
            name += f"{self.iv_percentage:.2%} "

        if self.bot.sprites.status and "i" in spec:
            sprite = self.bot.sprites.get(self.species.dex_number,
                                          shiny=self.shiny)
            name = sprite + " " + name

        name += str(self.species)

        if self.nickname is not None and "n" in spec:
            name += ' "' + self.nickname + '"'

        if self.favorite and "f" in spec:
            name += " ❤️"

        return name

    def __str__(self):
        return f"{self}"

    @classmethod
    def random(cls, **kwargs):
        ivs = [random_iv() for i in range(6)]
        return cls(
            iv_hp=ivs[0],
            iv_atk=ivs[1],
            iv_defn=ivs[2],
            iv_satk=ivs[3],
            iv_sdef=ivs[4],
            iv_spd=ivs[5],
            iv_total=sum(ivs),
            nature=random_nature(),
            shiny=random.randint(1, 4096) == 1,
            **kwargs,
        )

    @property
    def species(self):
        return self.bot.data.species_by_number(self.species_id)

    @property
    def max_xp(self):
        return 250 + 25 * self.level

    @property
    def max_hp(self):
        if self.species_id == 292:
            return 1
        return ((2 * self.species.base_stats.hp + self.iv_hp + 5) *
                self.level // 100 + self.level + 10)

    @property
    def hp(self):
        if self._hp is None:
            return self.max_hp
        return self._hp

    @hp.setter
    def hp(self, value):
        self._hp = value

    @property
    def atk(self):
        return calc_stat(self, "atk")

    @property
    def defn(self):
        return calc_stat(self, "defn")

    @property
    def satk(self):
        return calc_stat(self, "satk")

    @property
    def sdef(self):
        return calc_stat(self, "sdef")

    @property
    def spd(self):
        return calc_stat(self, "spd")

    @property
    def iv_percentage(self):
        return (self.iv_hp / 31 + self.iv_atk / 31 + self.iv_defn / 31 +
                self.iv_satk / 31 + self.iv_sdef / 31 + self.iv_spd / 31) / 6

    def get_next_evolution(self, is_day):
        if self.species.evolution_to is None or self.held_item == 13001:
            return None

        possible = []

        for evo in self.species.evolution_to.items:
            if not isinstance(evo.trigger, models.LevelTrigger):
                continue

            can = True

            if evo.trigger.level and self.level < evo.trigger.level:
                can = False
            if evo.trigger.item and self.held_item != evo.trigger.item_id:
                can = False
            if evo.trigger.move_id and evo.trigger.move_id not in self.moves:
                can = False
            if evo.trigger.move_type_id and not any([
                    self.bot.data.move_by_number(x).type_id
                    == evo.trigger.move_type_id for x in self.moves
            ]):
                can = False
            if evo.trigger.time == "day" and not is_day or evo.trigger.time == "night" and is_day:
                can = False

            if evo.trigger.relative_stats == 1 and self.atk <= self.defn:
                can = False
            if evo.trigger.relative_stats == -1 and self.defn <= self.atk:
                can = False
            if evo.trigger.relative_stats == 0 and self.atk != self.defn:
                can = False

            if can:
                possible.append(evo.target)

        if len(possible) == 0:
            return None

        return random.choice(possible)

    def can_evolve(self, ctx):
        return self.get_next_evolution() is not None
Example #19
0
 class Student(Document):
     name = fields.StrField(required=True)
     birthday = fields.DateTimeField()
     courses = fields.ListField(fields.ReferenceField(Course))
Example #20
0
 class MyDoc(Document):
     embedded_list = fields.ListField(fields.EmbeddedField(MyEmbedded),
                                      allow_none=True)
     embedded_dict = fields.DictField(
         values=fields.EmbeddedField(MyEmbedded), allow_none=True)
     embedded = fields.EmbeddedField(MyEmbedded, allow_none=True)
Example #21
0
class Areal(EmbeddedDocument, metaclass=MetaBaseTemplate):
    country = fields.StringField(required=True)
    cities = fields.ListField(fields.StringField, missing=list)
    geo = fields.ListField(fields.DictField)
Example #22
0
 class MySchema(BaseSchema):
     list = fields.ListField(fields.IntField(),
                             attribute='in_mongo_list',
                             allow_none=True)
Example #23
0
 class IOStudent(Student):
     io_field = fields.StrField(io_validate=io_validate)
     list_io_field = fields.ListField(fields.IntField(io_validate=io_validate))
     reference_io_field = fields.ReferenceField(
         classroom_model.Course, io_validate=io_validate)
     embedded_io_field = fields.EmbeddedField(EmbeddedDoc, io_validate=io_validate)
Example #24
0
 class MyDoc(Document):
     embeds = fields.ListField(fields.EmbeddedField(MyEmbeddedDocument))
     refs = fields.ListField(fields.ReferenceField(ToRefDoc))
Example #25
0
 class Team(Document):
     name = fields.StrField(attribute='n')
     leader = fields.EmbeddedField(Person, attribute='l')
     sponsors = fields.ListField(fields.EmbeddedField(Company),
                                 attribute='s')
Example #26
0
 class IOStudent(Student):
     io_field = fields.ListField(
         fields.IntField(io_validate=io_validate))
Example #27
0
class UserInChat(umongo.Document):  # noqa
    """
    User in some chat.
    """

    user: User = fields.ReferenceField(
        User)  # reference to main data about user
    chat: Chat = fields.ReferenceField(Chat)  # reference to current chat
    roles = fields.ListField(fields.ObjectIdField, default=[])
    warns: int = fields.IntegerField(default=0)

    join_date: int = fields.IntegerField(default=time.time)

    @staticmethod
    async def create_user(user: User,
                          chat: Chat,
                          roles_: typing.List[Role] = None,
                          join_date: int = None):
        """
        Create user in database
        """
        if join_date is None:
            join_date = time.time()

        if roles_ is None:
            roles = []
        else:
            roles = [role.pk for role in roles_]
        usr = UserInChat(user=user,
                         chat=chat,
                         roles=roles,
                         join_date=join_date)
        await usr.commit()
        return usr

    @staticmethod
    async def add_role(user: "******", role: str):
        """
        :param user:
        :param role: '_id' of object
        :return:
        """
        current = user.dump()
        roles: list = current["roles"]
        roles.append(role)
        user.update({"roles": roles})
        return await user.commit()

    @staticmethod
    async def get_user(chat: str, user: str):
        """
        Get user via chat '_id' and user '_id'
        :param chat: _id of chat
        :param user: _id of user
        :return:
        """
        usr = await UserInChat.find_one({"chat": chat, "user": user})
        return usr

    def get_roles(self) -> typing.AsyncGenerator[dict, None]:
        """
        Get user roles; Returns a async generator.
        :return:
        """
        roles = instance.db.role.aggregate([
            {
                "$match": {
                    "_id": {
                        "$in": self.roles
                    }
                }
            },
            {
                "$addFields": {
                    "_order": {
                        "$indexOfArray": [self.roles, "$_id"]
                    }
                }
            },
            {
                "$sort": {
                    "_order": 1
                }
            },
        ])
        return roles

    async def permissions(self,
                          roles: typing.AsyncGenerator[dict, None] = None):
        """
        Get user permissions
        :return:
        """
        if roles is None:
            roles = self.get_roles()
        permissions = DEFAULT_PERMISSIONS.copy()
        async for role in roles:
            permissions.update(role["permissions"])
        return permissions

    class Meta:
        collection = instance.db.users_in_chats