diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index 0b7ff05..99f715b 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -30,7 +30,7 @@ from flask_wtf import FlaskForm from wtforms import * from wtforms.validators import * from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField -from sqlalchemy import or_ +from sqlalchemy import or_, func @menu.register_menu(bp, ".mods", "Mods", order=11, endpoint_arguments_constructor=lambda: { 'type': 'mod' }) @@ -64,6 +64,14 @@ def list_all(): prev_url = url_for("packages.list_all", type=type_name, q=search, page=query.prev_num) \ if query.has_prev else None + authors = [] + if search: + authors = User.query \ + .filter(or_(*[func.lower(User.username) == name.lower().strip() for name in search.split(" ")])) \ + .all() + + authors = [(author.username, search.lower().replace(author.username, "")) for author in authors] + topics = None if qb.search and not query.has_next: qb.show_discarded = True @@ -73,6 +81,7 @@ def list_all(): return render_template("packages/list.html", \ title=title, packages=query.items, topics=topics, \ query=search, tags=tags, type=type_name, \ + authors = authors, \ next_url=next_url, prev_url=prev_url, page=page, page_max=query.pages, packages_count=query.total) diff --git a/app/querybuilder.py b/app/querybuilder.py index 5fa4ec6..4db6742 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -1,4 +1,4 @@ -from .models import db, PackageType, Package, ForumTopic, License, MinetestRelease, PackageRelease +from .models import db, PackageType, Package, ForumTopic, License, MinetestRelease, PackageRelease, User from .utils import isNo, isYes from sqlalchemy.sql.expression import func from flask import abort @@ -23,14 +23,19 @@ class QueryBuilder: self.title = title self.types = types - self.search = args.get("q") + self.random = "random" in args self.lucky = "lucky" in args self.hide_nonfree = "nonfree" in hide_flags self.limit = 1 if self.lucky else None self.order_by = args.get("sort") self.order_dir = args.get("order") or "desc" + + # Filters + + self.search = args.get("q") self.protocol_version = args.get("protocol_version") + self.author = args.get("author") self.show_discarded = isYes(args.get("show_discarded")) self.show_added = args.get("show_added") @@ -84,6 +89,13 @@ class QueryBuilder: query = query.order_by(to_order) + if self.author: + author = User.query.filter_by(username=self.author).first() + if not author: + abort(404) + + query = query.filter_by(author=author) + if self.hide_nonfree: query = query.filter(Package.license.has(License.is_foss == True)) query = query.filter(Package.media_license.has(License.is_foss == True)) diff --git a/app/templates/base.html b/app/templates/base.html index 4db84d7..6a74725 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -129,7 +129,7 @@ {% endblock %}