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

Source Code for Module coprs.logic.packages_logic

  1  import json 
  2  import time 
  3  from sqlalchemy import or_ 
  4  from sqlalchemy import and_, bindparam, Integer 
  5  from sqlalchemy.sql import false, true, text 
  6   
  7  from coprs import app 
  8  from coprs import db 
  9  from coprs import exceptions 
 10  from coprs import models 
 11  from coprs import helpers 
 12  from coprs import forms 
 13   
 14  from coprs.logic import coprs_logic 
 15  from coprs.logic import users_logic 
 16  from coprs.logic import builds_logic 
 17   
 18  from coprs.constants import DEFAULT_BUILD_TIMEOUT 
 19   
 20  log = app.logger 
21 22 23 -class PackagesLogic(object):
24 25 @classmethod
26 - def get_by_id(cls, package_id):
28 29 @classmethod
30 - def get_all(cls, copr_id):
31 return (models.Package.query 32 .filter(models.Package.copr_id == copr_id))
33 34 @classmethod
35 - def get_copr_packages_list(cls, copr):
36 query_select = """ 37 SELECT package.name, build.pkg_version, build.submitted_on, package.webhook_rebuild, order_to_status(subquery2.min_order_for_a_build) AS status 38 FROM package 39 LEFT OUTER JOIN (select MAX(build.id) as max_build_id_for_a_package, package_id 40 FROM build 41 WHERE build.copr_id = :copr_id 42 GROUP BY package_id) as subquery1 ON subquery1.package_id = package.id 43 LEFT OUTER JOIN build ON build.id = subquery1.max_build_id_for_a_package 44 LEFT OUTER JOIN (select build_id, min(status_to_order(status)) as min_order_for_a_build 45 FROM build_chroot 46 GROUP BY build_id) as subquery2 ON subquery2.build_id = subquery1.max_build_id_for_a_package 47 WHERE package.copr_id = :copr_id; 48 """ 49 50 if db.engine.url.drivername == "sqlite": 51 def sqlite_status_to_order(x): 52 if x == 0: 53 return 0 54 elif x == 3: 55 return 1 56 elif x == 6: 57 return 2 58 elif x == 7: 59 return 3 60 elif x == 4: 61 return 4 62 elif x == 1: 63 return 5 64 elif x == 5: 65 return 6 66 return 1000
67 68 def sqlite_order_to_status(x): 69 if x == 0: 70 return 0 71 elif x == 1: 72 return 3 73 elif x == 2: 74 return 6 75 elif x == 3: 76 return 7 77 elif x == 4: 78 return 4 79 elif x == 5: 80 return 1 81 elif x == 6: 82 return 5 83 return 1000
84 85 conn = db.engine.connect() 86 conn.connection.create_function("status_to_order", 1, sqlite_status_to_order) 87 conn.connection.create_function("order_to_status", 1, sqlite_order_to_status) 88 statement = text(query_select) 89 statement.bindparams(bindparam("copr_id", Integer)) 90 result = conn.execute(statement, {"copr_id": copr.id}) 91 else: 92 statement = text(query_select) 93 statement.bindparams(bindparam("copr_id", Integer)) 94 result = db.engine.execute(statement, {"copr_id": copr.id}) 95 96 return result 97 98 @classmethod
99 - def get(cls, copr_id, package_name):
100 return models.Package.query.filter(models.Package.copr_id == copr_id, 101 models.Package.name == package_name)
102 103 @classmethod
104 - def get_for_webhook_rebuild(cls, copr_id, webhook_secret, clone_url, commits):
105 packages = (models.Package.query.join(models.Copr) 106 .filter(models.Copr.webhook_secret == webhook_secret) 107 .filter(models.Package.copr_id == copr_id) 108 .filter(models.Package.webhook_rebuild == true()) 109 .filter(models.Package.source_json.contains(clone_url))) 110 result = [] 111 for package in packages: 112 if cls.commits_belong_to_package(package, commits): 113 result += [package] 114 return result
115 116 @classmethod
117 - def commits_belong_to_package(cls, package, commits):
118 if package.source_type_text == "git_and_tito": 119 for commit in commits: 120 for file_path in commit['added'] + commit['removed'] + commit['modified']: 121 if cls.path_belong_to_package(package, file_path): 122 return True 123 return False 124 return True
125 126 @classmethod
127 - def path_belong_to_package(cls, package, file_path):
128 if package.source_type_text == "git_and_tito": 129 data = package.source_json_dict 130 return file_path.startswith(data["git_dir"] or '') 131 else: 132 return True
133 134 @classmethod
135 - def add(cls, user, copr, package_name, source_type=helpers.BuildSourceEnum("unset"), source_json=json.dumps({})):
136 users_logic.UsersLogic.raise_if_cant_build_in_copr( 137 user, copr, 138 "You don't have permissions to build in this copr.") 139 140 if cls.exists(copr.id, package_name).all(): 141 raise exceptions.DuplicateException( 142 "Project {}/{} already has a package '{}'" 143 .format(copr.owner_name, copr.name, package_name)) 144 145 package = models.Package( 146 name=package_name, 147 copr_id=copr.id, 148 source_type=source_type, 149 source_json=source_json 150 ) 151 152 db.session.add(package) 153 154 return package
155 156 @classmethod
157 - def exists(cls, copr_id, package_name):
158 return (models.Package.query 159 .filter(models.Package.copr_id == copr_id) 160 .filter(models.Package.name == package_name))
161 162 163 @classmethod
164 - def delete_package(cls, user, package):
165 if not user.can_edit(package.copr): 166 raise exceptions.InsufficientRightsException( 167 "You are not allowed to delete package `{}`.".format(package.id)) 168 169 for build in package.builds: 170 builds_logic.BuildsLogic.delete_build(user, build) 171 172 db.session.delete(package)
173 174 175 @classmethod
176 - def reset_package(cls, user, package):
177 if not user.can_edit(package.copr): 178 raise exceptions.InsufficientRightsException( 179 "You are not allowed to reset package `{}`.".format(package.id)) 180 181 package.source_json = json.dumps({}) 182 package.source_type = helpers.BuildSourceEnum("unset") 183 184 db.session.add(package)
185 186 187 @classmethod
188 - def build_package(cls, user, copr, package, chroot_names=None, **build_options):
189 if not package.has_source_type_set or not package.source_json: 190 raise NoPackageSourceException('Unset default source for package {package}'.format(package.name)) 191 return builds_logic.BuildsLogic.create_new(user, copr, package.source_type, package.source_json, chroot_names, **build_options)
192