From 1476d4262d9f1312090858ec84e5cbb2a931fba1 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 21 Oct 2024 16:59:25 +0300 Subject: [PATCH] trick-import --- orm/community.py | 55 +++++++++++++++++++++++++++++++++--------------- orm/shout.py | 11 +--------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/orm/community.py b/orm/community.py index 1a5fc6b6..6e1f2b76 100644 --- a/orm/community.py +++ b/orm/community.py @@ -1,21 +1,19 @@ import enum import time -from sqlalchemy import ARRAY, Column, ForeignKey, Integer, String, distinct, func +from sqlalchemy import Column, ForeignKey, Integer, String, Text, distinct, func from sqlalchemy.ext.hybrid import hybrid_property from orm.author import Author -from orm.shout import Shout from services.db import Base class CommunityRole(enum.Enum): - AUTHOR = "author" - READER = "reader" - EDITOR = "editor" - CRITIC = "critic" - EXPERT = "expert" - ARTIST = "artist" + READER = "reader" # can read and comment + AUTHOR = "author" # + can vote and invite collaborators + ARTIST = "artist" # + can be credited as featured artist + EXPERT = "expert" # + can add proof or disproof to shouts, can manage topics + EDITOR = "editor" # + can manage topics, comments and community settings @classmethod def as_string_array(cls, roles): @@ -28,7 +26,7 @@ class CommunityFollower(Base): author = Column(ForeignKey("author.id"), primary_key=True) community = Column(ForeignKey("community.id"), primary_key=True) joined_at = Column(Integer, nullable=False, default=lambda: int(time.time())) - roles = Column(ARRAY(String), nullable=False, default=lambda: CommunityRole.as_string_array([CommunityRole.READER])) + roles = Column(Text, nullable=True, comment="Roles (comma-separated)") def set_roles(self, roles): self.roles = CommunityRole.as_string_array(roles) @@ -51,6 +49,14 @@ class Community(Base): def stat(self): return CommunityStats(self) + @property + def role_list(self): + return self.roles.split(",") if self.roles else [] + + @role_list.setter + def role_list(self, value): + self.roles = ",".join(value) if value else None + class CommunityStats: def __init__(self, community): @@ -58,11 +64,9 @@ class CommunityStats: @property def shouts(self): - return ( - self.community.session.query(func.count(Shout.id)) - .filter(Shout.community == self.community.id) - .scalar() - ) + from orm.shout import Shout + + return self.community.session.query(func.count(Shout.id)).filter(Shout.community == self.community.id).scalar() @property def followers(self): @@ -74,12 +78,29 @@ class CommunityStats: @property def authors(self): + from orm.shout import Shout + # author has a shout with community id and its featured_at is not null return ( self.community.session.query(func.count(distinct(Author.id))) .join(Shout) - .filter( - Shout.community == self.community.id, Shout.featured_at.is_not(None), Author.id.in_(Shout.authors) - ) + .filter(Shout.community == self.community.id, Shout.featured_at.is_not(None), Author.id.in_(Shout.authors)) .scalar() ) + + +class CommunityAuthor(Base): + __tablename__ = "community_author" + + id = Column(Integer, primary_key=True) + community_id = Column(Integer, ForeignKey("community.id")) + author_id = Column(Integer, ForeignKey("author.id")) + roles = Column(Text, nullable=True, comment="Roles (comma-separated)") + + @property + def role_list(self): + return self.roles.split(",") if self.roles else [] + + @role_list.setter + def role_list(self, value): + self.roles = ",".join(value) if value else None diff --git a/orm/shout.py b/orm/shout.py index 61e27dfd..008826fd 100644 --- a/orm/shout.py +++ b/orm/shout.py @@ -4,7 +4,6 @@ from sqlalchemy import JSON, Boolean, Column, ForeignKey, Integer, String from sqlalchemy.orm import relationship from orm.author import Author -from orm.community import Community from orm.reaction import Reaction from orm.topic import Topic from services.db import Base @@ -39,14 +38,6 @@ class ShoutAuthor(Base): caption = Column(String, nullable=True, default="") -class ShoutCommunity(Base): - __tablename__ = "shout_community" - - id = None # type: ignore - shout = Column(ForeignKey("shout.id"), primary_key=True, index=True) - community = Column(ForeignKey("community.id"), primary_key=True, index=True) - - class Shout(Base): __tablename__ = "shout" @@ -59,6 +50,7 @@ class Shout(Base): created_by = Column(ForeignKey("author.id"), nullable=False) updated_by = Column(ForeignKey("author.id"), nullable=True) deleted_by = Column(ForeignKey("author.id"), nullable=True) + community = Column(ForeignKey("community.id"), nullable=False) body = Column(String, nullable=False, comment="Body") slug = Column(String, unique=True) @@ -73,7 +65,6 @@ class Shout(Base): authors = relationship(Author, secondary="shout_author") topics = relationship(Topic, secondary="shout_topic") - communities = relationship(Community, secondary="shout_community") reactions = relationship(Reaction) lang = Column(String, nullable=False, default="ru", comment="Language")