mirror of
https://github.com/openSUSE/osc.git
synced 2024-11-15 08:36:13 +01:00
152 lines
4.3 KiB
Python
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
|