Package coprs :: Package views :: Package coprs_ns :: Module coprs_general
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.coprs_ns.coprs_general

  1  import time 
  2   
  3  import flask 
  4  import sqlalchemy 
  5   
  6  from coprs import db 
  7  from coprs import exceptions 
  8  from coprs import forms 
  9  from coprs import helpers 
 10  from coprs import models 
 11   
 12  from coprs.views.misc import login_required, page_not_found 
 13   
 14  from coprs.views.coprs_ns import coprs_ns 
 15   
 16  from coprs.logic import builds_logic 
 17  from coprs.logic import coprs_logic 
18 19 @coprs_ns.route('/', defaults = {'page': 1}) 20 @coprs_ns.route('/<int:page>/') 21 -def coprs_show(page=1):
22 query = coprs_logic.CoprsLogic.get_multiple(flask.g.user, with_mock_chroots=True) 23 paginator = helpers.Paginator(query, query.count(), page) 24 25 coprs = paginator.sliced_query 26 return flask.render_template('coprs/show.html', coprs=coprs, paginator=paginator)
27
28 29 @coprs_ns.route('/owned/<username>/', defaults = {'page': 1}) 30 @coprs_ns.route('/owned/<username>/<int:page>/') 31 -def coprs_by_owner(username=None, page=1):
32 query = coprs_logic.CoprsLogic.get_multiple(flask.g.user, 33 user_relation='owned', 34 username=username, 35 with_mock_chroots=True) 36 paginator = helpers.Paginator(query, query.count(), page) 37 38 coprs = paginator.sliced_query 39 return flask.render_template('coprs/show.html', coprs=coprs, paginator=paginator)
40
41 42 @coprs_ns.route('/allowed/<username>/', defaults = {'page': 1}) 43 @coprs_ns.route('/allowed/<username>/<int:page>/') 44 -def coprs_by_allowed(username=None, page=1):
45 query = coprs_logic.CoprsLogic.get_multiple(flask.g.user, 46 user_relation='allowed', 47 username=username, 48 with_mock_chroots=True) 49 paginator = helpers.Paginator(query, query.count(), page) 50 51 coprs = paginator.sliced_query 52 return flask.render_template('coprs/show.html', coprs=coprs, paginator=paginator)
53
54 @coprs_ns.route('/fulltext/', defaults = {'page': 1}) 55 @coprs_ns.route('/fulltext/<int:page>/') 56 -def coprs_fulltext_search(page=1):
57 fulltext = flask.request.args.get('fulltext', '') 58 query = coprs_logic.CoprsLogic.get_multiple_fulltext(flask.g.user, fulltext) 59 paginator = helpers.Paginator(query, query.count(), page) 60 61 coprs = paginator.sliced_query 62 return flask.render_template('coprs/show.html', 63 coprs=coprs, 64 paginator=paginator, 65 fulltext=fulltext)
66
67 @coprs_ns.route('/add/') 68 @login_required 69 -def copr_add():
70 form = forms.CoprFormFactory.create_form_cls()() 71 72 return flask.render_template('coprs/add.html', form = form)
73
74 75 @coprs_ns.route('/new/', methods=['POST']) 76 @login_required 77 -def copr_new():
78 """ Receive information from the user on how to create its new copr 79 and create it accordingly. 80 """ 81 form = forms.CoprFormFactory.create_form_cls()() 82 if form.validate_on_submit(): 83 copr = coprs_logic.CoprsLogic.add(flask.g.user, 84 name=form.name.data, 85 repos=form.repos.data.replace('\n', ' '), 86 selected_chroots=form.selected_chroots, 87 description=form.description.data, 88 instructions=form.instructions.data) 89 db.session.commit() 90 flask.flash('New copr was successfully created.') 91 92 if form.initial_pkgs.data: 93 builds_logic.BuildsLogic.add(flask.g.user, 94 pkgs=form.initial_pkgs.data.replace('\n', ' '), 95 copr=copr) 96 db.session.commit() 97 flask.flash('Initial packages were successfully submitted ' 98 'for building.') 99 100 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username=flask.g.user.name, coprname=copr.name)) 101 else: 102 return flask.render_template('coprs/add.html', form = form)
103
104 @coprs_ns.route('/detail/<username>/<coprname>/') 105 -def copr_detail(username, coprname):
106 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_mock_chroots=True) 107 form = forms.CoprLegalFlagForm() 108 try: 109 copr = query.one() 110 except sqlalchemy.orm.exc.NoResultFound: 111 return page_not_found('Copr with name {0} does not exist.'.format(coprname)) 112 113 return flask.render_template('coprs/detail/overview.html', 114 copr=copr, 115 form=form)
116
117 @coprs_ns.route('/detail/<username>/<coprname>/permissions/') 118 -def copr_permissions(username, coprname):
119 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname) 120 copr = query.first() 121 if not copr: 122 return page_not_found('Copr with name {0} does not exist.'.format(coprname)) 123 124 permissions = coprs_logic.CoprPermissionsLogic.get_for_copr(flask.g.user, copr).all() 125 if flask.g.user: 126 user_perm = flask.g.user.permissions_for_copr(copr) 127 else: 128 user_perm = None 129 130 permissions_applier_form = None 131 permissions_form = None 132 133 # generate a proper form for displaying 134 if flask.g.user: 135 if flask.g.user.can_edit(copr): 136 permissions_form = forms.PermissionsFormFactory.create_form_cls(permissions)() 137 else: 138 # https://github.com/ajford/flask-wtf/issues/58 139 permissions_applier_form = forms.PermissionsApplierFormFactory.create_form_cls(user_perm)(formdata=None) 140 141 return flask.render_template('coprs/detail/permissions.html', 142 copr = copr, 143 permissions_form = permissions_form, 144 permissions_applier_form = permissions_applier_form, 145 permissions = permissions, 146 current_user_permissions = user_perm)
147
148 @coprs_ns.route('/detail/<username>/<coprname>/edit/') 149 @login_required 150 -def copr_edit(username, coprname, form=None):
151 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname) 152 copr = query.first() 153 154 if not copr: 155 return page_not_found('Copr with name {0} does not exist.'.format(coprname)) 156 if not form: 157 form = forms.CoprFormFactory.create_form_cls(copr.mock_chroots)(obj=copr) 158 159 return flask.render_template('coprs/detail/edit.html', 160 copr=copr, 161 form=form)
162
163 164 @coprs_ns.route('/detail/<username>/<coprname>/update/', methods = ['POST']) 165 @login_required 166 -def copr_update(username, coprname):
167 form = forms.CoprFormFactory.create_form_cls()() 168 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 169 170 if form.validate_on_submit(): 171 # we don't change owner (yet) 172 copr.name = form.name.data 173 copr.repos = form.repos.data.replace('\n', ' ') 174 copr.description = form.description.data 175 copr.instructions = form.instructions.data 176 coprs_logic.CoprChrootsLogic.update_from_names(flask.g.user, copr, form.selected_chroots) 177 178 try: 179 coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates 180 except (exceptions.ActionInProgressException, exceptions.InsufficientRightsException) as e: 181 flask.flash(e) 182 db.session.rollback() 183 else: 184 flask.flash('Copr was updated successfully.') 185 db.session.commit() 186 187 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = copr.name)) 188 else: 189 return copr_edit(username, coprname, form)
190
191 192 @coprs_ns.route('/detail/<username>/<coprname>/permissions_applier_change/', methods = ['POST']) 193 @login_required 194 -def copr_permissions_applier_change(username, coprname):
195 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 196 permission = coprs_logic.CoprPermissionsLogic.get(flask.g.user, copr, flask.g.user).first() 197 applier_permissions_form = forms.PermissionsApplierFormFactory.create_form_cls(permission)() 198 199 if not copr: 200 return page_not_found('Copr with name {0} does not exist.'.format(name)) 201 if copr.owner == flask.g.user: 202 flask.flash('Owner cannot request permissions for his own copr.') 203 elif applier_permissions_form.validate_on_submit(): 204 # we rely on these to be 0 or 1 from form. TODO: abstract from that 205 new_builder = applier_permissions_form.copr_builder.data 206 new_admin = applier_permissions_form.copr_admin.data 207 coprs_logic.CoprPermissionsLogic.update_permissions_by_applier(flask.g.user, copr, permission, new_builder, new_admin) 208 db.session.commit() 209 flask.flash('Successfuly updated permissions do Copr "{0}".'.format(copr.name)) 210 211 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
212
213 @coprs_ns.route('/detail/<username>/<coprname>/update_permissions/', methods = ['POST']) 214 @login_required 215 -def copr_update_permissions(username, coprname):
216 query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname) 217 copr = query.first() 218 permissions = copr.copr_permissions 219 permissions_form = forms.PermissionsFormFactory.create_form_cls(permissions)() 220 221 if permissions_form.validate_on_submit(): 222 # we don't change owner (yet) 223 try: 224 # if admin is changing his permissions, his must be changed last 225 # so that we don't get InsufficientRightsException 226 permissions.sort(cmp=lambda x, y: -1 if y.user_id == flask.g.user.id else 1) 227 for perm in permissions: 228 new_builder = permissions_form['copr_builder_{0}'.format(perm.user_id)].data 229 new_admin = permissions_form['copr_admin_{0}'.format(perm.user_id)].data 230 coprs_logic.CoprPermissionsLogic.update_permissions(flask.g.user, copr, perm, new_builder, new_admin) 231 # for now, we don't check for actions here, as permissions operation don't collide with any actions 232 except exceptions.InsufficientRightsException as e: 233 db.session.rollback() 234 flask.flash(e) 235 else: 236 db.session.commit() 237 flask.flash('Copr permissions were updated successfully.') 238 239 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
240
241 @coprs_ns.route('/detail/<username>/<coprname>/delete/', methods=['GET', 'POST']) 242 @login_required 243 -def copr_delete(username, coprname):
244 form = forms.CoprDeleteForm() 245 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 246 247 if form.validate_on_submit(): 248 try: 249 coprs_logic.CoprsLogic.delete(flask.g.user, copr) 250 except (exceptions.ActionInProgressException, exceptions.InsufficientRightsException) as e: 251 db.session.rollback() 252 flask.flash(e) 253 return flask.redirect(flask.url_for('coprs_ns.copr_detail', username=username, coprname=coprname)) 254 else: 255 db.session.commit() 256 flask.flash('Copr was deleted successfully.') 257 return flask.redirect(flask.url_for('coprs_ns.coprs_by_owner', username=username)) 258 else: 259 return flask.render_template('coprs/detail/delete.html', form=form, copr=copr)
260 275
276 @coprs_ns.route('/repo/<reponame>.repo') 277 -def generate_repo_file(reponame):
278 ''' Generate repo file for a given repo name. 279 Reponame = username-coprname ''' 280 # This solution is used because flask splits off the last part after a 281 # dash, therefore user-re-po resolves to user-re/po instead of user/re-po 282 # FAS usernames may not contain dashes, so this construction is safe. 283 284 if '-' not in reponame: 285 return page_not_found('Bad repository name: {0}. Must be username-coprname'.format(reponame)) 286 287 username, coprname = reponame.split('-', 1) 288 copr = None 289 try: 290 # query.one() is used since it fetches all builds, unlike query.first(). 291 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, 292 with_builds=True).one() 293 except sqlalchemy.orm.exc.NoResultFound: 294 return page_not_found('Copr {0}/{1} does not exist'.format(username, coprname)) 295 296 url = '' 297 for build in copr.builds: 298 if build.results: 299 url = build.results 300 break 301 302 if not url: 303 return page_not_found('Repository not initialized: No finished builds in {0}/{1}.'.format(username, coprname)) 304 305 response = flask.make_response(flask.render_template('coprs/copr.repo', copr=copr, url=url)) 306 response.mimetype='text/plain' 307 return response
308