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()
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()
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()
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()
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()
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
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()