Trees | Indices | Help |
---|
|
1 # coding: utf-8 2 3 import datetime 4 import time 5 import flask 6 import sqlalchemy 7 8 from .. import db 9 from .builds_logic import BuildsLogic 10 from copr_common.enums import StatusEnum 11 from coprs import helpers 12 from coprs import models 13 from coprs import exceptions 14 from coprs.exceptions import ObjectNotFound, ActionInProgressException 15 from coprs.logic.packages_logic import PackagesLogic 16 from coprs.logic.actions_logic import ActionsLogic 17 18 from coprs.logic.users_logic import UsersLogic 19 from coprs.models import User, Copr 20 from .coprs_logic import CoprsLogic, CoprDirsLogic, CoprChrootsLogic, PinnedCoprsLogic 21 22 23 @sqlalchemy.event.listens_for(models.Copr.deleted, "set") 2831 """ 32 Used for manipulation which affects multiply models 33 """ 34 35 @classmethod24437 """ 38 Delete copr and all its builds. 39 40 :param copr: 41 :param admin_action: set to True to bypass permission check 42 :raises ActionInProgressException: 43 :raises InsufficientRightsException: 44 """ 45 46 if admin_action: 47 user = copr.user 48 else: 49 user = flask.g.user 50 51 builds_query = BuildsLogic.get_multiple_by_copr(copr=copr) 52 53 if copr.persistent: 54 raise exceptions.InsufficientRightsException("This project is protected against deletion.") 55 56 for build in builds_query: 57 # Don't send delete action for each build, rather send an action to delete 58 # a whole project as a part of CoprsLogic.delete_unsafe() method. 59 BuildsLogic.delete_build(user, build, send_delete_action=False) 60 61 CoprsLogic.delete_unsafe(user, copr)62 63 64 @classmethod66 query = ( 67 models.Copr.query 68 .filter(models.Copr.delete_after.isnot(None)) 69 .filter(models.Copr.delete_after < datetime.datetime.now()) 70 .filter(models.Copr.deleted.isnot(True)) 71 ) 72 for copr in query.all(): 73 print("deleting project '{}'".format(copr.full_name)) 74 try: 75 cls.delete_copr(copr, admin_action=True) 76 except ActionInProgressException as e: 77 print(e) 78 print("project {} postponed".format(copr.full_name))79 80 81 @classmethod83 forking = ProjectForking(user, dstgroup) 84 created = (not bool(forking.get(copr, dstname))) 85 fcopr = forking.fork_copr(copr, dstname) 86 87 if fcopr.full_name == copr.full_name: 88 raise exceptions.DuplicateException("Source project should not be same as destination") 89 90 builds_map = {} 91 srpm_builds_src,srpm_builds_dst, chroots_src, chroots_dst = ([] for i in range(4)) 92 for package in copr.main_dir.packages: 93 fpackage = forking.fork_package(package, fcopr) 94 build = package.last_build(successful=True) 95 if not build: 96 continue 97 98 fbuild = forking.fork_build(build, fcopr, fpackage) 99 100 if build.result_dir: 101 srpm_builds_src.append(build.result_dir) 102 srpm_builds_dst.append(fbuild.result_dir) 103 104 for chroot, fchroot in zip(build.build_chroots, fbuild.build_chroots): 105 if chroot.result_dir: 106 chroots_src.append(chroot.result_dir) 107 chroots_dst.append(fchroot.result_dir) 108 builds_map['srpm-builds'] = dict(zip(srpm_builds_src, srpm_builds_dst)) 109 builds_map[chroot.name] = dict(zip(chroots_src, chroots_dst)) 110 111 db.session.commit() 112 ActionsLogic.send_fork_copr(copr, fcopr, builds_map) 113 return fcopr, created114 115 @staticmethod117 group = ComplexLogic.get_group_by_name_safe(group_name) 118 try: 119 return CoprsLogic.get_by_group_id( 120 group.id, copr_name, **kwargs).one() 121 except sqlalchemy.orm.exc.NoResultFound: 122 raise ObjectNotFound( 123 message="Project @{}/{} does not exist." 124 .format(group_name, copr_name))125 126 @staticmethod128 """ Get one project. 129 130 This always return personal project. For group projects see get_group_copr_safe(). 131 """ 132 try: 133 return CoprsLogic.get(user_name, copr_name, **kwargs).filter(Copr.group_id.is_(None)).one() 134 except sqlalchemy.orm.exc.NoResultFound: 135 raise ObjectNotFound( 136 message="Project {}/{} does not exist." 137 .format(user_name, copr_name))138 139 @staticmethod141 if owner_name[0] == "@": 142 return ComplexLogic.get_group_copr_safe(owner_name[1:], copr_name, **kwargs) 143 return ComplexLogic.get_copr_safe(owner_name, copr_name, **kwargs)144 145 @staticmethod147 try: 148 return CoprDirsLogic.get_by_ownername(ownername, copr_dirname).one() 149 except sqlalchemy.orm.exc.NoResultFound: 150 raise ObjectNotFound(message="copr dir {}/{} does not exist." 151 .format(ownername, copr_dirname))152 153 @staticmethod155 try: 156 return CoprsLogic.get_by_id(copr_id).one() 157 except sqlalchemy.orm.exc.NoResultFound: 158 raise ObjectNotFound( 159 message="Project with id {} does not exist." 160 .format(copr_id))161 162 @staticmethod164 try: 165 return BuildsLogic.get_by_id(build_id).one() 166 except sqlalchemy.orm.exc.NoResultFound: 167 raise ObjectNotFound( 168 message="Build {} does not exist.".format(build_id))169 170 @staticmethod172 try: 173 return PackagesLogic.get_by_id(package_id).one() 174 except sqlalchemy.orm.exc.NoResultFound: 175 raise ObjectNotFound( 176 message="Package {} does not exist.".format(package_id))177 178 @staticmethod180 try: 181 return PackagesLogic.get(copr_dir.id, package_name).one() 182 except sqlalchemy.orm.exc.NoResultFound: 183 raise ObjectNotFound( 184 message="Package {} in the copr_dir {} does not exist." 185 .format(package_name, copr_dir))186 187 @staticmethod189 try: 190 group = UsersLogic.get_group_by_alias(group_name).one() 191 except sqlalchemy.orm.exc.NoResultFound: 192 raise ObjectNotFound( 193 message="Group {} does not exist.".format(group_name)) 194 return group195 196 @staticmethod198 try: 199 chroot = CoprChrootsLogic.get_by_name_safe(copr, chroot_name) 200 except (ValueError, KeyError, RuntimeError) as e: 201 raise ObjectNotFound(message=str(e)) 202 203 if not chroot: 204 raise ObjectNotFound( 205 message="Chroot name {} does not exist.".format(chroot_name)) 206 207 return chroot208 209 @staticmethod211 names = flask.g.user.user_groups 212 if names: 213 query = UsersLogic.get_groups_by_names_list(names) 214 return query.filter(User.name == user_name) 215 else: 216 return []217 218 @staticmethod220 importing = BuildsLogic.get_build_importing_queue(background=False).count() 221 pending = BuildsLogic.get_pending_build_tasks(background=False).count() 222 running = BuildsLogic.get_build_tasks(StatusEnum("running")).count() 223 224 return dict( 225 importing=importing, 226 pending=pending, 227 running=running, 228 )229 230 @classmethod232 coprs = CoprsLogic.filter_without_group_projects( 233 CoprsLogic.get_multiple_owned_by_username( 234 flask.g.user.username, include_unlisted_on_hp=False)).all() 235 236 for group in user.user_groups: 237 coprs.extend(CoprsLogic.get_multiple_by_group_id(group.id).all()) 238 239 coprs += [perm.copr for perm in user.copr_permissions if 240 perm.get_permission("admin") == helpers.PermissionEnum("approved") or 241 perm.get_permission("builder") == helpers.PermissionEnum("approved")] 242 243 return set(coprs)319248 self.user = user 249 self.group = group 250 251 if group and not user.can_build_in_group(group): 252 raise exceptions.InsufficientRightsException( 253 "Only members may create projects in the particular groups.")254256 return CoprsLogic.get_by_group_id(self.group.id, name).first() if self.group \ 257 else CoprsLogic.filter_without_group_projects(CoprsLogic.get(flask.g.user.name, name)).first()258260 fcopr = self.get(copr, name) 261 if not fcopr: 262 fcopr = self.create_object(models.Copr, copr, 263 exclude=["id", "group_id", "created_on", 264 "scm_repo_url", "scm_api_type", "scm_api_auth_json", 265 "persistent", "auto_prune", "contact", "webhook_secret"]) 266 267 fcopr.forked_from_id = copr.id 268 fcopr.user = self.user 269 fcopr.user_id = self.user.id 270 fcopr.created_on = int(time.time()) 271 if name: 272 fcopr.name = name 273 if self.group: 274 fcopr.group = self.group 275 fcopr.group_id = self.group.id 276 277 fcopr_dir = models.CoprDir(name=fcopr.name, copr=fcopr, main=True) 278 279 for chroot in list(copr.copr_chroots): 280 CoprChrootsLogic.create_chroot(self.user, fcopr, chroot.mock_chroot, chroot.buildroot_pkgs, 281 chroot.repos, comps=chroot.comps, comps_name=chroot.comps_name, 282 with_opts=chroot.with_opts, without_opts=chroot.without_opts) 283 db.session.add(fcopr) 284 db.session.add(fcopr_dir) 285 286 return fcopr287289 fpackage = PackagesLogic.get(fcopr.main_dir.id, package.name).first() 290 if not fpackage: 291 fpackage = self.create_object(models.Package, package, exclude=["id", "copr_id", "copr_dir_id", "webhook_rebuild"]) 292 fpackage.copr = fcopr 293 fpackage.copr_dir = fcopr.main_dir 294 db.session.add(fpackage) 295 return fpackage296298 fbuild = self.create_object(models.Build, build, exclude=["id", "copr_id", "copr_dir_id", "package_id", "result_dir"]) 299 fbuild.copr = fcopr 300 fbuild.package = fpackage 301 fbuild.copr_dir = fcopr.main_dir 302 db.session.add(fbuild) 303 db.session.flush() 304 305 fbuild.result_dir = '{:08}'.format(fbuild.id) 306 fbuild.build_chroots = [self.create_object(models.BuildChroot, c, exclude=["id", "build_id", "result_dir"]) for c in build.build_chroots] 307 for chroot in fbuild.build_chroots: 308 chroot.result_dir = '{:08}-{}'.format(fbuild.id, fpackage.name) 309 chroot.status = StatusEnum("forked") 310 db.session.add(fbuild) 311 return fbuild312
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 | http://epydoc.sourceforge.net |