feat(rpc): add "by" parameter - groups

Adding "by" parameter to search by "groups"

Signed-off-by: moson-mo <mo-son@mailbox.org>
This commit is contained in:
moson-mo 2022-11-07 21:41:42 +01:00
parent 50287cb066
commit 0583f30a53
No known key found for this signature in database
GPG key ID: 4A4760AB4EE15296
3 changed files with 41 additions and 2 deletions

View file

@ -3,7 +3,7 @@ from typing import Set
from sqlalchemy import and_, case, or_, orm
from aurweb import db, models
from aurweb.models import Package, PackageBase, User
from aurweb.models import Group, Package, PackageBase, User
from aurweb.models.dependency_type import (
CHECKDEPENDS_ID,
DEPENDS_ID,
@ -11,6 +11,7 @@ from aurweb.models.dependency_type import (
OPTDEPENDS_ID,
)
from aurweb.models.package_comaintainer import PackageComaintainer
from aurweb.models.package_group import PackageGroup
from aurweb.models.package_keyword import PackageKeyword
from aurweb.models.package_notification import PackageNotification
from aurweb.models.package_vote import PackageVote
@ -290,6 +291,7 @@ class RPCSearch(PackageSearch):
"provides": self._search_by_provides,
"conflicts": self._search_by_conflicts,
"replaces": self._search_by_replaces,
"groups": self._search_by_groups,
}
)
@ -320,6 +322,14 @@ class RPCSearch(PackageSearch):
)
return self.query
def _join_groups(self) -> orm.Query:
"""Join Package with PackageGroup and Group.
:returns: PackageGroup/Group-joined orm.Query
"""
self.query = self.query.join(PackageGroup).join(Group)
return self.query
def _search_by_depends(self, keywords: str) -> "RPCSearch":
self.query = self._join_depends(DEPENDS_ID).filter(
models.PackageDependency.DepName == keywords
@ -362,6 +372,11 @@ class RPCSearch(PackageSearch):
)
return self
def _search_by_groups(self, keywords: str) -> orm.Query:
self._join_groups()
self.query = self.query.filter(Group.Name == keywords)
return self
def search_by(self, by: str, keywords: str) -> "RPCSearch":
"""Override inherited search_by. In this override, we reduce the
scope of what we handle within this function. We do not set `by`

View file

@ -86,6 +86,7 @@ class RPC:
"provides",
"conflicts",
"replaces",
"groups",
}
# A mapping of by aliases.

View file

@ -13,10 +13,12 @@ from aurweb import asgi, config, db, rpc, scripts, time
from aurweb.aur_redis import redis_connection
from aurweb.models.account_type import USER_ID
from aurweb.models.dependency_type import DEPENDS_ID
from aurweb.models.group import Group
from aurweb.models.license import License
from aurweb.models.package import Package
from aurweb.models.package_base import PackageBase
from aurweb.models.package_dependency import PackageDependency
from aurweb.models.package_group import PackageGroup
from aurweb.models.package_keyword import PackageKeyword
from aurweb.models.package_license import PackageLicense
from aurweb.models.package_relation import PackageRelation
@ -139,11 +141,14 @@ def packages(user: User, user2: User, user3: User) -> list[Package]:
output.append(pkg)
# Setup a few more related records on the first package:
# a license, some keywords and some votes.
# a license, group, some keywords and some votes.
with db.begin():
lic = db.create(License, Name="GPL")
db.create(PackageLicense, Package=output[0], License=lic)
grp = db.create(Group, Name="testgroup")
db.create(PackageGroup, Package=output[0], Group=grp)
for keyword in ["big-chungus", "smol-chungus", "sizeable-chungus"]:
db.create(
PackageKeyword, PackageBase=output[0].PackageBase, Keyword=keyword
@ -326,6 +331,7 @@ def test_rpc_singular_info(
"Replaces": ["chungus-replaces<=200"],
"License": [pkg.package_licenses.first().License.Name],
"Keywords": ["big-chungus", "sizeable-chungus", "smol-chungus"],
"Groups": ["testgroup"],
}
],
"resultcount": 1,
@ -888,6 +894,23 @@ def test_rpc_search_replaces(
assert result.get("Name") == packages[0].Name
def test_rpc_search_groups(
client: TestClient, packages: list[Package], depends: list[PackageDependency]
):
params = {
"v": 5,
"type": "search",
"by": "groups",
"arg": "testgroup",
}
with client as request:
response = request.get("/rpc", params=params)
data = response.json()
assert data.get("resultcount") == 1
result = data.get("results")[0]
assert result.get("Name") == packages[0].Name
def test_rpc_incorrect_by(client: TestClient):
params = {"v": 5, "type": "search", "by": "fake", "arg": "big"}
with client as request: