2022-07-21 11:58:50 +00:00
|
|
|
import asyncio
|
|
|
|
from orm.topic import Topic
|
|
|
|
|
|
|
|
|
|
|
|
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():
|
2022-08-13 09:48:07 +00:00
|
|
|
self.load_parents(topic)
|
2022-07-21 11:58:50 +00:00
|
|
|
|
2022-08-13 16:19:16 +00:00
|
|
|
print('[zine.topics] %d precached' % len(self.topics.keys()))
|
2022-07-21 11:58:50 +00:00
|
|
|
|
|
|
|
@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_all():
|
|
|
|
self = TopicStorage
|
|
|
|
async with self.lock:
|
|
|
|
return self.topics.values()
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
async def get_topics_by_slugs(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)
|