예제 #1
0
def get_strings_for_duplicates_or_reasons(search_value: str, issue_uid: int,
                                          statement_uid: int) -> list:
    """
    Checks different textversion-strings for a match with given value

    :param search_value: string
    :param issue_uid: Issue.uid
    :param statement_uid: integer
    :return: dict()
    """
    issues_statements_uids = [
        el.statement_uid
        for el in DBDiscussionSession.query(StatementToIssue).filter_by(
            issue_uid=issue_uid).all()
    ]
    db_statements = get_enabled_statement_as_query().filter(
        Statement.uid.in_(issues_statements_uids)).all()
    return_array = []

    for stat in db_statements:
        if stat.uid is statement_uid:
            continue

        db_tv = DBDiscussionSession.query(TextVersion).filter_by(
            statement_uid=stat.uid).order_by(TextVersion.uid.asc()).first()
        if search_value.lower() in db_tv.content.lower(
        ):  # and db_tv.content.lower() != oem_value.lower():
            rd = __get_fuzzy_string_dict(current_text=search_value,
                                         return_text=db_tv.content,
                                         uid=db_tv.statement_uid)
            return_array.append(rd)

    return_array = __sort_array(return_array)

    return return_array[:RESULT_LENGTH]
예제 #2
0
def get_suggestions_for_positions(search_value: str, issue_uid: int,
                                  position: bool) -> list:
    """
    Checks different position-strings for a match with given value

    :param search_value: text to be searched for
    :param issue_uid: uid of the issue to be searched in
    :param position: position of the statement
    :return: suggestions for statements with a certain position matching the search_value
    """
    statement2issues_uid = [
        el.statement_uid
        for el in DBDiscussionSession.query(StatementToIssue).filter_by(
            issue_uid=issue_uid).all()
    ]
    db_statements = get_enabled_statement_as_query().filter(
        Statement.is_position == position,
        Statement.uid.in_(statement2issues_uid)).all()
    return_array = []
    for stat in db_statements:
        db_tv = DBDiscussionSession.query(TextVersion).filter_by(
            statement_uid=stat.uid).order_by(TextVersion.uid.asc()).first()
        if search_value.lower() in db_tv.content.lower():
            rd = __get_fuzzy_string_dict(current_text=search_value,
                                         return_text=db_tv.content,
                                         uid=db_tv.statement_uid)
            return_array.append(rd)

    return_array = __sort_array(return_array)

    return return_array[:RESULT_LENGTH]
예제 #3
0
def get_all_statements_with_value(search_value: str, issue_uid: int) -> list:
    """
    Returns all statements matching the given search_value

    :param issue_uid: uid of the issue to be searched in
    :param search_value: text to be searched for
    :return: statements matching the given search value in the given issue, uses levensthein.
    """
    issues_statements_uids = [
        el.statement_uid
        for el in DBDiscussionSession.query(StatementToIssue).filter_by(
            issue_uid=issue_uid).all()
    ]
    db_statements = get_enabled_statement_as_query().filter(
        Statement.uid.in_(issues_statements_uids)).all()
    return_array = []
    slug = DBDiscussionSession.query(Issue).get(issue_uid).slug
    _um = UrlManager(slug=slug)
    for stat in db_statements:
        db_tv = DBDiscussionSession.query(TextVersion).filter_by(
            statement_uid=stat.uid).order_by(TextVersion.uid.asc()).first()
        if search_value.lower() in db_tv.content.lower():
            rd = __get_fuzzy_string_dict(current_text=search_value,
                                         return_text=db_tv.content,
                                         uid=db_tv.statement_uid)
            rd['url'] = _um.get_url_for_statement_attitude(db_tv.statement_uid)
            return_array.append(rd)

    return_array = __sort_array(return_array)

    return return_array[:RESULT_LENGTH]
