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 models 12 from coprs import exceptions 13 from coprs.exceptions import ObjectNotFound, ActionInProgressException 14 from coprs.logic.packages_logic import PackagesLogic 15 from coprs.logic.actions_logic import ActionsLogic 16 17 from coprs.logic.users_logic import UsersLogic 18 from coprs.models import User, Copr 19 from .coprs_logic import CoprsLogic, CoprDirsLogic, CoprChrootsLogic, PinnedCoprsLogic 20 21 22 @sqlalchemy.event.listens_for(models.Copr.deleted, "set") 2730 """ 31 Used for manipulation which affects multiply models 32 """ 33 34 @classmethod23436 """ 37 Delete copr and all its builds. 38 39 :param copr: 40 :param admin_action: set to True to bypass permission check 41 :raises ActionInProgressException: 42 :raises InsufficientRightsException: 43 """ 44 45 if admin_action: 46 user = copr.user 47 else: 48 user = flask.g.user 49 50 builds_query = BuildsLogic.get_multiple_by_copr(copr=copr) 51 52 if copr.persistent: 53 raise exceptions.InsufficientRightsException("This project is protected against deletion.") 54 55 for build in builds_query: 56 # Don't send delete action for each build, rather send an action to delete 57 # a whole project as a part of CoprsLogic.delete_unsafe() method. 58 BuildsLogic.delete_build(user, build, send_delete_action=False) 59 60 CoprsLogic.delete_unsafe(user, copr)61 62 63 @classmethod65 query = ( 66 models.Copr.query 67 .filter(models.Copr.delete_after.isnot(None)) 68 .filter(models.Copr.delete_after < datetime.datetime.now()) 69 .filter(models.Copr.deleted.isnot(True)) 70 ) 71 for copr in query.all(): 72 print("deleting project '{}'".format(copr.full_name)) 73 try: 74 cls.delete_copr(copr, admin_action=True) 75 except ActionInProgressException as e: 76 print(e) 77 print("project {} postponed".format(copr.full_name))78 79 80 @classmethod82 forking = ProjectForking(user, dstgroup) 83 created = (not bool(forking.get(copr, dstname))) 84 fcopr = forking.fork_copr(copr, dstname) 85 86 if fcopr.full_name == copr.full_name: 87 raise exceptions.DuplicateException("Source project should not be same as destination") 88 89 builds_map = {} 90 for package in copr.main_dir.packages: 91 fpackage = forking.fork_package(package, fcopr) 92 build = package.last_build(successful=True) 93 if not build: 94 continue 95 96 fbuild = forking.fork_build(build, fcopr, fpackage) 97 98 if build.result_dir: 99 builds_map['srpm-builds'] = (build.result_dir, fbuild.result_dir) 100 101 for chroot, fchroot in zip(build.build_chroots, fbuild.build_chroots): 102 if chroot.result_dir: 103 builds_map[chroot.name] = (chroot.result_dir, fchroot.result_dir) 104 105 db.session.commit() 106 ActionsLogic.send_fork_copr(copr, fcopr, builds_map) 107 return fcopr, created108 109 @staticmethod111 group = ComplexLogic.get_group_by_name_safe(group_name) 112 try: 113 return CoprsLogic.get_by_group_id( 114 group.id, copr_name, **kwargs).one() 115 except sqlalchemy.orm.exc.NoResultFound: 116 raise ObjectNotFound( 117 message="Project @{}/{} does not exist." 118 .format(group_name, copr_name))119 120 @staticmethod122 """ Get one project. 123 124 This always return personal project. For group projects see get_group_copr_safe(). 125 """ 126 try: 127 return CoprsLogic.get(user_name, copr_name, **kwargs).filter(Copr.group_id.is_(None)).one() 128 except sqlalchemy.orm.exc.NoResultFound: 129 raise ObjectNotFound( 130 message="Project {}/{} does not exist." 131 .format(user_name, copr_name))132 133 @staticmethod135 if owner_name[0] == "@": 136 return ComplexLogic.get_group_copr_safe(owner_name[1:], copr_name, **kwargs) 137 return ComplexLogic.get_copr_safe(owner_name, copr_name, **kwargs)138 139 @staticmethod141 try: 142 return CoprDirsLogic.get_by_ownername(ownername, copr_dirname).one() 143 except sqlalchemy.orm.exc.NoResultFound: 144 raise ObjectNotFound(message="copr dir {}/{} does not exist." 145 .format(ownername, copr_dirname))146 147 @staticmethod149 try: 150 return CoprsLogic.get_by_id(copr_id).one() 151 except sqlalchemy.orm.exc.NoResultFound: 152 raise ObjectNotFound( 153 message="Project with id {} does not exist." 154 .format(copr_id))155 156 @staticmethod158 try: 159 return BuildsLogic.get_by_id(build_id).one() 160 except sqlalchemy.orm.exc.NoResultFound: 161 raise ObjectNotFound( 162 message="Build {} does not exist.".format(build_id))163 164 @staticmethod166 try: 167 return PackagesLogic.get_by_id(package_id).one() 168 except sqlalchemy.orm.exc.NoResultFound: 169 raise ObjectNotFound( 170 message="Package {} does not exist.".format(package_id))171 172 @staticmethod174 try: 175 return PackagesLogic.get(copr_dir.id, package_name).one() 176 except sqlalchemy.orm.exc.NoResultFound: 177 raise ObjectNotFound( 178 message="Package {} in the copr_dir {} does not exist." 179 .format(package_name, copr_dir))180 181 @staticmethod183 try: 184 group = UsersLogic.get_group_by_alias(group_name).one() 185 except sqlalchemy.orm.exc.NoResultFound: 186 raise ObjectNotFound( 187 message="Group {} does not exist.".format(group_name)) 188 return group189 190 @staticmethod192 try: 193 chroot = CoprChrootsLogic.get_by_name_safe(copr, chroot_name) 194 except (ValueError, KeyError, RuntimeError) as e: 195 raise ObjectNotFound(message=str(e)) 196 197 if not chroot: 198 raise ObjectNotFound( 199 message="Chroot name {} does not exist.".format(chroot_name)) 200 201 return chroot202 203 @staticmethod205 names = flask.g.user.user_groups 206 if names: 207 query = UsersLogic.get_groups_by_names_list(names) 208 return query.filter(User.name == user_name) 209 else: 210 return []211 212 @staticmethod214 importing = BuildsLogic.get_build_importing_queue(background=False).count() 215 pending = BuildsLogic.get_pending_build_tasks(background=False).count() 216 running = BuildsLogic.get_build_tasks(StatusEnum("running")).count() 217 218 return dict( 219 importing=importing, 220 pending=pending, 221 running=running, 222 )223 224 @classmethod226 coprs = CoprsLogic.filter_without_group_projects( 227 CoprsLogic.get_multiple_owned_by_username( 228 flask.g.user.username, include_unlisted_on_hp=False)).all() 229 230 for group in user.user_groups: 231 coprs.extend(CoprsLogic.get_multiple_by_group_id(group.id).all()) 232 233 return coprs309238 self.user = user 239 self.group = group 240 241 if group and not user.can_build_in_group(group): 242 raise exceptions.InsufficientRightsException( 243 "Only members may create projects in the particular groups.")244246 return CoprsLogic.get_by_group_id(self.group.id, name).first() if self.group \ 247 else CoprsLogic.filter_without_group_projects(CoprsLogic.get(flask.g.user.name, name)).first()248250 fcopr = self.get(copr, name) 251 if not fcopr: 252 fcopr = self.create_object(models.Copr, copr, 253 exclude=["id", "group_id", "created_on", 254 "scm_repo_url", "scm_api_type", "scm_api_auth_json", 255 "persistent", "auto_prune", "contact", "webhook_secret"]) 256 257 fcopr.forked_from_id = copr.id 258 fcopr.user = self.user 259 fcopr.user_id = self.user.id 260 fcopr.created_on = int(time.time()) 261 if name: 262 fcopr.name = name 263 if self.group: 264 fcopr.group = self.group 265 fcopr.group_id = self.group.id 266 267 fcopr_dir = models.CoprDir(name=fcopr.name, copr=fcopr, main=True) 268 269 for chroot in list(copr.copr_chroots): 270 CoprChrootsLogic.create_chroot(self.user, fcopr, chroot.mock_chroot, chroot.buildroot_pkgs, 271 chroot.repos, comps=chroot.comps, comps_name=chroot.comps_name, 272 with_opts=chroot.with_opts, without_opts=chroot.without_opts) 273 db.session.add(fcopr) 274 db.session.add(fcopr_dir) 275 276 return fcopr277279 fpackage = PackagesLogic.get(fcopr.main_dir.id, package.name).first() 280 if not fpackage: 281 fpackage = self.create_object(models.Package, package, exclude=["id", "copr_id", "copr_dir_id", "webhook_rebuild"]) 282 fpackage.copr = fcopr 283 fpackage.copr_dir = fcopr.main_dir 284 db.session.add(fpackage) 285 return fpackage286288 fbuild = self.create_object(models.Build, build, exclude=["id", "copr_id", "copr_dir_id", "package_id", "result_dir"]) 289 fbuild.copr = fcopr 290 fbuild.package = fpackage 291 fbuild.copr_dir = fcopr.main_dir 292 db.session.add(fbuild) 293 db.session.flush() 294 295 fbuild.result_dir = '{:08}'.format(fbuild.id) 296 fbuild.build_chroots = [self.create_object(models.BuildChroot, c, exclude=["id", "build_id", "result_dir"]) for c in build.build_chroots] 297 for chroot in fbuild.build_chroots: 298 chroot.result_dir = '{:08}-{}'.format(fbuild.id, fpackage.name) 299 chroot.status = StatusEnum("forked") 300 db.session.add(fbuild) 301 return fbuild302
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 | http://epydoc.sourceforge.net |