Rearchitect badges to be defined in data
This commit is contained in:
parent
fdf506cb2b
commit
3a463f5697
6 changed files with 27 additions and 16 deletions
Binary file not shown.
Before Width: | Height: | Size: 15 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
@ -1,38 +1,49 @@
|
||||||
from sqlalchemy import *
|
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 sqlalchemy.orm import relationship
|
||||||
from files.classes.base import Base
|
from files.classes.base import Base
|
||||||
from files.helpers.lazy import lazy
|
from files.helpers.lazy import lazy
|
||||||
from files.helpers.config.const import *
|
from files.helpers.config.const import *
|
||||||
from files.helpers.assetcache import assetcache_path
|
from files.helpers.assetcache import assetcache_path
|
||||||
|
|
||||||
class BadgeDef(Base):
|
@dataclass(frozen=True, kw_only=True, slots=True)
|
||||||
__tablename__ = "badge_defs"
|
class BadgeDef:
|
||||||
__table_args__ = (
|
id: str
|
||||||
UniqueConstraint('name', name='badge_def_name_unique'),
|
name: str
|
||||||
)
|
description: str
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
BADGES: list[BadgeDef] = [
|
||||||
name = Column(String, nullable=False)
|
BadgeDef(
|
||||||
description = Column(String)
|
id="unknown",
|
||||||
|
name="Unkown Badge",
|
||||||
|
description="Please report this if you see it! :x"
|
||||||
|
),
|
||||||
|
BadgeDef(
|
||||||
|
id="verified_email",
|
||||||
|
name="Verified Email",
|
||||||
|
description="Verified Email"
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
def __repr__(self):
|
BADGES_DICT: dict[str, BadgeDef] = {badge.id:badge for badge in BADGES}
|
||||||
return f"<{self.__class__.__name__}(id={self.id})>"
|
|
||||||
|
|
||||||
class Badge(Base):
|
class Badge(Base):
|
||||||
|
|
||||||
__tablename__ = "badges"
|
__tablename__ = "badges"
|
||||||
|
|
||||||
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
|
user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
|
||||||
badge_id = Column(Integer, ForeignKey('badge_defs.id'), primary_key=True)
|
badge_id = Column(String, nullable=False)
|
||||||
description = Column(String)
|
description = Column(String)
|
||||||
url = Column(String)
|
url = Column(String)
|
||||||
|
|
||||||
Index('badges_badge_id_idx', badge_id)
|
Index('badges_badge_id_idx', badge_id)
|
||||||
|
|
||||||
user = relationship("User", viewonly=True)
|
user = relationship("User", viewonly=True)
|
||||||
badge = relationship("BadgeDef",
|
|
||||||
primaryjoin="foreign(Badge.badge_id) == remote(BadgeDef.id)",
|
@property
|
||||||
lazy="joined", innerjoin=True, viewonly=True)
|
def badge(self) -> BadgeDef:
|
||||||
|
return BADGES_DICT.get(self.badge_id, BADGES_DICT['unknown'])
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<{self.__class__.__name__}(user_id={self.user_id}, badge_id={self.badge_id})>"
|
return f"<{self.__class__.__name__}(user_id={self.user_id}, badge_id={self.badge_id})>"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue