def build_settings(): build = g.build settings_form = forms.SettingsForm() if settings_form.validate_on_submit(): settings_form.populate_obj(build) message = ('name=%s, send_email=%s, email_alias=%s' % ( build.name, build.send_email, build.email_alias)) auth.save_admin_log(build, changed_settings=True, message=message) db.session.add(build) db.session.commit() signals.build_updated.send(app, build=build, user=current_user) return redirect(url_for( request.endpoint, build_id=build.id)) # Update form values for rendering settings_form.name.data = build.name settings_form.public.data = build.public settings_form.build_id.data = build.id settings_form.email_alias.data = build.email_alias settings_form.send_email.data = build.send_email return render_template( 'view_settings.html', build=build, settings_form=settings_form)
def build_settings(): build = g.build settings_form = forms.SettingsForm() if settings_form.validate_on_submit(): settings_form.populate_obj(build) message = ('name=%s, send_email=%s, email_alias=%s' % (build.name, build.send_email, build.email_alias)) auth.save_admin_log(build, changed_settings=True, message=message) db.session.add(build) db.session.commit() signals.build_updated.send(app, build=build, user=current_user) return redirect(url_for(request.endpoint, build_id=build.id)) # Update form values for rendering settings_form.name.data = build.name settings_form.public.data = build.public settings_form.build_id.data = build.id settings_form.email_alias.data = build.email_alias settings_form.send_email.data = build.send_email return render_template('view_settings.html', build=build, settings_form=settings_form)
def _create_build(build_name): build = models.Build(name=build_name) build.public = True db.session.add(build) db.session.flush() auth.save_admin_log(build, created_build=True, message=build.name) db.session.commit() logging.info('Created build via UI: build_id=%r, name=%r', build.id, build.name) return db.session.query(models.Build).filter(models.Build.name == build_name).first()
def view_release(): """Page for viewing all tests runs in a release.""" build = g.build if request.method == 'POST': form = forms.ReleaseForm(request.form) else: form = forms.ReleaseForm(request.args) form.validate() ops = operations.BuildOps(build.id) release, run_list, stats_dict, approval_log = ops.get_release( form.name.data, form.number.data) if not release: abort(404) if request.method == 'POST': decision_states = (models.Release.REVIEWING, models.Release.RECEIVING, models.Release.PROCESSING) if form.good.data and release.status in decision_states: release.status = models.Release.GOOD auth.save_admin_log(build, release_good=True, release=release) elif form.bad.data and release.status in decision_states: release.status = models.Release.BAD auth.save_admin_log(build, release_bad=True, release=release) elif form.reviewing.data and release.status in (models.Release.GOOD, models.Release.BAD): release.status = models.Release.REVIEWING auth.save_admin_log(build, release_reviewing=True, release=release) else: logging.warning( 'Bad state transition for name=%r, number=%r, form=%r', release.name, release.number, form.data) abort(400) db.session.add(release) db.session.commit() ops.evict() return redirect( url_for('view_release', id=build.id, name=release.name, number=release.number)) # Update form values for rendering form.good.data = True form.bad.data = True form.reviewing.data = True return render_template('view_release.html', build=build, release=release, run_list=run_list, release_form=form, approval_log=approval_log, stats_dict=stats_dict)
def new_build(): """Page for crediting or editing a build.""" form = forms.BuildForm() if form.validate_on_submit(): build = models.Build() form.populate_obj(build) build.owners.append(current_user) db.session.add(build) db.session.flush() auth.save_admin_log(build, created_build=True, message=build.name) db.session.commit() operations.UserOps(current_user.get_id()).evict() logging.info('Created build via UI: build_id=%r, name=%r', build.id, build.name) return redirect(url_for('view_build', id=build.id)) return render_template('new_build.html', build_form=form)
def new_build(): """Page for crediting or editing a build.""" form = forms.BuildForm() if form.validate_on_submit(): build = models.Build() form.populate_obj(build) build.owners.append(current_user) db.session.add(build) db.session.flush() auth.save_admin_log(build, created_build=True, message=build.name) db.session.commit() logging.info('Created build via UI: build_id=%r, name=%r', build.id, build.name) return redirect(url_for('view_build', id=build.id)) return render_template( 'new_build.html', build_form=form)
def view_run(): """Page for viewing before/after for a specific test run.""" build = g.build if request.method == 'POST': form = forms.RunForm(request.form) else: form = forms.RunForm(request.args) form.validate() ops = operations.BuildOps(build.id) run, next_run, previous_run, approval_log = ops.get_run( form.name.data, form.number.data, form.test.data) if not run: abort(404) file_type = form.type.data image_file, log_file, config_file, sha1sum = ( _get_artifact_context(run, file_type)) if request.method == 'POST': if form.approve.data and run.status == models.Run.DIFF_FOUND: run.status = models.Run.DIFF_APPROVED auth.save_admin_log(build, run_approved=True, run=run) elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED: run.status = models.Run.DIFF_FOUND auth.save_admin_log(build, run_rejected=True, run=run) else: abort(400) db.session.add(run) db.session.commit() ops.evict() return redirect(url_for( request.endpoint, id=build.id, name=run.release.name, number=run.release.number, test=run.name, type=file_type)) # Update form values for rendering form.approve.data = True form.disapprove.data = True context = dict( build=build, release=run.release, run=run, run_form=form, previous_run=previous_run, next_run=next_run, file_type=file_type, image_file=image_file, log_file=log_file, config_file=config_file, sha1sum=sha1sum, approval_log=approval_log) if file_type: template_name = 'view_artifact.html' else: template_name = 'view_run.html' response = flask.Response(render_template(template_name, **context)) return response
def view_release(): """Page for viewing all tests runs in a release.""" build = g.build if request.method == 'POST': form = forms.ReleaseForm(request.form) else: form = forms.ReleaseForm(request.args) form.validate() ops = operations.BuildOps(build.id) release, run_list, stats_dict, approval_log = ops.get_release( form.name.data, form.number.data) if not release: abort(404) if request.method == 'POST': decision_states = ( models.Release.REVIEWING, models.Release.RECEIVING, models.Release.PROCESSING) if form.good.data and release.status in decision_states: release.status = models.Release.GOOD auth.save_admin_log(build, release_good=True, release=release) elif form.bad.data and release.status in decision_states: release.status = models.Release.BAD auth.save_admin_log(build, release_bad=True, release=release) elif form.reviewing.data and release.status in ( models.Release.GOOD, models.Release.BAD): release.status = models.Release.REVIEWING auth.save_admin_log(build, release_reviewing=True, release=release) else: logging.warning( 'Bad state transition for name=%r, number=%r, form=%r', release.name, release.number, form.data) abort(400) db.session.add(release) db.session.commit() ops.evict() return redirect(url_for( 'view_release', id=build.id, name=release.name, number=release.number)) # Update form values for rendering form.good.data = True form.bad.data = True form.reviewing.data = True return render_template( 'view_release.html', build=build, release=release, run_list=run_list, release_form=form, approval_log=approval_log, stats_dict=stats_dict)
def view_release(): """Page for viewing all tests runs in a release.""" build = g.build if request.method == 'POST': form = forms.ReleaseForm(request.form) else: form = forms.ReleaseForm(request.args) form.validate() ops = operations.BuildOps(build.id) release, run_list, approval_log = ops.get_release( form.name.data, form.number.data) if not release: abort(404) if request.method == 'POST': decision_states = ( models.Release.REVIEWING, models.Release.RECEIVING) if form.good.data and release.status in decision_states: release.status = models.Release.GOOD auth.save_admin_log(build, release_good=True, release=release) elif form.bad.data and release.status in decision_states: release.status = models.Release.BAD auth.save_admin_log(build, release_bad=True, release=release) elif form.reviewing.data and release.status in ( models.Release.GOOD, models.Release.BAD): release.status = models.Release.REVIEWING auth.save_admin_log(build, release_reviewing=True, release=release) else: logging.warning( 'Bad state transition for name=%r, number=%r, form=%r', release.name, release.number, form.data) abort(400) db.session.add(release) db.session.commit() ops.evict() return redirect(url_for( 'view_release', id=build.id, name=release.name, number=release.number)) total, successful, failed, baseline = 0, 0, 0, 0 for run in run_list: if run.status in (models.Run.DIFF_APPROVED, models.Run.DIFF_NOT_FOUND): successful += 1 total += 1 elif run.status == models.Run.DIFF_FOUND: failed += 1 total += 1 elif run.status in (models.Run.NEEDS_DIFF, models.Run.DATA_PENDING): total += 1 elif run.status == models.Run.NO_DIFF_NEEDED: baseline += 1 complete = successful + failed # Update form values for rendering form.good.data = True form.bad.data = True form.reviewing.data = True return render_template( 'view_release.html', build=build, release=release, run_list=run_list, runs_total=total, runs_complete=complete, runs_successful=successful, runs_failed=failed, runs_baseline=baseline, release_form=form, approval_log=approval_log)
def view_run(): """Page for viewing before/after for a specific test run.""" build = g.build if request.method == 'POST': form = forms.RunForm(request.form) else: form = forms.RunForm(request.args) form.validate() ops = operations.BuildOps(build.id) run, next_run, previous_run, approval_log = ops.get_run( form.name.data, form.number.data, form.test.data) if not run: abort(404) file_type = form.type.data image_file, log_file, config_file, sha1sum = (_get_artifact_context( run, file_type)) if request.method == 'POST': if form.approve.data and run.status == models.Run.DIFF_FOUND: run.status = models.Run.DIFF_APPROVED auth.save_admin_log(build, run_approved=True, run=run) elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED: run.status = models.Run.DIFF_FOUND auth.save_admin_log(build, run_rejected=True, run=run) else: abort(400) db.session.add(run) db.session.commit() ops.evict() return redirect( url_for(request.endpoint, id=build.id, name=run.release.name, number=run.release.number, test=run.name, type=file_type)) # Update form values for rendering form.approve.data = True form.disapprove.data = True context = dict(build=build, release=run.release, run=run, run_form=form, previous_run=previous_run, next_run=next_run, file_type=file_type, image_file=image_file, log_file=log_file, config_file=config_file, sha1sum=sha1sum, approval_log=approval_log) if file_type: template_name = 'view_artifact.html' else: template_name = 'view_run.html' response = flask.Response(render_template(template_name, **context)) return response
def view_run(): """Page for viewing before/after for a specific test run.""" build = g.build if request.method == 'POST': form = forms.RunForm(request.form) else: form = forms.RunForm(request.args) form.validate() run = ( models.Run.query .join(models.Release) .filter(models.Release.name == form.name.data) .filter(models.Release.number == form.number.data) .filter(models.Run.name == form.test.data) .first()) if not run: abort(404) file_type = form.type.data image_file, log_file, config_file, sha1sum = ( _get_artifact_context(run, file_type)) if request.method == 'POST': if form.approve.data and run.status == models.Run.DIFF_FOUND: run.status = models.Run.DIFF_APPROVED auth.save_admin_log(build, run_approved=True, run=run) elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED: run.status = models.Run.DIFF_FOUND auth.save_admin_log(build, run_rejected=True, run=run) else: abort(400) db.session.add(run) db.session.commit() return redirect(url_for( request.endpoint, id=build.id, name=run.release.name, number=run.release.number, test=run.name, type=file_type)) # We sort the runs in the release by diffs first, then by name. Simulate # that behavior here with multiple queries. previous_run = None next_run = None if run.status in models.Run.DIFF_NEEDED_STATES: previous_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .filter(models.Run.name < run.name) .order_by(models.Run.name.desc()) .first()) next_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .filter(models.Run.name > run.name) .order_by(models.Run.name) .first()) if not next_run: next_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .order_by(models.Run.name) .first()) else: previous_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .filter(models.Run.name < run.name) .order_by(models.Run.name.desc()) .first()) next_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .filter(models.Run.name > run.name) .order_by(models.Run.name) .first()) if not previous_run: previous_run = ( models.Run.query .filter_by(release_id=run.release_id) .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES)) .order_by(models.Run.name.desc()) .first()) # Update form values for rendering form.approve.data = True form.disapprove.data = True # Figure out who approved it approval_log = None if run.status == models.Run.DIFF_APPROVED: approval_log = ( models.AdminLog.query .filter_by(run_id=run.id, log_type=models.AdminLog.RUN_APPROVED) .order_by(models.AdminLog.created.desc()) .first()) context = dict( build=build, release=run.release, run=run, run_form=form, previous_run=previous_run, next_run=next_run, file_type=file_type, image_file=image_file, log_file=log_file, config_file=config_file, sha1sum=sha1sum, approval_log=approval_log) if file_type: template_name = 'view_artifact.html' else: template_name = 'view_run.html' return render_template(template_name, **context)
def view_release(): """Page for viewing all tests runs in a release.""" build = g.build if request.method == 'POST': form = forms.ReleaseForm(request.form) else: form = forms.ReleaseForm(request.args) form.validate() release = ( models.Release.query .filter_by( build_id=build.id, name=form.name.data, number=form.number.data) .first()) if not release: abort(404) if request.method == 'POST': decision_states = ( models.Release.REVIEWING, models.Release.RECEIVING) if form.good.data and release.status in decision_states: release.status = models.Release.GOOD auth.save_admin_log(build, release_good=True, release=release) elif form.bad.data and release.status in decision_states: release.status = models.Release.BAD auth.save_admin_log(build, release_bad=True, release=release) elif form.reviewing.data and release.status in ( models.Release.GOOD, models.Release.BAD): release.status = models.Release.REVIEWING auth.save_admin_log(build, release_reviewing=True, release=release) else: logging.warning( 'Bad state transition for name=%r, number=%r, form=%r', release.name, release.number, form.data) abort(400) db.session.add(release) db.session.commit() return redirect(url_for( 'view_release', id=build.id, name=release.name, number=release.number)) # Sort errors first, then by name. Also show errors that were manually # approved, so the paging sort order stays the same even after users # approve a diff on the run page. def sort(run): if run.status in models.Run.DIFF_NEEDED_STATES: return (0, run.name) return (1, run.name) run_list = sorted(release.runs, key=sort) total, complete, successful, failed, baseline = classify_runs(run_list) # Figure out who marked is as good it approval_log = None if release.status in (models.Release.GOOD, models.Release.BAD): approval_log = ( models.AdminLog.query .filter_by(release_id=release.id) .filter(models.AdminLog.log_type.in_( (models.AdminLog.RELEASE_BAD, models.AdminLog.RELEASE_GOOD))) .order_by(models.AdminLog.created.desc()) .first()) # Update form values for rendering form.good.data = True form.bad.data = True form.reviewing.data = True return render_template( 'view_release.html', build=build, release=release, run_list=run_list, runs_total=total, runs_complete=complete, runs_successful=successful, runs_failed=failed, runs_baseline=baseline, release_form=form, approval_log=approval_log)