]> git.lizzy.rs Git - cheatdb.git/commitdiff
Add support for getting MinetestRelease using engine_version
authorrubenwardy <rw@rubenwardy.com>
Wed, 3 Jun 2020 16:17:21 +0000 (17:17 +0100)
committerrubenwardy <rw@rubenwardy.com>
Wed, 3 Jun 2020 16:33:33 +0000 (17:33 +0100)
app/models.py
app/querybuilder.py
app/utils.py

index 40ac97b9e894b8dbcb2c6e955412ad8f434692e7..03d0e1c67da3d1f6894482340f3cb77a2a66233b 100644 (file)
@@ -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)
index cb1d07a2a8c58ed7078dc79f495b3f54ad06d079..5b75b4c4f93f1b4a505f3e2c6c1bf659beabe0a1 100644 (file)
@@ -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)
index bb24920b8c9ca83e856ba65687151645fc1ee4c5..c302622ae8209755056b8ed0cf1426d9f4d5b4df 100644 (file)
@@ -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: