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