def edit_iteration(iteration_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): form = EditIterationForm() if form.validate_on_submit(): iteration.description = form.notes.data iteration.updated = datetime.utcnow() db.session.add(iteration) db.session.commit() flash('Notes updated') return redirect( url_for('ml.view_iteration', iteration_id=iteration_id)) form.notes.data = iteration.description project = Project.query.get(project_id) return render_template('ml/iteration_edit.html', title='Edit Iteration', form=form, iteration=iteration, model=model, project=project) # permission denied abort(403)
def add_label(iteration_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) subq = ModelLabel.query.filter( ModelLabel.iteration_id == iteration_id).with_entities( ModelLabel.label_id).subquery() q = ProjectLabel.query.filter( ProjectLabel.project_id == project_id).join(Label).join( LabelType).filter(LabelType.parent_type == None).filter( ProjectLabel.label_id.notin_(subq)) labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False) project = Project.query.get(project_id) return render_template('ml/unused_labels.html', title='Unused Labels', labels=labels, iteration=iteration, model=model, project=project) # permission denied abort(403)
def copy_iteration(iteration_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): form = EditIterationForm() if form.validate_on_submit(): new_iteration = ModelIteration() new_iteration.model = iteration.model new_iteration.description = form.notes.data db.session.add(new_iteration) labels = ModelLabel.query.filter( ModelLabel.iteration_id == iteration_id).all() for label in labels: new_label = ModelLabel() new_label.iteration = new_iteration new_label.label = label.label new_label.combine_with = label.combine_with db.session.add(new_label) db.session.commit() flash('New iteration created') return redirect( url_for('ml.view_iteration', iteration_id=new_iteration.id)) form.notes.data = iteration.description project = Project.query.get(project_id) return render_template('ml/iteration_copy.html', title='Copy Iteration', form=form, iteration=iteration, model=model, project=project) # permission denied abort(403)
def delete_clip_label(file_name, offset, label_id): clip_label = LabeledClip.query.get(label_id) project_id = clip_label.file.recording_device.station.project.id admin_permission = ManageLabelsPermission(project_id) if clip_label.user == current_user or admin_permission.can(): db.session.delete(clip_label) db.session.commit() flash('Label deleted.') return redirect( url_for('labels.view_clip', file_name=file_name, offset=offset))
def _delete_project_label(): data = request.get_json() project_label = ProjectLabel.query.get(data['id']) project_id = project_label.project_id permission = ManageLabelsPermission(project_id) if permission.can(): db.session.delete(project_label) db.session.commit() return jsonify(success=True) else: return jsonify({'message': 'Permission denied'}), 403
def list_models(project_id): permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) project = Project.query.get(project_id) q = project.models models = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False) return render_template('ml/model_list.html', title='Machine Learning Models', models=models, project=project) # permission denied abort(403)
def view_clip(file_name, offset): delete_form = DeleteForm() form = EditForm() form.select_type.query = LabelType.query.filter( LabelType.parent_id == None) wav_file = AudioFile.query.filter_by(name=file_name).first() station = wav_file.recording_device.station project_id = station.project_id lq = Label.query.join(LabelType).join( ProjectLabel, Label.id == ProjectLabel.label_id).filter( ProjectLabel.project_id == project_id) form.select_label.query = lq.filter(LabelType.parent_id == None) form.select_sub_label.query = lq.filter(LabelType.parent_id != None) add_permission = AddLabelPermission(project_id) view_permission = ViewResultsPermission(project_id) if form.validate_on_submit(): if add_permission.can(): label = LabeledClip(file_name=file_name, offset=offset, duration=current_app.config['CLIP_SECS'], certain=form.certainty.data, label=form.select_label.data, sub_label=form.select_sub_label.data, notes=form.notes.data, user=current_user, modified=datetime.utcnow()) db.session.add(label) db.session.commit() flash('Label added.') return redirect( url_for('labels.view_clip', file_name=file_name, offset=offset)) # permission denied abort(403) if view_permission.can(): admin_permission = ManageLabelsPermission(project_id) labels = LabeledClip.query.filter_by( file_name=file_name, offset=offset).order_by(LabeledClip.modified.desc()).all() return render_template('labels/view_clip.html', title='Add/edit labels', delete_form=delete_form, form=form, labels=labels, wav_file=wav_file, offset=offset, station=station, admin=admin_permission.can()) # permission denied abort(403)
def iteration_clips(iteration_id): iteration = ModelIteration.query.get(iteration_id) project = iteration.model.project q = LabeledClip.query.join(AudioFile).join( AudioFile.monitoring_station).filter( MonitoringStation.project == project) filter_form = FilterForm(request.args, meta={'csrf': False}) fq = Label.query.join(ModelLabel, Label.id == ModelLabel.label_id).filter( ModelLabel.iteration == iteration).order_by(Label.name) filter_form.select_label.query = fq if filter_form.validate(): if filter_form.select_label.data: q = q.filter(LabeledClip.label == filter_form.select_label.data) if filter_form.certain.data: q = q.filter(LabeledClip.certain == filter_form.certain.data) permission = ManageLabelsPermission(project.id) labeling = (iteration.status == StatusEnum.labeling) use_form = UseTrainingClipsForm() if permission.can() and labeling and use_form.validate_on_submit(): training_clips_q = TrainingClip.query.join(LabeledClip).filter( TrainingClip.iteration_id == iteration.id) if use_form.use.data: selected_clips = q.filter( LabeledClip.id.notin_( training_clips_q.with_entities(LabeledClip.id))) for clip in selected_clips: training_clip = TrainingClip(iteration_id=iteration.id, labeled_clip_id=clip.id) db.session.add(training_clip) if use_form.do_not_use.data: selected_clips = training_clips_q.filter( LabeledClip.id.in_(q.with_entities(LabeledClip.id))) for training_clip in selected_clips: db.session.delete(training_clip) db.session.commit() clips_count = q.count() page = request.args.get('page', 1, type=int) per_page = request.args.get('per_page', current_app.config['ITEMS_PER_PAGE'], type=int) clips = q.paginate(page, per_page, False) return render_template('ml/iteration_clips.html', title='Labeled Clips', filter_form=filter_form, use_form=use_form, clips_count=clips_count, clips=clips, iteration=iteration, labeling=labeling)
def edit_label(iteration_id, label_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can() and iteration.status == StatusEnum.labeling: model_label = ModelLabel.query.filter( ModelLabel.label_id == label_id).filter( ModelLabel.iteration_id == iteration_id).first() if model_label: combine_with = model_label.combine_with else: combine_with = None form = IterationLabelForm(combine_with=combine_with) form.combine_with.query = Label.query.join( ModelLabel, Label.id == ModelLabel.label_id).filter( ModelLabel.iteration_id == iteration_id).filter( ModelLabel.label_id != label_id).order_by(Label.name) label = Label.query.get(label_id) if form.validate_on_submit(): if model_label == None: model_label = ModelLabel(iteration=iteration, label=label) change = 'Added' else: change = 'Updated' model_label.combine_with = form.combine_with.data iteration.updated = datetime.utcnow() db.session.add(model_label) db.session.add(iteration) db.session.commit() flash(change + ' ' + label.name) return redirect( url_for('ml.iteration_clips', iteration_id=iteration_id, select_label=label_id)) project = Project.query.get(project_id) return render_template('ml/label_edit.html', title='Add/Edit Label', form=form, iteration=iteration, model=model, project=project, label=label) # permission denied abort(403)
def list_iterations(model_id): model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) q = model.iterations.order_by(ModelIteration.updated.desc()) iterations = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False) project = Project.query.get(project_id) return render_template('ml/iteration_list.html', title='Model Iterations', iterations=iterations, model=model, project=project) # permission denied abort(403)
def list_sublabels(project_id): permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) project = Project.query.get(project_id) q = project.labels.join(Label).join(LabelType).filter( LabelType.parent_id != None).order_by(Label.name) labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False) labels_schema = ProjectLabelSchema(many=True) labels_json = labels_schema.dumps(labels.items) return render_template('projects/sublabel_list.html', title='Project Sublabels', labels=labels, labels_json=labels_json, project=project) # permission denied abort(403)
def view_errors(model_label_id): model_label = ModelLabel.query.get(model_label_id) iteration = model_label.iteration model = iteration.model project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) errors = model_label.training_errors.paginate( page, current_app.config['ITEMS_PER_PAGE'], False) project = Project.query.get(project_id) return render_template('ml/training_errors.html', title='Training Errors', errors=errors, model_label=model_label, iteration=iteration, model=model, project=project)
def _add_project_label(): data = request.get_json() project_id = data['project_id'] permission = ManageLabelsPermission(project_id) if permission.can(): q = ProjectLabel.query.filter( ProjectLabel.project_id == project_id).filter( ProjectLabel.label_id == data['label_id']) existing_label = q.first() if existing_label: return jsonify({'message': 'You have already added this label'}), 409 project_label_schema = ProjectLabelSchema() new_label = project_label_schema.load(data) db.session.add(new_label) db.session.commit() return project_label_schema.jsonify(new_label) else: return jsonify({'message': 'Permission denied'}), 403
def delete_label(iteration_id, label_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can() and iteration.status == StatusEnum.labeling: model_label = ModelLabel.query.filter( ModelLabel.label_id == label_id).filter( ModelLabel.iteration_id == iteration_id).first() label = Label.query.get(label_id) iteration.updated = datetime.utcnow() db.session.delete(model_label) db.session.add(iteration) db.session.commit() flash('Removed ' + label.name) return redirect(url_for('ml.view_iteration', iteration_id=iteration_id)) # permission denied abort(403)
def next_status(iteration_id): iteration = ModelIteration.query.get(iteration_id) model_id = iteration.model_id model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): next_status = iteration.next_status() if next_status: iteration.status = next_status iteration.updated = datetime.utcnow() db.session.add(iteration) db.session.commit() flash('Updated status') else: flash('Invalid status change') return redirect(url_for('ml.view_iteration', iteration_id=iteration_id)) # permission denied abort(403)
def new_model(project_id): permission = ManageLabelsPermission(project_id) if permission.can(): form = EditModelForm() if form.validate_on_submit(): model = MLModel() model.project_id = project_id model.name = form.name.data model.description = form.description.data db.session.add(model) db.session.commit() flash('New model created') return redirect(url_for('ml.list_models', project_id=project_id)) project = Project.query.get(project_id) return render_template('ml/model_edit.html', title='New Model', form=form, project=project) # permission denied abort(403)
def _use_clip(iteration_id, clip_id): q = TrainingClip.query.filter( TrainingClip.iteration_id == iteration_id).filter( TrainingClip.labeled_clip_id == clip_id) training_clip = q.first() is_used = (training_clip is not None) if request.method == 'POST': iteration = ModelIteration.query.get(iteration_id) project_id = iteration.model.project_id permission = ManageLabelsPermission(project_id) if permission.can() and iteration.status == StatusEnum.labeling: use = request.get_json() if use == True and is_used == False: training_clip = TrainingClip(iteration_id=iteration_id, labeled_clip_id=clip_id) db.session.add(training_clip) is_used = True elif use == False and is_used == True: db.session.delete(training_clip) is_used = False db.session.commit() return jsonify(is_used)
def new_iteration(model_id): model = MLModel.query.get(model_id) project_id = model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): form = EditIterationForm() if form.validate_on_submit(): iteration = ModelIteration() iteration.model = model iteration.description = form.notes.data db.session.add(iteration) db.session.commit() flash('New iteration created') return redirect( url_for('ml.view_iteration', iteration_id=iteration.id)) project = Project.query.get(project_id) return render_template('ml/iteration_new.html', title='New Iteration', form=form, model=model, project=project) # permission denied abort(403)
def view_iteration(iteration_id): iteration = ModelIteration.query.get(iteration_id) project_id = iteration.model.project_id permission = ManageLabelsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) q = ModelLabel.query.filter( ModelLabel.iteration_id == iteration_id).join( Label, ModelLabel.label_id == Label.id).join(LabelType).filter( LabelType.parent_type == None).order_by(Label.name) labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False) delete_form = DeleteForm() previous_status = iteration.previous_status() if previous_status: previous_form = PreviousForm() previous_form.previous_button.label.text = '\u00AB ' + str( previous_status) else: previous_form = None next_status = iteration.next_status() if next_status: next_form = NextForm() next_form.next_button.label.text = str(next_status) + ' \u00BB' else: next_form = None finished = (iteration.status == StatusEnum.finished) return render_template('ml/iteration_view.html', title='Model Iteration Labels', labels=labels, iteration=iteration, finished=finished, delete_form=delete_form, previous_form=previous_form, next_form=next_form) # permission denied abort(403)
def list_labels(project_id=None): permission = ViewResultsPermission(project_id) if permission.can(): page = request.args.get('page', 1, type=int) filter_form = FilterForm(request.args, meta={'csrf': False}) fq = Label.query.join(LabelType).filter(LabelType.parent_id == None) q = LabeledClip.query.join(AudioFile).join(LabeledClip.label) view_restricted = ManageLabelsPermission(project_id) if not view_restricted.can(): q = q.filter((Label.restricted == False) | (Label.restricted == None)) if project_id: q = q.join(AudioFile.monitoring_station).filter( MonitoringStation.project_id == project_id) fq = fq.join(ProjectLabel, Label.id == ProjectLabel.label_id).filter( ProjectLabel.project_id == project_id) filter_form.select_label.query = fq if filter_form.validate(): if filter_form.select_label.data: q = q.filter(Label.id == filter_form.select_label.data.id) if filter_form.certain.data == '1': q = q.filter(LabeledClip.certain == True) if filter_form.certain.data == '0': q = q.filter(LabeledClip.certain == False) clips = q.order_by(AudioFile.timestamp).order_by( LabeledClip.offset).paginate(page, current_app.config['ITEMS_PER_PAGE'], False) return render_template('labels/label_list.html', title='Labels', clips=clips, project_id=project_id, filter_form=filter_form) # permission denied abort(403)