from random import Random import time from typing import Optional from sqlalchemy import Column from sqlalchemy.orm import relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy from files.helpers.config.const import * from .sub_relationship import * class Sub(Base): __tablename__ = "subs" name = Column(VARCHAR(SUB_NAME_COLUMN_LENGTH), primary_key=True) sidebar = Column(VARCHAR(SUB_SIDEBAR_COLUMN_LENGTH)) sidebar_html = Column(VARCHAR(SUB_SIDEBAR_HTML_COLUMN_LENGTH)) sidebarurl = Column(VARCHAR(SUB_SIDEBAR_URL_COLUMN_LENGTH)) bannerurls = Column(ARRAY(VARCHAR(SUB_BANNER_URL_COLUMN_LENGTH))) marseyurl = Column(VARCHAR(SUB_MARSEY_URL_LENGTH)) css = Column(VARCHAR(SUB_CSS_COLUMN_LENGTH)) stealth = Column(Boolean) created_utc = Column(Integer) blocks = relationship("SubBlock", primaryjoin="SubBlock.sub==Sub.name") followers = relationship("SubSubscription", primaryjoin="SubSubscription.sub==Sub.name") joins = relationship("SubJoin", lazy="dynamic", primaryjoin="SubJoin.sub==Sub.name") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) super().__init__(*args, **kwargs) def __repr__(self): return self.name @property @lazy def sidebar_url(self): if self.sidebarurl: return SITE_FULL + self.sidebarurl return f'/i/{SITE_NAME}/sidebar.webp?v=3009' @property @lazy def banner_urls(self): if self.bannerurls: return [f"{SITE_FULL}{banner}" for banner in self.bannerurls] return [] @lazy def random_banner(self, random:Optional[Random]=None): if not random: random = Random() if not self.banner_urls: return None return random.choice(self.banner_urls) @property @lazy def has_banners(self) -> bool: return bool(self.bannerurls) @property @lazy def marsey_url(self): if self.marseyurl: return SITE_FULL + self.marseyurl return f'/i/{SITE_NAME}/headericon.webp?v=3009' @property @lazy def join_num(self): return self.joins.count() @property @lazy def block_num(self): return len(self.blocks) @property @lazy def follow_num(self): return len(self.followers)