Package coprs :: Package logic :: Module complex_logic
[hide private]
[frames] | no frames]

Source Code for Module coprs.logic.complex_logic

  1  # coding: utf-8 
  2   
  3  import flask 
  4  import sqlalchemy 
  5   
  6  from .. import db 
  7  from .builds_logic import BuildsLogic 
  8  from coprs import models 
  9  from coprs import exceptions 
 10  from coprs.exceptions import ObjectNotFound 
 11  from coprs.helpers import StatusEnum 
 12  from coprs.logic.packages_logic import PackagesLogic 
 13  from coprs.logic.actions_logic import ActionsLogic 
 14   
 15  from coprs.logic.users_logic import UsersLogic 
 16  from coprs.models import User, Copr 
 17  from .coprs_logic import CoprsLogic, CoprChrootsLogic 
 18  from .. import helpers 
19 20 21 -class ComplexLogic(object):
22 """ 23 Used for manipulation which affects multiply models 24 """ 25 26 @classmethod
27 - def delete_copr(cls, copr):
28 """ 29 Delete copr and all its builds. 30 31 :param copr: 32 :raises ActionInProgressException: 33 :raises InsufficientRightsException: 34 """ 35 builds_query = BuildsLogic.get_multiple_by_copr(copr=copr) 36 37 if copr.persistent: 38 raise exceptions.InsufficientRightsException("This project is protected against deletion.") 39 40 for build in builds_query: 41 BuildsLogic.delete_build(flask.g.user, build, send_delete_action=False) 42 43 CoprsLogic.delete_unsafe(flask.g.user, copr)
44 45 @classmethod
46 - def fork_copr(cls, copr, user, dstname, dstgroup=None):
47 forking = ProjectForking(user, dstgroup) 48 created = (not bool(forking.get(copr, dstname))) 49 fcopr = forking.fork_copr(copr, dstname) 50 51 if fcopr.full_name == copr.full_name: 52 raise exceptions.DuplicateException("Source project should not be same as destination") 53 54 builds_map = {} 55 for package in copr.packages: 56 fpackage = forking.fork_package(package, fcopr) 57 build = package.last_build() 58 if not build: 59 continue 60 61 fbuild = forking.fork_build(build, fcopr, fpackage) 62 builds_map[fbuild.id] = build.result_dir_name 63 64 ActionsLogic.send_fork_copr(copr, fcopr, builds_map) 65 return fcopr, created
66 67 @staticmethod
68 - def get_group_copr_safe(group_name, copr_name, **kwargs):
69 group = ComplexLogic.get_group_by_name_safe(group_name) 70 71 try: 72 return CoprsLogic.get_by_group_id( 73 group.id, copr_name, **kwargs).one() 74 except sqlalchemy.orm.exc.NoResultFound: 75 raise ObjectNotFound( 76 message="Project @{}/{} does not exist." 77 .format(group_name, copr_name))
78 79 @staticmethod
80 - def get_copr_safe(user_name, copr_name, **kwargs):
81 """ Get one project 82 83 This always return personal project. For group projects see get_group_copr_safe(). 84 """ 85 try: 86 return CoprsLogic.get(user_name, copr_name, **kwargs).filter(Copr.group_id.is_(None)).one() 87 except sqlalchemy.orm.exc.NoResultFound: 88 raise ObjectNotFound( 89 message="Project {}/{} does not exist." 90 .format(user_name, copr_name))
91 92 @staticmethod
93 - def get_copr_by_id_safe(copr_id):
94 try: 95 return CoprsLogic.get_by_id(copr_id).one() 96 except sqlalchemy.orm.exc.NoResultFound: 97 raise ObjectNotFound( 98 message="Project with id {} does not exist." 99 .format(copr_id))
100 101 @staticmethod
102 - def get_build_safe(build_id):
103 try: 104 return BuildsLogic.get_by_id(build_id).one() 105 except sqlalchemy.orm.exc.NoResultFound: 106 raise ObjectNotFound( 107 message="Build {} does not exist.".format(build_id))
108 109 @staticmethod
110 - def get_package_by_id_safe(package_id):
111 try: 112 return PackagesLogic.get_by_id(package_id).one() 113 except sqlalchemy.orm.exc.NoResultFound: 114 raise ObjectNotFound( 115 message="Package {} does not exist.".format(package_id))
116 117 @staticmethod
118 - def get_package_safe(copr, package_name):
119 try: 120 return PackagesLogic.get(copr.id, package_name).one() 121 except sqlalchemy.orm.exc.NoResultFound: 122 raise ObjectNotFound( 123 message="Package {} in the copr {} does not exist." 124 .format(package_name, copr))
125 126 @staticmethod
127 - def get_group_by_name_safe(group_name):
128 try: 129 group = UsersLogic.get_group_by_alias(group_name).one() 130 except sqlalchemy.orm.exc.NoResultFound: 131 raise ObjectNotFound( 132 message="Group {} does not exist.".format(group_name)) 133 return group
134 135 @staticmethod
136 - def get_copr_chroot_safe(copr, chroot_name):
137 try: 138 chroot = CoprChrootsLogic.get_by_name_safe(copr, chroot_name) 139 except (ValueError, KeyError, RuntimeError) as e: 140 raise ObjectNotFound(message=str(e)) 141 142 if not chroot: 143 raise ObjectNotFound( 144 message="Chroot name {} does not exist.".format(chroot_name)) 145 146 return chroot
147 # 148 # @staticmethod 149 # def get_coprs_in_a_group(group_name): 150 # group = ComplexLogic.get_group_by_name_safe(group_name) 151 # 152 # 153 154 @staticmethod
155 - def get_active_groups_by_user(user_name):
156 names = flask.g.user.user_groups 157 if names: 158 query = UsersLogic.get_groups_by_names_list(names) 159 return query.filter(User.name == user_name) 160 else: 161 return []
162 163 @staticmethod
164 - def get_queues_size():
165 # todo: check if count works slowly 166 167 waiting = BuildsLogic.get_build_task_queue(is_background=False).count() 168 waiting_bg = BuildsLogic.get_build_task_queue(is_background=True).count() 169 running = BuildsLogic.get_build_tasks(StatusEnum("running")).count() 170 importing = BuildsLogic.get_build_tasks(helpers.StatusEnum("importing"), background=False).count() 171 importing_bg = BuildsLogic.get_build_tasks(helpers.StatusEnum("importing"), background=True).count() 172 return dict( 173 waiting=waiting, 174 running=running, 175 importing=importing, 176 waiting_bg=waiting_bg, 177 importing_bg=importing_bg 178 )
179
180 181 -class ProjectForking(object):
182 - def __init__(self, user, group=None):
183 self.user = user 184 self.group = group 185 186 if group and not user.can_build_in_group(group): 187 raise exceptions.InsufficientRightsException( 188 "Only members may create projects in the particular groups.")
189
190 - def get(self, copr, name):
191 return CoprsLogic.get_by_group_id(self.group.id, name).first() if self.group \ 192 else CoprsLogic.filter_without_group_projects(CoprsLogic.get(flask.g.user.name, name)).first()
193
194 - def fork_copr(self, copr, name):
195 fcopr = self.get(copr, name) 196 if not fcopr: 197 fcopr = self.create_object(models.Copr, copr, exclude=["id", "group_id"]) 198 fcopr.forked_from_id = copr.id 199 fcopr.user = self.user 200 fcopr.user_id = self.user.id 201 if name: 202 fcopr.name = name 203 if self.group: 204 fcopr.group = self.group 205 fcopr.group_id = self.group.id 206 207 for chroot in list(copr.copr_chroots): 208 CoprChrootsLogic.create_chroot(self.user, fcopr, chroot.mock_chroot, chroot.buildroot_pkgs, 209 comps=chroot.comps, comps_name=chroot.comps_name) 210 db.session.add(fcopr) 211 return fcopr
212
213 - def fork_package(self, package, fcopr):
214 fpackage = PackagesLogic.get(fcopr.id, package.name).first() 215 if not fpackage: 216 fpackage = self.create_object(models.Package, package, exclude=["id", "copr_id"]) 217 fpackage.copr = fcopr 218 db.session.add(fpackage) 219 return fpackage
220
221 - def fork_build(self, build, fcopr, fpackage):
222 fbuild = self.create_object(models.Build, build, exclude=["id", "copr_id", "package_id"]) 223 fbuild.copr = fcopr 224 fbuild.package = fpackage 225 fbuild.build_chroots = [self.create_object(models.BuildChroot, c, exclude=["id", "build_id"]) for c in build.build_chroots] 226 db.session.add(fbuild) 227 return fbuild
228
229 - def create_object(self, clazz, from_object, exclude=list()):
230 arguments = {} 231 for name, column in from_object.__mapper__.columns.items(): 232 if not name in exclude: 233 arguments[name] = getattr(from_object, name) 234 return clazz(**arguments)
235