1 """
2 This module contains logic for Copr API.
3
4 xWrapper classes add helper methods
5 to [de]serialize model instances for API views.
6 """
7
8
11 """
12 :arg build: copr.models.Build
13 """
14 self.build = build
15
17 out = {}
18 for field in ["id", "pkg_version", "status", "state",
19 "canceled", "repos", "submitted_on", "started_on",
20 "ended_on", "results", "memory_reqs", "timeout"]:
21 out[field] = getattr(self.build, field, None)
22
23 out["src_pkg"] = self.build.pkgs
24 build_packages = self.build.built_packages
25 if build_packages:
26 out["built_packages"] = build_packages.split("\n")
27 else:
28 out["built_packages"] = []
29
30 return out
31
32
35 """
36 Params
37 ------
38 copr : copr for which we want to get monitor data
39 monitor_data : list(tuple(package, build, build_chroot, mock_chroot))
40 the list must be ordered by package (!)
41 """
42 self.copr = copr
43 self.monitor_data = monitor_data
44
46 """Converts single package to the API format.
47
48 Params
49 ------
50 package : Package instance
51 builds_data : dict(build_chroot.name : dict(build, build_chroot, mock_chroot))
52
53 Returns
54 -------
55 dict(pkg_name, pkg_version, results)
56 pkg_name : name of package
57 pkg_version : None
58 results : dict(build_id, status, pkg_version)
59 """
60 results = {}
61
62 for chroot in self.copr.active_chroots:
63 if chroot.name in builds_data:
64 results[chroot.name] = {
65 "build_id": builds_data[chroot.name]['build'].id,
66 "status": builds_data[chroot.name]['build_chroot'].state,
67 "pkg_version": builds_data[chroot.name]['build'].pkg_version
68 }
69 else:
70 results[chroot.name] = None
71
72 return {"pkg_name": package.name, "pkg_version": None, "results": results}
73
75 """
76 NOTE: individual records for the same package in must be "grouped" together in self.monitor_data
77 """
78 packages = []
79 builds_data = {}
80 current_package = None
81
82 for package, build, build_chroot, mock_chroot in self.monitor_data:
83 if package != current_package:
84 if current_package:
85 packages.append(self.wrap_package(current_package, builds_data))
86 current_package = package
87 builds_data = {}
88 builds_data[build_chroot.name] = {"build": build, "build_chroot": build_chroot, "mock_chroot": mock_chroot}
89 packages.append(self.wrap_package(current_package, builds_data))
90
91 return packages
92
99