from app.utils import is_package_page
from app.markdown import render_markdown
from app.querybuilder import QueryBuilder
+from sqlalchemy.orm import joinedload
@bp.route("/api/packages/")
def packages():
qb = QueryBuilder(request.args)
- query = qb.buildPackageQuery()
- ver = qb.getMinetestVersion()
+ query = qb.buildPackageQuery(db.session.query(Package, PackageRelease))
+
+ import sys
+ print(query, file=sys.stdout)
+
+ pkgs = [result[0].getAsDictionaryShort(current_app.config["BASE_URL"], release=result[1]) \
+ for result in query.all()]
+
+
+ # qb = QueryBuilder(request.args)
+ # query = qb.buildPackageQuery()
+ # ver = qb.getMinetestVersion()
+
+ # pkgs = [result.getAsDictionaryShort(current_app.config["BASE_URL"], version=ver) \
+ # for result in query.all()]
- pkgs = [package.getAsDictionaryShort(current_app.config["BASE_URL"], version=ver) \
- for package in query.all()]
return jsonify(pkgs)
"type": self.type.toName(),
}
- def getAsDictionaryShort(self, base_url, version=None):
+ def getAsDictionaryShort(self, base_url, version=None, release=None):
tnurl = self.getThumbnailURL(1)
- release = self.getDownloadRelease(version=version)
+ release = release if release else self.getDownloadRelease(version=version)
return {
"name": self.name,
"title": self.title,
return MinetestRelease.get(self.minetest_version, self.protocol_version)
- def buildPackageQuery(self):
- query = Package.query.filter_by(soft_deleted=False, approved=True)
+ def buildPackageQuery(self, query=None):
+ if not query:
+ query = Package.query
+
+ query = query.filter(Package.soft_deleted==False, Package.approved==True)
if len(self.types) > 0:
query = query.filter(Package.type.in_(self.types))
if self.protocol_version or self.minetest_version:
version = self.getMinetestVersion()
if version:
- query = query.join(Package.releases) \
+ subqry = db.session.query(PackageRelease.id).correlate(PackageRelease) \
+ .filter(PackageRelease.package_id==Package.id) \
.filter(PackageRelease.approved==True) \
.filter(or_(PackageRelease.min_rel_id==None, PackageRelease.min_rel_id<=version.id)) \
- .filter(or_(PackageRelease.max_rel_id==None, PackageRelease.max_rel_id>=version.id))
+ .filter(or_(PackageRelease.max_rel_id==None, PackageRelease.max_rel_id>=version.id)) \
+ .order_by(db.desc(PackageRelease.id)) \
+ .limit(1).subquery()
+
+ query = query.filter(PackageRelease.id==subqry)
if self.limit:
query = query.limit(self.limit)