예제 #1
0
def main(pool_name: str = _YESTERDAY,
         users_json_filters: str = '',
         limit: str = '20') -> None:
    """Create a pool of use cases and store them in MongoDB."""

    users_filters = json.loads(
        users_json_filters) if users_json_filters else _DEFAULT_USERS_FILTER
    user_iterator = _USER_DB.user.find(users_filters).limit(int(limit))
    for user_index, user_dict in enumerate(user_iterator):
        use_case_proto = privacy.user_to_use_case(user_dict, pool_name,
                                                  user_index)
        if not use_case_proto:
            continue
        use_case = json_format.MessageToDict(use_case_proto)
        use_case['_id'] = use_case.pop('useCaseId')
        try:
            _DB.use_case.insert_one(use_case)
        except errors.DuplicateKeyError:
            _DB.use_case.replace_one({'_id': use_case['_id']}, use_case)

    if _SLACK_CREATE_POOL_URL:
        pool_url = f'{_BASE_URL}/eval?poolName={parse.quote(pool_name)}'
        requests.post(
            _SLACK_CREATE_POOL_URL,
            json={
                'text':
                f'A new use cases pool is ready for evaluation: <{pool_url}|{pool_name}>',
            })
예제 #2
0
def main(pool_name=_YESTERDAY, users_json_filters=None, limit=20):
    """Create a pool of use cases and store them in MongoDB."""

    users_filters = json.loads(
        users_json_filters) if users_json_filters else _DEFAULT_USERS_FILTER
    user_iterator = _USER_DB.user.find(users_filters).limit(int(limit))
    for user_index, user_dict in enumerate(user_iterator):
        use_case_proto = privacy.user_to_use_case(user_dict, pool_name,
                                                  user_index)
        use_case = json_format.MessageToDict(use_case_proto)
        use_case['_id'] = use_case.pop('useCaseId')
        try:
            _DB.use_case.insert_one(use_case)
        except pymongo.errors.DuplicateKeyError:
            _DB.use_case.replace_one({'_id': use_case['_id']}, use_case)

    if _SLACK_CREATE_POOL_URL:
        requests.post(
            _SLACK_CREATE_POOL_URL,
            json={
                'text':
                'A new use cases pool is ready for evaluation: <{}|{}>'.format(
                    '{}/eval?poolName={}'.format(_BASE_URL,
                                                 parse.quote(pool_name)),
                    pool_name)
            })
예제 #3
0
def create_use_case(request: use_case_pb2.UseCaseCreateRequest, requester_email: str) \
        -> use_case_pb2.UseCase:
    """Create a use case from a user."""

    database = flask.current_app.config['EVAL_DATABASE']
    user_database = flask.current_app.config['USER_DATABASE']

    identifier = request.WhichOneof('identifier')
    if not identifier:
        flask.abort(400, "Il manque un identifiant pour créer le cas d'usage.")

    if request.email:
        _log_request(request.email, requester_email, database)
        query = {'hashedEmail': auth.hash_user_email(request.email)}
    elif request.ticket_id:
        query = {'supportTickets.ticketId': request.ticket_id}
    else:
        query = {'_id': objectid.ObjectId(request.user_id)}

    # Find user.
    user_dict = user_database.user.find_one(query)
    if not user_dict:
        flask.abort(
            404,
            f'Aucun utilisateur avec l\'identifiant "{getattr(request, identifier)}" '
            f"({identifier}) n\'a été trouvé.")

    # Find next free index in use case pool.
    last_use_case_in_pool = database.use_case.find(
        {
            'poolName': request.pool_name
        },
        {
            '_id': 0,
            'indexInPool': 1
        },
    ).sort('indexInPool', pymongo.DESCENDING).limit(1)
    next_index = next(
        (u.get('indexInPool', 0) for u in last_use_case_in_pool), -1) + 1

    # Convert user to use case.
    use_case_proto = privacy.user_to_use_case(user_dict, request.pool_name,
                                              next_index)
    if not use_case_proto:
        flask.abort(500, 'Impossible to read user data.')

    if not request.pool_name:
        return use_case_proto
    # Save use case.
    use_case = json_format.MessageToDict(use_case_proto)
    use_case['_id'] = use_case.pop('useCaseId')
    database.use_case.insert_one(use_case)

    return use_case_proto
예제 #4
0
def main(pool_name: str = _YESTERDAY,
         users_json_filters: str = '',
         limit: str = '20') -> None:
    """Create a pool of use cases and store them in MongoDB."""

    stats_db, user_db, eval_db = mongo.get_connections_from_env()

    user_counts = diagnostic.get_users_counts(stats_db)

    users_filters = json.loads(
        users_json_filters) if users_json_filters else _DEFAULT_USERS_FILTER
    user_iterator = user_db.user.find(users_filters).limit(int(limit))
    num_cases = 0
    for user_index, user_dict in enumerate(user_iterator):
        use_case_proto = privacy.user_to_use_case(user_dict, pool_name,
                                                  user_index)
        if not use_case_proto:
            continue
        if user_counts and user_counts.frequent_firstnames:
            use_case_proto.user_data.profile.name = _pick_random(
                user_counts.frequent_firstnames)
        use_case = json_format.MessageToDict(use_case_proto)
        use_case['_id'] = use_case.pop('useCaseId')
        try:
            eval_db.use_case.insert_one(use_case)
        except errors.DuplicateKeyError:
            eval_db.use_case.replace_one({'_id': use_case['_id']}, use_case)
        num_cases += 1

    if num_cases and _SLACK_CREATE_POOL_URL:
        pool_url = campaign.get_bob_link(f'/eval/{parse.quote(pool_name)}')
        requests.post(
            _SLACK_CREATE_POOL_URL,
            json={
                'text':
                f'A new use cases pool is ready for evaluation: <{pool_url}|{pool_name}>',
            })