Esempio n. 1
0
def generate_list(user_id, min_price=None, max_price=None):
    """
    :use generate_list_for_user
    generate list of suggested items for user
    :param user_id:
    :param min_price:
    :param max_price:
    :return:
    """
    user_id = ObjectId(user_id)
    item_filter = []
    if min_price is not None:
        item_filter.append({'name': 'MinPrice', 'value': min_price})
    if max_price is not None:
        item_filter.append({'name': 'MaxPrice', 'value': max_price})

    client = DB.get_client()

    try:
        user = client.GRS.users.find_one({"_id": user_id})
        assert user is not None
        items = generate_list_for_user(user, item_filter)
        client.GRS.users.find_one_and_update({"_id": user_id}, {'$set': {'categories': user['categories'],
                                                                         'cur_page': 0,
                                                                         'items': items}})
    finally:
        client.close()
Esempio n. 2
0
def get_page(user_id, page_number):
    """
    return items from page
    :param user_id:
    :param page_number:
    :return: [] if wrong page, None if error, list of items if ok
    """
    # todo add items from RS
    assert type(page_number) == int
    if page_number <= 0:
        return []

    user_id = ObjectId(user_id)
    client = None
    try:
        client = DB.get_client()
        user = client.GRS.users.find_one({"_id": user_id})
        assert user is not None
        if (page_number - 1) * page_size >= len(user['items'].keys()):
            return []
        items = []
        # dict to list
        for key in sorted(user['items'].keys()):        # todo optimize
            user['items'][key].update({'itemId': key})
            items.append(user['items'][key])
        return items[page_size * (page_number - 1): page_size * page_number]
    finally:
        client.close()
Esempio n. 3
0
def get_number_of_pages(user_id):
    user_id = ObjectId(user_id)
    client = DB.get_client()
    try:
        user = client.GRS.users.find_one({"_id": user_id})
        assert user is not None
        return math.ceil(len(user['items'].keys()) / 100.0)
    finally:
        client.close()
Esempio n. 4
0
def add_user_to_db(user):
    """

    :param user:
    :return: user_id
    """
    client = DB.get_client()
    try:
        return client.GRS.users.insert_one(DBUser(user).__dict__).inserted_id
    finally:
        client.close()
Esempio n. 5
0
def remove_all_items_from_category(user_id, category_id):
    client = DB.get_client()
    try:
        user = client.GRS.users.find_one({"_id": user_id})
        items = user['items']
        keys = items.keys()
        for key in keys:  # remove all items form specified category
            if items[key]['categoryID'] == category_id:
                items.__delitem__(key)
        client.GRS.users.find_one_and_update({"_id": user_id}, {'$set': {'items': items}})
    finally:
        client.close()
Esempio n. 6
0
def rate(user_id, item_id, rating):
    """
    change rating of category of item
    :param user_id:
    :param item_id:
    :param rating:
    :return:
    """
    client = DB.get_client()
    try:
        user = client.GRS.users.find_one({"_id": user_id})
        assert user is not None
        category_id = user['items'][str(item_id)]['categoryID']
        category = user['categories'][category_id]
        category['rating'] = float(category['rating'] * category['votes'] + rating) / (category['votes'] + 1)
        category['votes'] += 1
        client.GRS.users.find_one_and_update({"_id": user_id},
                                             {'$set': {'categories': user['categories']}})  # todo optimize
    finally:
        client.close()
    # print category
    return category_id, category
Esempio n. 7
0
def get_categories_from_hobbies_and_categories_str(user):
    """
    search through all categories for thous, which similar to hobbies or categories
    and add them to user.categories
    :param user:
    :return:
    """
    simplify_hobbies_and_categories(user)  # stemmer and so on
    client = DB.get_client()  # open connection

    categories = client.GRS.categories.find({}, {
        "CategoryName": 1,
        "CategoryID": 1,
        "_id": 0
    })
    for category in categories:  # go through all categories
        already_added = False
        for category_str in user.categories_str_simpler:
            if category['CategoryName'].lower().find(category_str) >= 0:
                user.categories.update(
                    {str(category['CategoryID']): {
                         "rating": 1,
                         "votes": 0
                     }})
                already_added = True
                break
        if already_added:
            continue
        for hobby in user.hobbies_simpler:
            if category['CategoryName'].lower().find(hobby) >= 0:
                user.categories.update(
                    {str(category['CategoryID']): {
                         "rating": 1,
                         "votes": 0
                     }})
                break

    client.close()