From 3f12a897646370dce3eddfd68399e7fc6f8c3ee6 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 22 Jun 2024 17:14:52 +0100 Subject: [PATCH] Add fmt option to include VCS repo URL Fixes #514 --- app/blueprints/api/endpoints.py | 9 ++++++--- app/flatpages/help/api.md | 1 + app/models/packages.py | 5 ++++- app/querybuilder.py | 5 +++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/blueprints/api/endpoints.py b/app/blueprints/api/endpoints.py index 58832539..56fbd4d7 100644 --- a/app/blueprints/api/endpoints.py +++ b/app/blueprints/api/endpoints.py @@ -74,10 +74,12 @@ def packages(): qb = QueryBuilder(request.args, lang=lang) query = qb.build_package_query() - if request.args.get("fmt") == "keys": + fmt = request.args.get("fmt") + if fmt == "keys": return jsonify([pkg.as_key_dict() for pkg in query.all()]) - pkgs = qb.convert_to_dictionary(query.all()) + include_vcs = fmt == "vcs" + pkgs = qb.convert_to_dictionary(query.all(), include_vcs) if "engine_version" in request.args or "protocol_version" in request.args: pkgs = [pkg for pkg in pkgs if pkg.get("release")] @@ -88,7 +90,8 @@ def packages(): "limit" not in request.args: featured_lut = set() featured = qb.convert_to_dictionary(query.filter( - Package.collections.any(and_(Collection.name == "featured", Collection.author.has(username="ContentDB")))).all()) + Package.collections.any(and_(Collection.name == "featured", Collection.author.has(username="ContentDB")))).all(), + include_vcs) for pkg in featured: featured_lut.add(f"{pkg['author']}/{pkg['name']}") pkg["short_description"] = gettext("Featured") + ". " + pkg["short_description"] diff --git a/app/flatpages/help/api.md b/app/flatpages/help/api.md index ca58619f..71eceafe 100644 --- a/app/flatpages/help/api.md +++ b/app/flatpages/help/api.md @@ -213,6 +213,7 @@ Format query parameters: * `fmt`: How the response is formatted. * `keys`: author/name only. * `short`: stuff needed for the Minetest client. + * `vcs`: `short` but with `repo`. ### Releases diff --git a/app/models/packages.py b/app/models/packages.py index c54a2b4a..ba312304 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -611,7 +611,7 @@ class Package(db.Model): "type": self.type.to_name(), } - def as_short_dict(self, base_url, version=None, release_id=None, no_load=False, lang="en"): + def as_short_dict(self, base_url, version=None, release_id=None, no_load=False, lang="en", include_vcs=False): tnurl = self.get_thumb_url(1, format="png") if release_id is None and no_load == False: @@ -637,6 +637,9 @@ class Package(db.Model): if not ret["aliases"]: del ret["aliases"] + if include_vcs: + ret["repo"] = self.repo + return ret def as_dict(self, base_url, version=None, lang="en", screenshots_dict=False): diff --git a/app/querybuilder.py b/app/querybuilder.py index 9fb5ef1b..9afaaa9d 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -213,14 +213,15 @@ class QueryBuilder: return releases_query.all() - def convert_to_dictionary(self, packages): + def convert_to_dictionary(self, packages, include_vcs: bool): releases = {} for [package_id, release_id] in self.get_releases(): releases[package_id] = release_id def to_json(package: Package): release_id = releases.get(package.id) - return package.as_short_dict(current_app.config["BASE_URL"], release_id=release_id, no_load=True, lang=self.lang) + return package.as_short_dict(current_app.config["BASE_URL"], release_id=release_id, no_load=True, + lang=self.lang, include_vcs=include_vcs) return [to_json(pkg) for pkg in packages]