76 lines
1.7 KiB
Python
76 lines
1.7 KiB
Python
from dataclasses import dataclass
|
|
|
|
from sqlalchemy.sql.schema import Column, ForeignKey, Index
|
|
from sqlalchemy.sql.sqltypes import Integer, String
|
|
from sqlalchemy.orm import relationship
|
|
from files.classes.base import Base
|
|
from files.helpers.lazy import lazy
|
|
from files.helpers.config.const import *
|
|
from files.helpers.assetcache import assetcache_path
|
|
|
|
@dataclass(frozen=True, kw_only=True, slots=True)
|
|
class BadgeDef:
|
|
id: str
|
|
name: str
|
|
description: str
|
|
|
|
BADGES: list[BadgeDef] = [
|
|
BadgeDef(
|
|
id="unknown",
|
|
name="Unknown Badge",
|
|
description="Please report this if you see it! :x"
|
|
),
|
|
BadgeDef(
|
|
id="verified_email",
|
|
name="Verified Email",
|
|
description="Verified Email"
|
|
),
|
|
]
|
|
|
|
BADGES_DICT: dict[str, BadgeDef] = {badge.id:badge for badge in BADGES}
|
|
|
|
class Badge(Base):
|
|
__tablename__ = "badges"
|
|
|
|
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
|
|
badge_id = Column(String, nullable=False)
|
|
description = Column(String)
|
|
url = Column(String)
|
|
|
|
Index('badges_badge_id_idx', badge_id)
|
|
|
|
user = relationship("User", viewonly=True)
|
|
|
|
@property
|
|
def badge(self) -> BadgeDef:
|
|
return BADGES_DICT.get(self.badge_id, BADGES_DICT['unknown'])
|
|
|
|
def __repr__(self):
|
|
return f"<{self.__class__.__name__}(user_id={self.user_id}, badge_id={self.badge_id})>"
|
|
|
|
@property
|
|
@lazy
|
|
def text(self):
|
|
if self.description: text = self.description
|
|
elif self.badge.description: text = self.badge.description
|
|
else: return self.name
|
|
return f'{self.name} - {text}'
|
|
|
|
@property
|
|
@lazy
|
|
def name(self):
|
|
return self.badge.name
|
|
|
|
@property
|
|
@lazy
|
|
def path(self):
|
|
return assetcache_path(f'images/badges/{self.badge_id}.webp')
|
|
|
|
@property
|
|
@lazy
|
|
def json(self):
|
|
return {'text': self.text,
|
|
'name': self.name,
|
|
'url': self.url,
|
|
'icon_url':self.path
|
|
}
|