""" Handle tag requests. """ from collections import defaultdict from flask import jsonify from asl_articles import app, db from asl_articles.models import Publication, Article from asl_articles.utils import decode_tags # --------------------------------------------------------------------- @app.route( "/tags" ) def get_tags(): """Get all tags.""" return jsonify( do_get_tags() ) def do_get_tags(): """Get all tags.""" # get all the tags # NOTE: This is pretty inefficient, since an article/publication's tags are munged into one big string # and stored in a single column, so we need to manually unpack everything, but we'll see how it goes... tags = defaultdict( int ) def count_tags( query ): for row in query: if not row[0]: continue for tag in decode_tags( row[0] ): tags[ tag ] = tags[ tag ] + 1 count_tags( db.session.query( Publication.pub_tags ) ) count_tags( db.session.query( Article.article_tags ) ) # sort the results tags = sorted( tags.items(), key = lambda v: ( -v[1], v[0] ) # sort by # instances, then name ) return tags