diff --git a/app/models.py b/app/models.py index 40ac97b..03d0e1c 100644 --- a/app/models.py +++ b/app/models.py @@ -531,9 +531,9 @@ class Package(db.Model): "type": self.type.toName(), } - def getAsDictionaryShort(self, base_url, version=None, protonum=None): + def getAsDictionaryShort(self, base_url, version=None): tnurl = self.getThumbnailURL(1) - release = self.getDownloadRelease(version=version, protonum=protonum) + release = self.getDownloadRelease(version=version) return { "name": self.name, "title": self.title, @@ -544,9 +544,9 @@ class Package(db.Model): "thumbnail": (base_url + tnurl) if tnurl is not None else None } - def getAsDictionary(self, base_url, version=None, protonum=None): + def getAsDictionary(self, base_url, version=None): tnurl = self.getThumbnailURL(1) - release = self.getDownloadRelease(version=version, protonum=protonum) + release = self.getDownloadRelease(version=version) return { "author": self.author.username, "name": self.name, @@ -630,19 +630,11 @@ class Package(db.Model): return url_for("packages.download", author=self.author.username, name=self.name) - def getDownloadRelease(self, version=None, protonum=None): - if version is None and protonum is not None: - version = MinetestRelease.query.filter(MinetestRelease.protocol >= int(protonum)).first() - if version is not None: - version = version.id - else: - version = 10000000 - - + def getDownloadRelease(self, version=None): for rel in self.releases: if rel.approved and (version is None or - ((rel.min_rel is None or rel.min_rel_id <= version) and \ - (rel.max_rel is None or rel.max_rel_id >= version))): + ((rel.min_rel is None or rel.min_rel_id <= version.id) and \ + (rel.max_rel is None or rel.max_rel_id >= version.id))): return rel return None @@ -795,6 +787,28 @@ class MinetestRelease(db.Model): def getActual(self): return None if self.name == "None" else self + @classmethod + def get(cls, version, protocol_num): + import sys + + if version: + parts = version.split(".") + if len(parts) >= 2: + major_minor = parts[0] + "." + parts[1] + query = MinetestRelease.query.filter(MinetestRelease.name.like("%{}%".format(major_minor))) + if protocol_num: + query = query.filter_by(protocol=protocol_num) + + release = query.one_or_none() + if release: + return release + + if protocol_num: + release = MinetestRelease.query.filter_by(protocol=protocol_num).one_or_none() + return release + + return None + class PackageRelease(db.Model): id = db.Column(db.Integer, primary_key=True) diff --git a/app/querybuilder.py b/app/querybuilder.py index cb1d07a..5b75b4c 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -42,7 +42,8 @@ class QueryBuilder: # Filters self.search = args.get("q") - self.protocol_version = args.get("protocol_version") + self.minetest_version = args.get("engine_version") + self.protocol_version = get_int_or_abort(args.get("protocol_version")) self.author = args.get("author") self.show_discarded = isYes(args.get("show_discarded")) @@ -58,15 +59,10 @@ class QueryBuilder: self.order_by = name def getMinetestVersion(self): - if not self.protocol_version: + if not self.protocol_version and not self.minetest_version: return None - self.protocol_version = get_int_or_abort(self.protocol_version) - version = MinetestRelease.query.filter(MinetestRelease.protocol>=self.protocol_version).first() - if version is not None: - return version.id - else: - return 10000000 + return MinetestRelease.get(self.minetest_version, self.protocol_version) def buildPackageQuery(self): query = Package.query.filter_by(soft_deleted=False, approved=True) @@ -111,12 +107,13 @@ class QueryBuilder: query = query.filter(Package.license.has(License.is_foss == True)) query = query.filter(Package.media_license.has(License.is_foss == True)) - if self.protocol_version: + if self.protocol_version or self.minetest_version: version = self.getMinetestVersion() - query = query.join(Package.releases) \ - .filter(PackageRelease.approved==True) \ - .filter(or_(PackageRelease.min_rel_id==None, PackageRelease.min_rel_id<=version)) \ - .filter(or_(PackageRelease.max_rel_id==None, PackageRelease.max_rel_id>=version)) + if version: + query = query.join(Package.releases) \ + .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)) if self.limit: query = query.limit(self.limit) diff --git a/app/utils.py b/app/utils.py index bb24920..c302622 100644 --- a/app/utils.py +++ b/app/utils.py @@ -31,6 +31,9 @@ def abs_url(path): return urljoin(app.config["BASE_URL"], path) def get_int_or_abort(v, default=None): + if v is None: + return default + try: return int(v or default) except ValueError: