def get_packs(): if not is_admin(): return {}, 404 packs = get_all_criterion_packs()['packs'] return render_template('pack_list.html', packs=packs)
def update_criterion(criterion_name): if not is_admin(): return {}, 404 criterion_dict, msg = try_load_criterion_dict( request.form.get('parameters')) if msg: return {'message': msg}, 200 base_criterion_name = request.form.get('base_criterion', '') base_criterion = CRITERIONS.get(base_criterion_name) if not base_criterion: return {'message': f"No such base critetion '{base_criterion_name}'"}, 200 db_criterion = CriterionDBManager().get_criterion_by_name( criterion_dict['name']) if not db_criterion: db_criterion = Criterion(name=criterion_dict['name'], parameters={}, base_criterion=base_criterion_name) instance, msg = check_criterion_dict(base_criterion, criterion_dict) if msg: return {'message': msg}, 200 db_criterion.parameters = instance.dict.get('parameters') db_criterion.base_criterion = base_criterion_name db_criterion.save() logger.info(f"Updated criterion {db_criterion.name}") return { 'message': 'OK', 'name': db_criterion.name, 'time': int(db_criterion.last_update.timestamp()*1000) }, 200
def get_all_criterions(): if not is_admin(): return {}, 404 criterions = CriterionDBManager().get_all_criterions() return { 'criterions': criterions, 'message': 'OK' }
def delete_training_by_training_id(training_id: str) -> (dict, int): """ Endpoint to delete a training by its identifier. :param training_id: Training identifier. :return: {'message': 'OK'}, or an empty dictionary with 404 HTTP return code if access was denied. """ if not is_admin(): return {}, 404 TrainingsDBManager().delete_training(training_id) return {'message': 'OK'}, 200
def create_new_critetia_pack(): if not is_admin(): return {}, 404 data = { 'info': dumps({ 'name': '', 'criterions': [] }, indent=2, ensure_ascii=False) } return render_template('packs.html', data=data)
def create_new_critetion(): if not is_admin(): return {}, 404 data = { 'info': dumps({ 'name': '', 'parameters': {} }, indent=2, ensure_ascii=False) } return render_template('criterions.html', data=data, criterion_list=list(CRITERIONS.keys()))
def get_critetion(criterion_name): if not is_admin(): return {}, 404 criterion = CriterionDBManager().get_criterion_by_name(criterion_name) if not criterion: return {}, 404 data = criterion.to_dict() data['info'] = dumps( { 'name': data['name'], 'parameters': data['parameters'] }, indent=2, ensure_ascii=False) return render_template('criterions.html', data=data, criterion_list=list(CRITERIONS.keys()))
def get_critetia_pack(pack_name): if not is_admin(): return {}, 404 pack = CriterionPackDBManager().get_criterion_pack_by_name(pack_name) if not pack: return {}, 404 data = pack.to_dict() data['info'] = dumps( { 'name': data['name'], 'criterions': [[name, data['criterion_weights'].get(name, 0)] for name in data['criterions']] }, indent=2, ensure_ascii=False) return render_template('packs.html', data=data)
def append_slide_switch_timestamp(training_id: str) -> (dict, int): """ Endpoint to append a slide switch timestamp. :param training_id: Training identifier. :return: {'message': 'OK'}, or an empty dictionary with 404 HTTP return code if access was denied or training status is not NEW. """ if not check_access({'_id': ObjectId(training_id)}): return {}, 404 if not is_admin(): training_db = TrainingsDBManager().get_training(training_id) if training_db.status != TrainingStatus.IN_PROGRESS: return {}, 404 timestamp = request.args.get('timestamp', time.time(), float) TrainingsDBManager().append_timestamp(training_id, timestamp) logger.debug( 'Slide switch: training_id = {}, timestamp = {}, time.time() = {}.'. format(training_id, timestamp, time.time())) return {'message': 'OK'}, 200
def start_training_processing(training_id: str) -> (dict, int): """ Endpoint to start training processing of a training by its identifier. :param training_id: Training identifier. :return: {'message': 'OK'}, or an empty dictionary with 404 HTTP return code if access was denied or training status is not NEW. """ logger.info(f'start_training_processing. training_id = {training_id}') if not check_access({'_id': ObjectId(training_id)}): logger.info( f'start_training_processing. not access to training_id = {training_id}' ) return {}, 404 if not is_admin(): training_db = TrainingsDBManager().get_training(training_id) if training_db.status != TrainingStatus.SENT_FOR_PREPARATION: logger.info( f"start_training_processing. user not admin AND training_db.status != TrainingStatus.IN_PROGRESS (it's {training_db.status})" ) return {}, 404 TrainingManager().add_training(training_id) return {'message': 'OK'}, 200
def update_criteria_pack(pack_name): if not is_admin(): return {}, 404 pack_dict, msg = try_load_pack_dict(request.form.get('parameters')) if msg: return {'message': msg}, 200 feedback = request.form.get('feedback', '<h4>No feedback</h4>') # will be created if doesn't exist db_pack = CriterionPackDBManager().add_pack_from_names( pack_dict['name'], (critetion[0] for critetion in pack_dict['criterions']), weights=dict(pack_dict['criterions']), feedback=feedback) logger.info(f"Updated criteria pack {db_pack.name}") return { 'message': 'OK', 'name': db_pack.name, 'time': int(db_pack.last_update.timestamp() * 1000) }, 200
def add_presentation_record(training_id: str) -> (dict, int): """ Endpoint to add presentation record to a training by its identifier. :param training_id: Training identifier :return: {'message': 'OK'}, or an empty dictionary with 404 HTTP return code if access was denied, record duration is not convertible to float, or presentation record has already been added. TODO: check that presentation record is mp3 TODO: check that duration is consistent """ if not check_access({'_id': ObjectId(training_id)}): return {}, 404 if 'presentationRecord' not in request.files: return {'message': 'No presentation record file.'}, 404 presentation_record_file = request.files['presentationRecord'] if 'presentationRecordDuration' not in request.form: return {'message': 'No presentation record duration.'}, 404 presentation_record_duration = request.form.get( 'presentationRecordDuration', default=None, type=float) if presentation_record_duration is None: return {}, 404 if not is_admin(): training_db = TrainingsDBManager().get_training(training_id) if training_db.presentation_record_file_id is not None: return {}, 404 TrainingsDBManager().change_training_status_by_training_id( training_id, TrainingStatus.SENT_FOR_PREPARATION) presentation_record_file_id = DBManager().add_file( presentation_record_file) TrainingsDBManager().add_presentation_record( training_id, presentation_record_file_id, presentation_record_duration, ) return {'message': 'OK'}, 200
def get_criterions(): if not is_admin(): return {}, 404 criterions = get_all_criterions()['criterions'] return render_template('criterion_list.html', criterions=criterions)
def get_all_criterion_structures(): if not is_admin(): return {}, 404 return {name: dumps(criterion.structure(), indent=3) for name, criterion in CRITERIONS.items()}
def create_new_criterion(): if not is_admin(): return {}, 404 return update_criterion('')
def get_all_criterion_packs(): if not is_admin(): return {}, 404 packs = CriterionPackDBManager().get_all_criterion_packs() return {'packs': packs, 'message': 'OK'}