def get(self, request, user_external_id): """ Get the users owned items. It receives an extra set of GET parameters. The offset and the items. The ´´offset´´ represents the amount of items to pass before start sending results. The ´´items´´ represents the amount of items to show. :param request: The HTTP request. :param user_external_id: The user external id that are making the request. :return: A list of app external ids of the user owned (items that are in database with reference to this user and the dropped date set to null). """ offset = int(request.GET.get("offset", 0)) # Offset of items number_of_items = int(request.GET.get("items", 0)) # Number of items to present limit = (offset+number_of_items) or None user = User.get_user_by_external_id(user_external_id) try: items = [ { "external_id": Item.get_item_external_id_by_id(item_id), "is_dropped": is_dropped } for item_id, is_dropped in User.get_user_items(user.pk).items()[offset:limit] ] except KeyError: return self.format_response(self.NOT_FOUND_ERROR_MESSAGE, status=NOT_FOUND_ERROR) data = {"user": user_external_id, "items": items} return self.format_response(data)
def test_diversity_on_recommendation_25(self): """ [recommendation.api.GetRecommendation] Test diversity for size 25 recommendation (at least 2/3 of user genres) """ size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) less, more = (user_genres, recommendation_genres) if len(user_genres) < len(recommendation_genres) else \ (recommendation_genres, user_genres) measure = 0 for genre in less: if genre in more: measure += 1 assert measure > len(less)*2./3., \ "Not sufficient genres in recommendation" \ "(user: %d, recommendation: %d, similarity: %d)" % (len(user_genres), len(recommendation_genres), measure)
def get(self, request, user_external_id): """ Get the users owned items. It receives an extra set of GET parameters. The offset and the items. The ´´offset´´ represents the amount of items to pass before start sending results. The ´´items´´ represents the amount of items to show. :param request: The HTTP request. :param user_external_id: The user external id that are making the request. :return: A list of app external ids of the user owned (items that are in database with reference to this user and the dropped date set to null). """ offset = int(request.GET.get("offset", 0)) # Offset of items number_of_items = int(request.GET.get("items", 0)) # Number of items to present limit = (offset + number_of_items) or None user = User.get_user_by_external_id(user_external_id) try: items = [{ "external_id": Item.get_item_external_id_by_id(item_id), "is_dropped": is_dropped } for item_id, is_dropped in User.get_user_items(user.pk).items() [offset:limit]] except KeyError: return self.format_response(self.NOT_FOUND_ERROR_MESSAGE, status=NOT_FOUND_ERROR) data = {"user": user_external_id, "items": items} return self.format_response(data)
def test_user_genres_in_recommendation_size_25(self): """ [recommendation.api.GetRecommendation] At least 19 of the top genres in the size 25 recommendation """ get_cache("default").clear() LogEntry.objects.all().delete() size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = sorted(ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ).items(), key=lambda x: x[1], reverse=True) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) measure = [] for no, (genre, _) in enumerate(user_genres[:int(size)], start=1): if genre not in recommendation_genres: measure.append(no) assert len(measure) < 6, "Major genres failing by index: %s." \ "\nUser %s" \ "\nRecommendation %s" % ( measure, user_genres, [ItemGenre.genre_in([Item.get_item_by_external_id(item)]) for item in json.loads(response.content)["recommendations"]])