class Article(BaseModel): title = CharField(unique=True, verbose_name="title") content = TextField(verbose_name="content") tag = ForeignKeyField(Tag, related_name="articles", verbose_name="tag") create_time = DateTimeField(default=datetime.now, verbose_name="create time") up_time = DateTimeField(default=datetime.now, verbose_name="create time")
class ItemModel(BaseSQLModel): id = AutoField() title = CharField(max_length=64) user = ForeignKeyField(UserModel, backref="items", on_delete="CASCADE") category = ForeignKeyField(CategoryModel, backref="items", on_delete="CASCADE") brand = ForeignKeyField(BrandModel, backref="items", on_delete="CASCADE") tags = ManyToManyField(TagModel, backref="items") condition = CharField(choices=ItemCondition) value = DecimalField(decimal_places=2, auto_round=True) currency = CharField(choices=Currency) description = CharField(max_length=128) status = CharField(choices=ItemStatus, default=ItemStatus.AVAILABLE) preference_score_rate = DecimalField(decimal_places=2, auto_round=True, default=0) popularity_rate = DecimalField(decimal_places=2, auto_round=True, default=0) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "items" def __str__(self): return self.name
class Workout(BaseModel): id = PrimaryKeyField() name = CharField(null=False) category = CharField() start_time = DateTimeField(default=datetime.now()) end_time = DateTimeField(null=True) creator = CharField(null=False) exercises = JSONField(default=[])
class ListModel(BaseSQLModel): id = AutoField() # TODO: Restrict author must be role ADMIN author = ForeignKeyField(UserModel, backref="lists", on_delete="CASCADE") title = CharField(max_length=256) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "lists"
class CardModel(BaseSQLModel): id = AutoField() author = ForeignKeyField(UserModel, backref="cards", on_delete="CASCADE") list = ForeignKeyField(ListModel, backref="cards", on_delete="CASCADE") title = CharField(max_length=256) description = CharField(max_length=1024) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "cards"
class CommentReplyModel(BaseSQLModel): id = AutoField() author = ForeignKeyField(UserModel, backref="replies", on_delete="CASCADE") comment = ForeignKeyField(CommentModel, backref="replies", on_delete="CASCADE") content = CharField(max_length=256) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) class Meta(BaseSQLModel): table_name = "comment_replies"
class CommentModel(BaseSQLModel): id = AutoField() author = ForeignKeyField(UserModel, backref="comments", on_delete="CASCADE") card = ForeignKeyField(CardModel, backref="comments", on_delete="CASCADE") content = CharField(max_length=256) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "comments"
class MatchModel(BaseSQLModel): id = AutoField() item_a = ForeignKeyField(ItemModel, index=True, related_name="matches_a") item_b = ForeignKeyField(ItemModel, index=True, related_name="matches_b") date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "matches" def __str__(self): return f"{self.item_a} - {self.item_b}"
class ImageModel(BaseSQLModel): id = AutoField() url = CharField(max_length=256) item = ForeignKeyField(ItemModel, backref="images", on_delete="CASCADE") date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "images" def __str__(self): return self.url
class UserModel(BaseSQLModel, UserMixin): id = AutoField() username = CharField(unique=True, index=True, max_length=16) email_address = CharField(unique=True, max_length=256) salt = BlobField() key = BlobField() role = CharField(default=UserRole.MEMBER) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "users"
class CategoryModel(BaseSQLModel): id = AutoField() name = CharField(unique=True, max_length=64) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "categories" def __str__(self): return self.name def save(self, *args, **kwargs): self.name = self.name.lower() return super().save(*args, **kwargs)
class WordEmbedding(BaseModel): word = CharField(null=False) embedding = BinaryJSONField(null=False) version = IntegerField(null=False) inserted_at = DateTimeField(null=False, default=datetime.now) class Meta: db_table = 'word_embeddings'
class Post(BaseModel): id = PrimaryKeyField() comments = JSONField(default=[]) photo = CharField(null=True) caption = CharField(null=True) date = DateTimeField(default=datetime.now()) original_workout = ForeignKeyField(Workout) class Meta: index = ('post', 'original_workout')
class Recipient(db.Model): created_at = DateTimeField(default=datetime.utcnow) sent_at = DateTimeField(null=True) opened_at = DateTimeField(null=True) linked_at = DateTimeField(null=True) campaign_id = ForeignKeyField(PushCampaign, backref='recipients') wallet_link_id = CharField() email = CharField() name = TextField() amount_pip = CharField() target_shop = CharField(null=True) @property def target_route(self): y_food_url = '/food,grocery/%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%95%D0%B4%D0%B0/certificate/' b2ph_url = '/mobile' return y_food_url if self.target_shop == 'y-food' else b2ph_url if self.target_shop == 'bip2ph' else ''
class TagModel(BaseSQLModel): id = AutoField() value = CharField(unique=True, max_length=64) date_created = DateTimeField(null=True) date_updated = DateTimeField(null=True) is_deleted = BooleanField(default=False) class Meta(BaseSQLModel): table_name = "tags" def __str__(self): return self.value def get(self, **kwargs): kwargs["value"] = kwargs["value"].lower() return super().get(**kwargs) def save(self, *args, **kwargs): self.value = self.value.lower() return super().save(*args, **kwargs)
class OrderHistory(db.Model): timestamp = DateTimeField(default=datetime.utcnow) provider = CharField() product_id = CharField() price_pip = CharField() address_from = CharField() address_to = CharField() contact = CharField(null=True) notified = BooleanField(default=False)
class User(db.Model, UserMixin): username = CharField(null=True) email = CharField(null=True) password = CharField(null=True) active = BooleanField(default=True) confirmed_at = DateTimeField(null=True) last_login_at = DateTimeField(null=True) current_login_at = DateTimeField(null=True) last_login_ip = IPField(null=True) current_login_ip = IPField(null=True) login_count = IntegerField(null=True) @property def is_anonymous(self): return self.has_role('anonymous') or not self.roles @property def is_authenticated(self): return not self.is_anonymous def __str__(self): return f"{self.username or self.id} anonymous={self.is_anonymous}"
class Sale(BaseModel): id = IntegerField(primary_key=True) city = CharField(null=True) district = CharField(null=True) address = CharField(null=True) latitude = FloatField(null=True) longitude = FloatField(null=True) floor = IntegerField(null=True) number_of_floors = IntegerField(null=True) number_of_rooms = IntegerField(null=True) kitchen_area = FloatField(null=True) living_area = FloatField(null=True) total_area = FloatField(null=True) walling = CharField(null=True) price_amount = FloatField(null=True) price_currency = CharField(null=True) seller = CharField(null=True) resale = BooleanField(null=True) image = CharField(null=True) url = CharField(null=True) created_at = DateTimeField(default=datetime.utcnow) updated_at = DateTimeField(default=datetime.utcnow)
class Grant(BaseModel): grant_id = PrimaryKeyField(db_column='GRANT_ID', sequence='grant_id_sequence') user_id = ForeignKeyField(db_column='USER_ID', rel_model=User, to_field='id') client_id = ForeignKeyField(db_column='CLIENT_ID', rel_model=Client, to_field='client_id') code = TextField(db_column='CODE', null=False) redirect_uri = TextField(db_column='REDIRECT_URI', null=True) expires = DateTimeField(db_column='EXPIRES', null=True) scopes = TextField(db_column='SCOPES', null=True) class Meta: db_table = 'GRANT'
class Token(BaseModel): token_id = PrimaryKeyField(db_column='TOKEN_ID', sequence='token_id_sequence') user_id = ForeignKeyField(db_column='USER_ID', rel_model=User, to_field='id') client_id = ForeignKeyField(db_column='CLIENT_ID', rel_model=Client, to_field='client_id') # currently only bearer is supported token_type = TextField(db_column='TOKEN_TYPE') access_token = TextField(db_column='ACCESS_TOKEN') refresh_token = TextField(db_column='REFRESH_TOKEN') expires = DateTimeField(db_column='EXPIRES') scopes = TextField(db_column='SCOPES') class Meta: db_table = 'TOKEN'
class Chat(BaseModel): id = PrimaryKeyField() events = JSONField(default=[]) name = CharField() date_created = DateTimeField(default=datetime.now) background = CharField(default="default")
class AuthId(BaseModel): auth_id = CharField(unique=True, null=False) user = ForeignKeyField(User) date_created = DateTimeField(default=datetime.now)
class UserImage(db.Model): filename = TextField(null=True) url = TextField(default='') created_at = DateTimeField(default=datetime.utcnow)
class MigrationHistory(BaseModel): migration = CharField() applied_at = DateTimeField(default=datetime.utcnow)
class WebhookEvent(db.Model): timestamp = DateTimeField(default=datetime.utcnow) provider = CharField() event_id = CharField() event_data = JSONField()