Exemple #1
0
def get_packs():
    if not is_admin():
        return {}, 404

    packs = get_all_criterion_packs()['packs']

    return render_template('pack_list.html', packs=packs)
Exemple #2
0
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
Exemple #3
0
def get_all_criterions():
    if not is_admin():
        return {}, 404
    
    criterions = CriterionDBManager().get_all_criterions()
    return {
        'criterions': criterions,
        'message': 'OK'
    }
Exemple #4
0
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
Exemple #5
0
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()))
Exemple #8
0
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)
Exemple #9
0
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
Exemple #10
0
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
Exemple #12
0
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
Exemple #13
0
def get_criterions():
    if not is_admin():
        return {}, 404
    criterions = get_all_criterions()['criterions']
    return render_template('criterion_list.html', criterions=criterions)
Exemple #14
0
def get_all_criterion_structures():
    if not is_admin():
        return {}, 404

    return {name: dumps(criterion.structure(), indent=3) for name, criterion in CRITERIONS.items()}
Exemple #15
0
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'}