extend to repo manifests
This commit is contained in:
@@ -54,6 +54,8 @@ class GitHubRelease(BaseModel):
|
|||||||
id: str
|
id: str
|
||||||
organisation: str
|
organisation: str
|
||||||
repository: str
|
repository: str
|
||||||
|
admin_only: bool = False
|
||||||
|
super_user_only: bool = False
|
||||||
|
|
||||||
|
|
||||||
class Manifest(BaseModel):
|
class Manifest(BaseModel):
|
||||||
@@ -594,6 +596,15 @@ class InstallableExtension(BaseModel):
|
|||||||
github_release.organisation, github_release.repository
|
github_release.organisation, github_release.repository
|
||||||
)
|
)
|
||||||
source_repo = f"{github_release.organisation}/{github_release.repository}"
|
source_repo = f"{github_release.organisation}/{github_release.repository}"
|
||||||
|
admin_only = github_release.admin_only or config.admin_only
|
||||||
|
super_user_only = (
|
||||||
|
github_release.super_user_only or config.super_user_only
|
||||||
|
)
|
||||||
|
latest_extension_release = ExtensionRelease.from_github_release(
|
||||||
|
source_repo, latest_release
|
||||||
|
)
|
||||||
|
latest_extension_release.admin_only = admin_only
|
||||||
|
latest_extension_release.super_user_only = super_user_only
|
||||||
return InstallableExtension(
|
return InstallableExtension(
|
||||||
id=github_release.id,
|
id=github_release.id,
|
||||||
name=config.name,
|
name=config.name,
|
||||||
@@ -605,11 +616,9 @@ class InstallableExtension(BaseModel):
|
|||||||
config.tile,
|
config.tile,
|
||||||
),
|
),
|
||||||
meta=ExtensionMeta(
|
meta=ExtensionMeta(
|
||||||
admin_only=config.admin_only,
|
admin_only=admin_only,
|
||||||
super_user_only=config.super_user_only,
|
super_user_only=super_user_only,
|
||||||
latest_release=ExtensionRelease.from_github_release(
|
latest_release=latest_extension_release,
|
||||||
source_repo, latest_release
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -768,6 +777,13 @@ class InstallableExtension(BaseModel):
|
|||||||
repo_releases = await ExtensionRelease.get_github_releases(
|
repo_releases = await ExtensionRelease.get_github_releases(
|
||||||
r.organisation, r.repository
|
r.organisation, r.repository
|
||||||
)
|
)
|
||||||
|
for repo_release in repo_releases:
|
||||||
|
repo_release.admin_only = (
|
||||||
|
repo_release.admin_only or r.admin_only
|
||||||
|
)
|
||||||
|
repo_release.super_user_only = (
|
||||||
|
repo_release.super_user_only or r.super_user_only
|
||||||
|
)
|
||||||
extension_releases += repo_releases
|
extension_releases += repo_releases
|
||||||
|
|
||||||
for e in manifest.extensions:
|
for e in manifest.extensions:
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ from lnbits.core.models.extensions import (
|
|||||||
Extension,
|
Extension,
|
||||||
ExtensionConfig,
|
ExtensionConfig,
|
||||||
ExtensionRelease,
|
ExtensionRelease,
|
||||||
|
GitHubRelease,
|
||||||
InstallableExtension,
|
InstallableExtension,
|
||||||
|
Manifest,
|
||||||
PayToEnableInfo,
|
PayToEnableInfo,
|
||||||
ReleasePaymentInfo,
|
ReleasePaymentInfo,
|
||||||
UserExtensionInfo,
|
UserExtensionInfo,
|
||||||
@@ -464,3 +466,36 @@ async def test_extension_api_enable_rejects_admin_and_super_only_extensions(
|
|||||||
|
|
||||||
with pytest.raises(HTTPException, match="User not authorized"):
|
with pytest.raises(HTTPException, match="User not authorized"):
|
||||||
await api_enable_extension(super_only_ext, AccountId(id=admin_user.id))
|
await api_enable_extension(super_only_ext, AccountId(id=admin_user.id))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_repo_manifest_flags_apply_to_repo_releases(mocker):
|
||||||
|
ext_id = f"repo_{uuid4().hex[:8]}"
|
||||||
|
release = make_extension_release(ext_id)
|
||||||
|
manifest = Manifest(
|
||||||
|
repos=[
|
||||||
|
GitHubRelease(
|
||||||
|
id=ext_id,
|
||||||
|
organisation="lnbits",
|
||||||
|
repository="tunnel_me_out",
|
||||||
|
admin_only=True,
|
||||||
|
super_user_only=True,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
mocker.patch.object(
|
||||||
|
InstallableExtension,
|
||||||
|
"fetch_manifest",
|
||||||
|
mocker.AsyncMock(return_value=manifest),
|
||||||
|
)
|
||||||
|
mocker.patch.object(
|
||||||
|
ExtensionRelease,
|
||||||
|
"get_github_releases",
|
||||||
|
mocker.AsyncMock(return_value=[release]),
|
||||||
|
)
|
||||||
|
|
||||||
|
releases = await InstallableExtension.get_extension_releases(ext_id)
|
||||||
|
|
||||||
|
assert len(releases) == 1
|
||||||
|
assert releases[0].admin_only is True
|
||||||
|
assert releases[0].super_user_only is True
|
||||||
|
|||||||
Reference in New Issue
Block a user