def validate_or_flash(self): """ If the form is valid, returns True. Otherwise sets appropriate validations errors as flash messages and returns False. """ if self.validate_on_submit(): return True flash_nak("Validation errors: " + ', '.join(x for i in self.errors.values() for x in i)) return False
def add_packages(): """ Mark multiple packages as tracked. Optionally add them to a group. """ form = forms.AddPackagesForm() if request.method == 'POST': if not form.validate_or_flash(): return render_template("add-packages.html", form=form) names = set(form.packages.data) try: collection = [ c for c in g.collections if c.name == form.collection.data ][0] except IndexError: abort(404) try: added = data.track_packages(session, collection, names) except data.PackagesDontExist as e: db.rollback() flash_nak(str(e)) # frontend doesn't have Koji access, so it needs to rely on backend's polling flash_nak( dedent(""" If a package has been just created, it is possible that it hasn't been propagated to our database yet. In that case, please, try again later. """)) return render_template("add-packages.html", form=form) if form.group.data: namespace, name = PackageGroup.parse_name(form.group.data) group = db.query(PackageGroup)\ .filter_by(namespace=namespace, name=name)\ .first_or_404() if not group.editable: abort(400) data.set_group_content(session, group, names, append=True) flash_ack("Packages added: {}".format(','.join(p.name for p in added))) db.commit() return redirect(request.form.get('next') or url_for('frontpage')) return render_template("add-packages.html", form=form)
def add_packages(): """ Mark multiple packages as tracked. Optionally add them to a group. """ form = forms.AddPackagesForm() if request.method == 'POST': if not form.validate_or_flash(): return render_template("add-packages.html", form=form) names = set(form.packages.data) try: collection = [c for c in g.collections if c.name == form.collection.data][0] except IndexError: abort(404) try: added = data.track_packages(session, collection, names) except data.PackagesDontExist as e: db.rollback() flash_nak(str(e)) # frontend doesn't have Koji access, so it needs to rely on backend's polling flash_nak(dedent(""" If a package has been just created, it is possible that it hasn't been propagated to our database yet. In that case, please, try again later. """)) return render_template("add-packages.html", form=form) if form.group.data: namespace, name = PackageGroup.parse_name(form.group.data) group = db.query(PackageGroup)\ .filter_by(namespace=namespace, name=name)\ .first_or_404() if not group.editable: abort(400) data.set_group_content(session, group, names, append=True) flash_ack("Packages added: {}".format(','.join(p.name for p in added))) db.commit() return redirect(request.form.get('next') or url_for('frontpage')) return render_template("add-packages.html", form=form)
def user_packages(username): """ Displays packages for the current user. What it means is defined by plugins. In Fedora, pagure plugin is used, which queries pagure for packages maintained by the user. """ names = [] try: results = plugin.dispatch_event('get_user_packages', session, username=username) for result in results: if result: names += result except Exception: flash_nak("Error retrieving user's packages") session.log.exception("Error retrieving user's packages") def query_fn(query): return query.filter(BasePackage.name.in_(names) if names else false()) return package_view("user-packages.html", query_fn, username=username)
def cancel_build(build_id): """ Requests cancellation of a build by marking the build in the DB. Doesn't do the cancellation itself, as frontend doens't have access to Koji. Backend polls for the atttribute. """ if not g.user.admin: abort(403) build = db.query(Build).filter_by(id=build_id).first_or_404() if forms.EmptyForm().validate_or_flash(): if build.state != Build.RUNNING: flash_nak("Only running builds can be canceled.") elif build.cancel_requested: flash_nak("Build already has pending cancelation request.") else: flash_ack("Cancelation request sent.") session.log_user_action( "Build (id={build.id}, task_id={build.task_id}) cancelation requested" .format(build=build)) build.cancel_requested = True db.commit() return redirect(url_for('package_detail', name=build.package.name))
def cancel_build(build_id): """ Requests cancellation of a build by marking the build in the DB. Doesn't do the cancellation itself, as frontend doens't have access to Koji. Backend polls for the atttribute. """ if not g.user.admin: abort(403) build = db.query(Build).filter_by(id=build_id).first_or_404() if forms.EmptyForm().validate_or_flash(): if build.state != Build.RUNNING: flash_nak("Only running builds can be canceled.") elif build.cancel_requested: flash_nak("Build already has pending cancelation request.") else: flash_ack("Cancelation request sent.") session.log_user_action( "Build (id={build.id}, task_id={build.task_id}) cancelation requested" .format(build=build) ) build.cancel_requested = True db.commit() return redirect(url_for('package_detail', name=build.package.name))
def process_group_form(group=None): """ Validate and process submitted group form. :param group: :return: """ if request.method == 'GET': # construct new form if group: # edit form obj = dict(name=group.name, owners=[u.name for u in group.owners], packages=[p.name for p in group.packages]) form = forms.GroupForm(**obj) else: # creation form form = forms.GroupForm(owners=[g.user.name]) return render_template('edit-group.html', group=group, form=form) form = forms.GroupForm() # check permissions if group and not group.editable: flash_nak("You don't have permission to edit this group") return redirect( url_for('group_detail', name=group.name, namespace=group.namespace)) # check form validity if not form.validate_or_flash(): return render_template('edit-group.html', group=group, form=form) # existing group being edited or None - to be sent into template existing_group = group if not group: group = PackageGroup(namespace=g.user.name) db.add(group) group.name = form.name.data try: db.flush() except IntegrityError: db.rollback() flash_nak("Group already exists") return render_template('edit-group.html', group=existing_group, form=form) try: data.set_group_content(session, group, form.packages.data) data.set_group_maintainers(session, group, form.owners.data) except data.PackagesDontExist as e: db.rollback() flash_nak(str(e)) return render_template('edit-group.html', group=existing_group, form=form) db.commit() flash_ack("Group created" if not existing_group else "Group modified") return redirect( url_for('group_detail', name=group.name, namespace=group.namespace))
def process_group_form(group=None): """ Validate and process submitted group form. :param group: :return: """ if request.method == 'GET': # construct new form if group: # edit form obj = dict(name=group.name, owners=[u.name for u in group.owners], packages=[p.name for p in group.packages]) form = forms.GroupForm(**obj) else: # creation form form = forms.GroupForm(owners=[g.user.name]) return render_template('edit-group.html', group=group, form=form) form = forms.GroupForm() # check permissions if group and not group.editable: flash_nak("You don't have permission to edit this group") return redirect(url_for('group_detail', name=group.name, namespace=group.namespace)) # check form validity if not form.validate_or_flash(): return render_template('edit-group.html', group=group, form=form) # existing group being edited or None - to be sent into template existing_group = group if not group: group = PackageGroup(namespace=g.user.name) db.add(group) group.name = form.name.data try: db.flush() except IntegrityError: db.rollback() flash_nak("Group already exists") return render_template('edit-group.html', group=existing_group, form=form) try: data.set_group_content(session, group, form.packages.data) data.set_group_maintainers(session, group, form.owners.data) except data.PackagesDontExist as e: db.rollback() flash_nak(str(e)) return render_template('edit-group.html', group=existing_group, form=form) db.commit() flash_ack("Group created" if not existing_group else "Group modified") return redirect(url_for('group_detail', name=group.name, namespace=group.namespace))
def validate_or_flash(self): if self.validate_on_submit(): return True flash_nak("Validation errors: " + ', '.join(x for i in self.errors.values() for x in i)) return False