smash2/db.py
2020-11-21 18:44:08 +00:00

71 lines
1.7 KiB
Python

import pymongo, nanoid
from config import config
connection = pymongo.MongoClient(config["db"]["server"])
db = connection[config["db"]["database"]]
qdb = db[config["db"]["collection"]]
count_live_quotes = lambda: qdb.find({"hidden": False, "approved": True}).count()
quote_live = lambda quote_id: bool(qdb.find_one({"hidden": False, "approved": True}))
tag_live = lambda tag: bool(
qdb.find_one({"hidden": False, "approved": True, "tags": tag})
)
def get_random_quote():
# TODO: there might be a better way to get a random document
x = list(
qdb.aggregate(
[{"$match": {"hidden": False, "approved": True}}, {"$sample": {"size": 1}}]
)
)[0]
return x if x else False
def get_quote_by_id(quote_id):
if quote_live(quote_id):
return qdb.find_one({"id": quote_id})
else:
return False
def add_quote(quote, tags, author):
quote_id = nanoid.generate(size=config["quote-id-length"])
qdb.insert_one(
{
"id": quote_id,
"quote": quote,
"tags": tags,
"author": author,
"hidden": False,
"approved": False,
}
)
return quote_id
def get_latest_quotes(page=1):
return list(
qdb.find({"hidden": False, "approved": True})
.sort("_id", -1)
.limit(page * 10)[(page - 1) * 10 :]
)
def get_live_quotes_by_tag(tag):
return list(
qdb.find({"hidden": False, "approved": True, "tags": tag}).sort("_id", 1)
)
def get_all_tags():
return qdb.find({"hidden": False, "approved": True}).distinct("tags")
def count_live_quotes_by_tag():
quotes = {}
for tag in get_all_tags():
quotes[tag] = len(get_live_quotes_by_tag(tag))
return quotes