load topic parents

This commit is contained in:
knst-kotov
2021-12-12 16:00:38 +03:00
parent 5b6545536f
commit 04f2ceb629
5 changed files with 58 additions and 24 deletions

View File

@@ -2,7 +2,7 @@ from orm.rbac import Operation, Resource, Permission, Role, RoleStorage
from orm.community import Community
from orm.user import User, UserRating, UserRole, UserStorage
from orm.message import Message
from orm.topic import Topic, TopicSubscription
from orm.topic import Topic, TopicSubscription, TopicStorage
from orm.notification import Notification
from orm.shout import Shout, ShoutAuthor, ShoutTopic, ShoutRating, ShoutViewByDay,\
ShoutRatingStorage, ShoutViewStorage
@@ -23,3 +23,4 @@ with local_session() as session:
ShoutViewStorage.init(session)
RoleStorage.init(session)
UserStorage.init(session)
TopicStorage.init(session)

View File

@@ -3,6 +3,8 @@ from sqlalchemy import Table, Column, Integer, String, ForeignKey, DateTime, JSO
from sqlalchemy.orm import relationship
from orm.base import Base
import asyncio
class TopicSubscription(Base):
__tablename__ = "topic_subscription"
@@ -22,3 +24,48 @@ class Topic(Base):
pic: str = Column(String, nullable=True, comment="Picture")
children = Column(JSONType, nullable=True, comment="list of children topics")
community = Column(ForeignKey("community.slug"), nullable=False, comment="Community")
class TopicStorage:
topics = {}
lock = asyncio.Lock()
@staticmethod
def init(session):
self = TopicStorage
topics = session.query(Topic)
self.topics = dict([(topic.slug, topic) for topic in topics])
for topic in self.topics.values():
self.load_parents(topic)
@staticmethod
def load_parents(topic):
self = TopicStorage
parents = []
for parent in self.topics.values():
if topic.slug in parent.children:
parents.append(parent.slug)
topic.parents = parents
return topic
@staticmethod
async def get_topics(slugs):
self = TopicStorage
async with self.lock:
if not slugs:
return self.topics.values()
topics = filter(lambda topic: topic.slug in slugs, self.topics.values())
return list(topics)
@staticmethod
async def get_topics_by_community(community):
self = TopicStorage
async with self.lock:
topics = filter(lambda topic: topic.community == community, self.topics.values())
return list(topics)
@staticmethod
async def add_topic(topic):
self = TopicStorage
async with self.lock:
self.topics[topic.slug] = topic
self.load_parents(topic)