From 64dab0c4b65ee9742108c64d304a66c28e84788d Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 18 Jul 2020 03:14:56 +0100 Subject: [PATCH] Filter tags by available packages in package search --- app/blueprints/packages/packages.py | 5 +- app/querybuilder.py | 79 ++++++++++++++++------------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index f8124ea..17a12a1 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -96,8 +96,9 @@ def list_all(): qb.show_discarded = True topics = qb.buildTopicQuery().all() - tags = db.session.query(func.count(Tags.c.tag_id), Tag) \ - .select_from(Tag).outerjoin(Tags).group_by(Tag.id).order_by(db.asc(Tag.title)).all() + tags_query = db.session.query(func.count(Tags.c.tag_id), Tag) \ + .select_from(Tag).join(Tags).join(Package).group_by(Tag.id).order_by(db.asc(Tag.title)) + tags = qb.filterPackageQuery(tags_query).all() selected_tags = set(qb.tags) diff --git a/app/querybuilder.py b/app/querybuilder.py index 43229db..1d6b6f0 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -76,45 +76,12 @@ class QueryBuilder: else: query = Package.query.filter_by(soft_deleted=False, approved=True) + return self.filterPackageQuery(self.orderPackageQuery(query)) + + def filterPackageQuery(self, query): if len(self.types) > 0: query = query.filter(Package.type.in_(self.types)) - if self.search: - query = query.search(self.search, sort=self.order_by is None) - - if self.random: - query = query.order_by(func.random()) - else: - to_order = None - if self.order_by is None and self.search: - pass - elif self.order_by is None or self.order_by == "score": - to_order = Package.score - elif self.order_by == "name": - to_order = Package.name - elif self.order_by == "title": - to_order = Package.title - elif self.order_by == "downloads": - to_order = Package.downloads - elif self.order_by == "created_at" or self.order_by == "date": - to_order = Package.created_at - elif self.order_by == "approved_at" or self.order_by == "date": - to_order = Package.approved_at - elif self.order_by == "last_release": - to_order = PackageRelease.releaseDate - else: - abort(400) - - if to_order: - if self.order_dir == "asc": - to_order = db.asc(to_order) - elif self.order_dir == "desc": - to_order = db.desc(to_order) - else: - abort(400) - - query = query.order_by(to_order) - if self.author: author = User.query.filter_by(username=self.author).first() if not author: @@ -150,6 +117,46 @@ class QueryBuilder: return query + def orderPackageQuery(self, query): + if self.search: + query = query.search(self.search, sort=self.order_by is None) + + if self.random: + query = query.order_by(func.random()) + return query + + to_order = None + if self.order_by is None and self.search: + pass + elif self.order_by is None or self.order_by == "score": + to_order = Package.score + elif self.order_by == "name": + to_order = Package.name + elif self.order_by == "title": + to_order = Package.title + elif self.order_by == "downloads": + to_order = Package.downloads + elif self.order_by == "created_at" or self.order_by == "date": + to_order = Package.created_at + elif self.order_by == "approved_at" or self.order_by == "date": + to_order = Package.approved_at + elif self.order_by == "last_release": + to_order = PackageRelease.releaseDate + else: + abort(400) + + if to_order: + if self.order_dir == "asc": + to_order = db.asc(to_order) + elif self.order_dir == "desc": + to_order = db.desc(to_order) + else: + abort(400) + + query = query.order_by(to_order) + + return query + def buildTopicQuery(self, show_added=False): query = ForumTopic.query