1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-15 08:36:13 +01:00
github.com_openSUSE_osc/osc/obs_api/project.py

152 lines
4.3 KiB
Python

from ..util.models import * # pylint: disable=wildcard-import,unused-wildcard-import
from .flag import Flag
from .group_role import GroupRole
from .person_role import PersonRole
from .project_devel import ProjectDevel
from .project_link import ProjectLink
from .project_maintenance_maintains import ProjectMaintenanceMaintains
from .repository import Repository
from .simple_flag import SimpleFlag
from .status import Status
class Project(XmlModel):
XML_TAG = "project"
name: str = Field(
xml_attribute=True,
)
class KindEnum(str, Enum):
STANDARD = "standard"
MAINTENANCE = "maintenance"
MAINTENANCE_INCIDENT = "maintenance_incident"
MAINTENANCE_RELEASE = "maintenance_release"
kind: Optional[KindEnum] = Field(
xml_attribute=True,
)
title: str = Field(
)
description: str = Field(
)
url: Optional[str] = Field(
)
link_list: Optional[List[ProjectLink]] = Field(
xml_name="link",
)
mountproject: Optional[str] = Field(
)
remoteurl: Optional[str] = Field(
)
scmsync: Optional[str] = Field(
)
devel: Optional[ProjectDevel] = Field(
)
person_list: Optional[List[PersonRole]] = Field(
xml_name="person",
)
group_list: Optional[List[GroupRole]] = Field(
xml_name="group",
)
lock: Optional[SimpleFlag] = Field(
xml_wrapped=True,
)
build_list: Optional[List[Flag]] = Field(
xml_name="build",
xml_wrapped=True,
)
publish_list: Optional[List[Flag]] = Field(
xml_name="publish",
xml_wrapped=True,
)
useforbuild_list: Optional[List[Flag]] = Field(
xml_name="useforbuild",
xml_wrapped=True,
)
debuginfo_list: Optional[List[Flag]] = Field(
xml_name="debuginfo",
xml_wrapped=True,
)
binarydownload_list: Optional[List[Flag]] = Field(
xml_name="binarydownload",
xml_wrapped=True,
)
sourceaccess: Optional[SimpleFlag] = Field(
xml_wrapped=True,
)
access: Optional[SimpleFlag] = Field(
xml_wrapped=True,
)
maintenance_list: Optional[List[ProjectMaintenanceMaintains]] = Field(
xml_name="maintenance",
xml_wrapped=True,
)
repository_list: Optional[List[Repository]] = Field(
xml_name="repository",
)
@classmethod
def from_api(cls, apiurl, project):
url_path = ["source", project, "_meta"]
url_query = {}
response = cls.xml_request("GET", apiurl, url_path, url_query)
return cls.from_file(response, apiurl=apiurl)
def to_api(self, apiurl, *, project=None):
project = project or self.name
url_path = ["source", project, "_meta"]
url_query = {}
response = self.xml_request("PUT", apiurl, url_path, url_query, data=self.to_string())
return Status.from_file(response, apiurl=apiurl)
def resolve_repository_flags(self, package_obj=None):
"""
Resolve the `build`, `debuginfo`, `publish` and `useforbuild` flags
and return their values for each repository and build arch.
:returns: {(repo_name, repo_buildarch): {flag_name: bool} for all available repos
"""
result = {}
flag_names = ("build", "debuginfo", "publish", "useforbuild")
# populate the result matrix: {(repo, arch): {"build": None, "debuginfo": None, "publish": None, "useforbuild": None}}
for repo_obj in self.repository_list or []:
for arch in repo_obj.arch_list or []:
result[(repo_obj.name, arch)] = dict([(flag_name, None) for flag_name in flag_names])
for flag_name in flag_names:
flag_objects = getattr(self, f"{flag_name}_list") or []
if package_obj is not None:
flag_objects += getattr(package_obj, f"{flag_name}_list") or []
for flag_obj in flag_objects:
# look up entries matching the current flag and change their values according to the flag's tag
for (entry_repo, entry_arch), entry_data in result.items():
match = flag_obj.repository in (entry_repo, None) and flag_obj.arch in (entry_arch, None)
if match:
entry_data[flag_name] = True if flag_obj.flag == "enable" else False
return result