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

Source Code for Module coprs.logic.builds_logic

  1  import time 
  2   
  3  from coprs import db 
  4  from coprs import exceptions 
  5  from coprs import models 
  6  from coprs import signals 
  7   
  8  from coprs.logic import coprs_logic 
  9  from coprs.logic import users_logic 
10 11 -class BuildsLogic(object):
12 @classmethod
13 - def get(cls, user, build_id):
14 query = models.Build.query.filter(models.Build.id == build_id) 15 return query
16 17 @classmethod
18 - def get_multiple(cls, user, **kwargs):
19 copr = kwargs.get('copr', None) 20 username = kwargs.get('username', None) 21 coprname = kwargs.get('coprname', None) 22 23 query = models.Build.query.order_by(models.Build.submitted_on.desc()) 24 25 # if we get copr, query by its id 26 if copr: 27 query = query.filter(models.Build.copr == copr) 28 elif username and coprname: 29 query = query.join(models.Build.copr).\ 30 options(db.contains_eager(models.Build.copr)).\ 31 join(models.Copr.owner).\ 32 filter(models.Copr.name == coprname).\ 33 filter(models.User.openid_name == models.User.openidize_name(username)).\ 34 order_by(models.Build.submitted_on.desc()) 35 else: 36 raise exceptions.ArgumentMissingException('Must pass either copr or both coprname and username') 37 38 return query
39 40 @classmethod
41 - def get_waiting_builds(cls, user):
42 # return builds that aren't both started and finished (if build start submission 43 # fails, we still want to mark the build as non-waiting, if it ended) 44 # this has very different goal then get_multiple, so implement it alone 45 query = models.Build.query.join(models.Build.copr).\ 46 join(models.User).\ 47 options(db.contains_eager(models.Build.copr)).\ 48 options(db.contains_eager('copr.owner')).\ 49 filter(models.Build.started_on == None).\ 50 filter(models.Build.ended_on == None).\ 51 filter(models.Build.canceled != True).\ 52 order_by(models.Build.submitted_on.asc()) 53 return query
54 55 @classmethod
56 - def get_by_ids(cls, user, ids):
57 return models.Build.query.filter(models.Build.id.in_(ids))
58 59 @classmethod
60 - def add(cls, user, pkgs, copr):
61 coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action(user, copr, 62 'Can\'t build while there is an operation in progress: {action}') 63 users_logic.UsersLogic.raise_if_cant_build_in_copr(user, copr, 64 'You don\'t have permissions to build in this copr.') 65 build = models.Build( 66 pkgs=pkgs, 67 copr=copr, 68 repos=copr.repos, 69 chroots=' '.join(map(lambda x: x.chroot_name, copr.active_mock_chroots)), 70 user=user, 71 submitted_on=int(time.time())) 72 cls.new(user, build, copr) 73 return build
74 75 @classmethod
76 - def new(cls, user, build, copr):
77 if not build.submitted_on: 78 build.submitted_on = int(time.time()) 79 if not build.user: 80 build.user = user 81 82 coprs_logic.CoprsLogic.increment_build_count(user, copr) 83 db.session.add(build)
84 85 @classmethod
86 - def update_state_from_dict(cls, user, build, upd_dict):
87 for attr in ['results', 'started_on', 'ended_on', 'status']: 88 value = upd_dict.get(attr, None) 89 if value != None: 90 setattr(build, attr, value) 91 if attr == 'ended_on': 92 signals.build_finished.send(cls, build=build) 93 94 db.session.add(build)
95 96 @classmethod
97 - def cancel_build(cls, user, build):
98 if build.user_id != user.id: 99 raise exceptions.InsufficientRightsException('You can only cancel your own builds.') 100 build.canceled = True
101