rDrama/files/classes/sub.py

83 lines
2.3 KiB
Python

from random import Random
import time
from typing import Optional
from sqlalchemy import Column
from sqlalchemy.ext.mutable import MutableList
from sqlalchemy.orm import relationship
from sqlalchemy.types import VARCHAR, Boolean, Integer
from sqlalchemy.dialects.postgresql import ARRAY
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(MutableList.as_mutable(ARRAY(VARCHAR(SUB_BANNER_URL_COLUMN_LENGTH))), default=MutableList([]), nullable=False)
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 self.banner_urls: return None
if not random: random = Random()
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)