Rearchitect badges to be defined in data

This commit is contained in:
justcool393 2023-07-23 07:59:22 -05:00
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

View file

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Before After
Before After

View file

@ -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})>"