def valid_issue_by_slug(request: Request) -> bool:
    """
    Query issue by slug from the path.

    :param request:
    :return:
    """
    if has_keywords_in_path(('slug', str))(request):
        db_issue: Issue = DBDiscussionSession.query(Issue).filter(
            Issue.slug == request.validated['slug']).one_or_none()

        if db_issue:
            if db_issue.is_disabled:
                add_error(request,
                          'Issue no longer available',
                          location='path',
                          status_code=410)
                return False
            else:
                request.validated['issue'] = db_issue
                return True

        add_error(request,
                  'Invalid slug \'{}\' for issue'.format(
                      request.validated['slug']),
                  location='path',
                  status_code=404)
    return False
def __valid_id_from_location(request, entity_name, location='path') -> int:
    """
    Find id in specified location.

    :param request:
    :param entity_name:
    :param location:
    :return:
    """
    if location == 'path':
        success = has_keywords_in_path((entity_name, int))(request)
        return success
    elif location == 'json_body':
        if entity_name in request.json_body:
            value = request.json_body.get(entity_name)
            try:
                request.validated[entity_name] = int(value)
                return True
            except ValueError:
                add_error(request, '\'{}\' is not int parsable!'.format(value))
                return False
        else:
            add_error(request,
                      '{} is missing in json_body'.format(entity_name))
            return False
    else:
        raise KeyError("location has to be one of: ('path', 'json_body')")
Exemple #3
0
def test_has_keywords_in_path():
    request = construct_dummy_request()
    fn = core.has_keywords_in_path(('foo', int))
    response = fn(request)
    assert type(response) == bool
    assert response is False

    request = construct_dummy_request(match_dict={'foo': 'bar'})
    fn = core.has_keywords_in_path(('foo', int))
    response = fn(request)
    assert type(response) == bool
    assert response is False

    request = construct_dummy_request(match_dict={'foo': 2})
    fn = core.has_keywords_in_path(('foo', int))
    response = fn(request)
    assert type(response) == bool
    assert response is True
def valid_position(request):
    """
    Check if given statement is a position and belongs to the queried issue.

    :param request: Request
    :return:
    """
    if not valid_issue_by_slug(request):
        return False

    if has_keywords_in_path(('position_id', int))(request):
        position_id = request.validated['position_id']
        db_position: Statement = DBDiscussionSession.query(Statement).get(
            position_id)
        if not db_position:
            add_error(request,
                      'Position with id {} not found'.format(position_id),
                      location='path')
            return False
        if db_position.is_disabled:
            add_error(request,
                      'Position is disabled',
                      location='path',
                      status_code=410)
            return False
        if not db_position.is_position:
            add_error(request,
                      'Queried statement is not a valid position',
                      location='path')
            return False

        db_statement2issues = DBDiscussionSession.query(
            StatementToIssue).filter(
                StatementToIssue.statement_uid == position_id,
                StatementToIssue.issue_uid ==
                request.validated['issue'].uid).first()
        if not db_statement2issues:
            add_error(request,
                      'Position does not belong to the queried issue',
                      location='path')
            return False
        request.validated['position']: Statement = db_position
        return True
    return False
def valid_reaction_arguments(request):
    if not has_keywords_in_path(('arg_id_user', int),
                                ('arg_id_sys', int))(request):
        return False
    if not valid_issue_by_slug(request):
        return False

    arg_id_user: int = request.validated['arg_id_user']
    arg_id_sys: int = request.validated['arg_id_sys']
    issue: Issue = request.validated['issue']

    db_arg_user: Argument = __validate_enabled_entity(request, issue, Argument,
                                                      arg_id_user)
    db_arg_sys: Argument = __validate_enabled_entity(request, issue, Argument,
                                                     arg_id_sys)

    if not db_arg_sys or not db_arg_user:
        return False

    request.validated['arg_user'] = db_arg_user
    request.validated['arg_sys'] = db_arg_sys
    return True
def valid_attitude(request):
    """
    Check if given statement is a position and belongs to the queried issue.

    :param request: Request
    :return:
    """
    attitudes = [
        attitude.value for attitude in Attitudes
        if attitude is not Attitudes.DONT_KNOW
    ]

    if has_keywords_in_path(('attitude', str))(request):
        attitude = request.validated['attitude']
        if attitude not in attitudes:
            add_error(
                request,
                'Your attitude is not correct. Received \'{}\', expected one of {}'
                .format(attitude, attitudes),
                location='path')
            return False
        request.validated['attitude'] = attitude_mapper[attitude]
        return True
    return False
Exemple #7
0
    history = history_handler.save_and_set_cookie(request, db_user, db_issue)

    prepared_discussion = discussion.finish(db_issue, db_user,
                                            request.validated['argument'],
                                            history)

    return {'bubbles': extract_items_and_bubbles(prepared_discussion)[0]}


# =============================================================================
# REFERENCES - Get references from database
# =============================================================================


@references.get()
@validate(has_keywords_in_path(('host', str), ('path', str),
                               location="params"))
def get_references(request: Request):
    """
    Query database to get stored references from site. Generate a list with text versions of references.

    :param request: request
    :return: References assigned to the queried URL
    """
    host = request.validated["host"]
    path = request.validated["path"]
    LOG.debug("Querying references for host: {}, path: {}".format(host, path))
    refs_db: List[StatementReference] = DBDiscussionSession.query(
        StatementReference).filter_by(host=host, path=path).all()
    return {"references": [DataReference(ref) for ref in refs_db]}

Exemple #8
0
                                          db_user)
    prepared_discussion['extras'] = dh.prepare_extras_dict_for_normal_page(
        request.registry, request.application_url, request.path, db_user)
    prepared_discussion['language'] = str(get_language_from_cookie(request))
    prepared_discussion['show_summary'] = len(
        prepared_discussion['summary']) != 0
    prepared_discussion['discussion'] = {'broke_limit': False}
    return prepared_discussion


@view_config(route_name='discussion_choose',
             renderer='../../templates/discussion/main.pt',
             permission='everybody')
@validate(check_authentication, valid_user_optional, valid_issue_by_slug,
          valid_premisegroup_in_path, valid_list_of_premisegroups_in_path,
          has_keywords_in_path(('is_argument', bool), ('is_supportive', bool)))
def choose(request):
    """
    View configuration for discussion step, where the user has to choose between given statements.

    :param request: request of the web server
    :return: dictionary
    """
    # '/discuss/{slug}/choose/{is_argument}/{supportive}/{id}*pgroup_ids'
    LOG.debug("Choose a statement. %s", request.matchdict)
    emit_participation(request)

    db_user: User = request.validated['user']
    db_issue = request.validated['issue']

    history = history_handler.save_and_set_cookie(request, db_user, db_issue)
Exemple #9
0
 def test_provided_string_expected_string_should_succeed(self):
     request = construct_dummy_request(matchdict={'foo': 2})
     fn = core.has_keywords_in_path(('foo', int))
     response = fn(request)
     self.assertIsInstance(response, bool)
     self.assertTrue(response)
Exemple #10
0
 def test_empty_dummy_request(self):
     request = construct_dummy_request(json_body={})
     fn = core.has_keywords_in_path(('foo', int))
     response = fn(request)
     self.assertIsInstance(response, bool)
     self.assertFalse(response)