| import datetime |
| from typing import Optional |
|
|
| from peewee import * |
|
|
| from src.model.BaseModel import BaseModel |
| from src.model.GroupChat import GroupChat |
| from src.model.User import User |
| from src.model.enums.devil_fruit.DevilFruitCategory import DevilFruitCategory |
| from src.model.enums.devil_fruit.DevilFruitStatus import DevilFruitStatus |
| from src.model.enums.devil_fruit.DevilFruitTradeStatus import DevilFruitTradeStatus |
|
|
|
|
| class DevilFruit(BaseModel): |
| """ |
| DevilFruit class |
| """ |
|
|
| category: int | DevilFruitCategory = SmallIntegerField() |
| name: str | CharField = CharField(max_length=50) |
| model: str | CharField = CharField(max_length=50, null=True, unique=True) |
| status: DevilFruitTradeStatus | SmallIntegerField = SmallIntegerField( |
| default=DevilFruitStatus.NEW |
| ) |
| owner: User | ForeignKeyField = ForeignKeyField( |
| User, null=True, backref="devil_fruit_owners", on_delete="RESTRICT", on_update="CASCADE" |
| ) |
| collection_date: datetime.datetime | DateTimeField = DateTimeField(null=True) |
| eaten_date: datetime.datetime | DateTimeField = DateTimeField(null=True) |
| expiration_date: datetime.datetime | DateTimeField = DateTimeField(null=True) |
| release_group_chat: GroupChat | ForeignKeyField = ForeignKeyField( |
| GroupChat, |
| null=True, |
| backref="devil_fruit_release_groups_chats", |
| on_delete="RESTRICT", |
| on_update="CASCADE", |
| ) |
| release_date = DateTimeField(null=True) |
| release_message_id = IntegerField(null=True) |
| should_show_abilities = BooleanField(default=False) |
| is_defective = BooleanField(default=False) |
|
|
| class Meta: |
| db_table = "devil_fruit" |
|
|
| def get_full_name(self) -> str: |
| """ |
| Get fruit full name |
| :return: Fruit full name |
| """ |
| if self.model: |
| return f"{self.name}, Model: {self.model}" |
|
|
| if self.get_category() is DevilFruitCategory.SMILE: |
| return f"{self.name} SMILE" |
|
|
| return str(self.name) |
|
|
| @staticmethod |
| def get_by_owner_if_eaten(user: User) -> Optional["DevilFruit"]: |
| """ |
| Get the devil fruit eaten by the user |
| :param user: The user |
| :return: The devil fruit |
| """ |
|
|
| return DevilFruit.get_or_none( |
| DevilFruit.owner == user, DevilFruit.status == DevilFruitStatus.EATEN |
| ) |
|
|
| def get_average_price(self) -> int: |
| """ |
| Get the average price of the sold fruits of the same category |
| :return: The average price |
| """ |
|
|
| from src.model.DevilFruitTrade import DevilFruitTrade |
|
|
| return DevilFruitTrade.get_average_price(self.category) |
|
|
| def get_category(self) -> DevilFruitCategory: |
| """ |
| Get the category of the devil fruit |
| :return: The category |
| """ |
| return DevilFruitCategory(self.category) |
|
|
| def get_status(self) -> DevilFruitStatus: |
| """ |
| Get the status of the devil fruit |
| :return: The status |
| """ |
| return DevilFruitStatus(self.status) |
|
|
|
|
| DevilFruit.create_table() |
|
|