예제 #4
0
def get_number_of_authors(issue_uid: int) -> int:
    """
    Returns number of active users for the issue

    :param issue_uid: Issue Issue.uid
    :return: Integer
    """
    issues_statements_uids = [
        el.statement_uid
        for el in DBDiscussionSession.query(StatementToIssue).filter_by(
            issue_uid=issue_uid).all()
    ]
    active_statements_uids = [
        el.uid for el in get_enabled_statement_as_query().filter(
            Statement.uid.in_(issues_statements_uids)).all()
    ]

    active_users = [
        el.author_uid for el in DBDiscussionSession.query(TextVersion).filter(
            TextVersion.statement_uid.in_(active_statements_uids))
    ]

    return len(set(active_users))
예제 #5
0
def get_strings_for_search(search_value: str) -> dict:
    """
    Returns all statements which have a substring of the given value

    :param search_value: String
    :return: dict() with Statements.uid as key and 'text', 'distance' as well as 'arguments' as values
    """
    tmp_dict = OrderedDict()
    db_statements = get_enabled_statement_as_query().join(
        TextVersion, Statement.textversion_uid == TextVersion.uid).all()
    for stat in db_statements:
        if search_value.lower() in stat.textversions.content.lower():
            # get distance between input value and saved value
            rd = __get_fuzzy_string_dict(current_text=search_value,
                                         return_text=stat.textversions.content,
                                         uid=stat.uid)
            tmp_dict[str(stat.uid)] = rd

    tmp_dict = __sort_dict(tmp_dict)
    return_index = list(islice(tmp_dict, RESULT_LENGTH))
    return_dict = OrderedDict()
    for index in return_index:
        return_dict[index] = tmp_dict[index]
    return return_dict
예제 #6
0
def get_d3_data(db_issue: Issue, all_statements=None, all_arguments=None):
    """
    Given an issue, create an dictionary and return it

    :param db_issue: Current issue
    :param all_statements:
    :param all_arguments:
    :return: dictionary
    """
    a = [a.uid
         for a in all_statements] if all_statements is not None else 'all'
    b = [b.uid for b in all_arguments] if all_arguments is not None else 'all'
    LOG.debug("Return D3 data. Statements: %s, arguments: %s", a, b)
    edge_type = 'arrow'
    nodes_array = []
    edges_array = []
    extras_dict = {}

    LOG.debug("Titel: %s", db_issue.title)

    db_textversions: List[TextVersion] = DBDiscussionSession.query(
        TextVersion).all()
    if all_statements is None:
        issues_statements_uids = [
            el.statement_uid
            for el in DBDiscussionSession.query(StatementToIssue).filter_by(
                issue_uid=db_issue.uid).all()
        ]
        all_statements = get_enabled_statement_as_query().filter(
            Statement.uid.in_(issues_statements_uids)).all()

    if all_arguments is None:
        all_arguments = get_enabled_arguments_as_query().filter_by(
            issue_uid=db_issue.uid).all()

    # issue
    node_dict = __get_node_dict(uid='issue',
                                label=db_issue.info,
                                node_type='issue',
                                timestamp=db_issue.date.timestamp)

    nodes_array.append(node_dict)
    all_node_ids = ['issue']

    # for each statement a node will be added
    all_ids, nodes, edges, extras = __prepare_statements_for_d3_data(
        all_statements, db_textversions, edge_type)
    all_node_ids += all_ids
    nodes_array += nodes
    edges_array += edges
    extras_dict.update(extras)

    # for each argument edges will be added as well as the premises
    all_ids, nodes, edges, extras = __prepare_arguments_for_d3_data(
        all_arguments, edge_type)
    all_node_ids += all_ids
    nodes_array += nodes
    edges_array += edges
    extras_dict.update(extras)

    error = __sanity_check_of_d3_data(all_node_ids, edges_array)

    d3_dict = {
        'nodes': nodes_array,
        'edges': edges_array,
        'extras': extras_dict
    }
    return d3_dict, error
예제 #7
0
 def test_get_enabled_statement_as_query(self):
     query_len = get_enabled_statement_as_query().count()
     res_len = DBDiscussionSession.query(Statement).filter_by(is_disabled=False).count()
     self.assertEqual(res_len, query_len)