Ejemplo n.º 1
0
 def limit(self, limit_number):
     """
     Limit number Elements
     """
     current_pipe = pipes.LimitPipe(limit_number)
     self.pipeline.add_pipe(current_pipe)
     return self
Ejemplo n.º 2
0
    def test_pipeline_exclude_limit(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.ExcludePipe([1]),
             pipes.LimitPipe(5)])

        self.assertEqual(pipeline_test.to_list(), [2, 3, 4, 5, 6])
Ejemplo n.º 3
0
 def test_pipeline_refresh_as_pipes(self):
     pipeline_test = pipeline.Pipeline(
         recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
         [pipes.ExcludePipe([1]),
          pipes.LimitPipe(5)])
     result = pipeline_test.refresh_as_pipes()
     self.assertEqual(result, None)
Ejemplo n.º 4
0
def get_storefront_most_popular(request_profile,
                                pre_fetch=True,
                                ordering=None):
    """
    Get Most Popular Listings for storefront
    """
    username = request_profile.user.username
    # Get most popular listings via a weighted average
    most_popular_listings_raw = models.Listing.objects.for_user_organization_minus_security_markings(
        username).filter(approval_status=models.Listing.APPROVED,
                         is_enabled=True,
                         is_deleted=False).order_by('-avg_rate',
                                                    '-total_reviews')

    most_popular_listings = pipeline.Pipeline(
        recommend_utils.ListIterator(
            [listing for listing in most_popular_listings_raw]), [
                pipes.ListingPostSecurityMarkingCheckPipe(username),
                pipes.LimitPipe(36)
            ]).to_list()

    sorted_most_popular_listings = custom_sort_listings(
        most_popular_listings, ordering)

    return sorted_most_popular_listings
Ejemplo n.º 5
0
    def test_pipeline_limit(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.LimitPipe(5)])

        self.assertEqual(pipeline_test.to_list(), [1, 2, 3, 4, 5])

        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.LimitPipe(2)])

        self.assertEqual(pipeline_test.to_list(), [1, 2])

        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3]), [pipes.LimitPipe(5)])

        self.assertEqual(pipeline_test.to_list(), [1, 2, 3])
Ejemplo n.º 6
0
    def test_pipeline_remove(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.ExcludePipe([1]),
             pipes.LimitPipe(5)])

        self.assertRaises(recommend_utils.UnsupportedOperationException,
                          pipeline_test.remove)
Ejemplo n.º 7
0
    def test_pipeline_get_starts(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.ExcludePipe([1]),
             pipes.LimitPipe(5)])
        result = pipeline_test.get_starts()

        self.assertEqual(str(result), 'ListIterator(7)')
Ejemplo n.º 8
0
    def test_pipeline_count(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.ExcludePipe([1]),
             pipes.LimitPipe(5)])
        result = pipeline_test.count()
        self.assertEqual(result, 5)

        result = pipeline_test.count()
        self.assertEqual(result, 0)
Ejemplo n.º 9
0
    def test_pipeline_get_pipes(self):
        pipeline_test = pipeline.Pipeline(
            recommend_utils.ListIterator([1, 2, 3, 4, 5, 6, 7]),
            [pipes.ExcludePipe([1]),
             pipes.LimitPipe(5)])
        result = ', '.join([str(pipe) for pipe in pipeline_test.get_pipes()])

        self.assertEqual(
            str(result),
            'ListIterator(7), ExcludePipe(), LimitPipe(limit_number:5)')
Ejemplo n.º 10
0
    def list(self, request, listing_pk=None):
        queryset = self.filter_queryset(self.get_queryset(listing_pk))
        serializer = serializers.ListingSerializer(
            queryset, context={'request': request}, many=True)

        similar_listings = pipeline.Pipeline(
            recommend_utils.ListIterator(serializer.data), [
                pipes.ListingDictPostSecurityMarkingCheckPipe(
                    self.request.user.username),
                pipes.LimitPipe(10)
            ]).to_list()
        return Response(similar_listings)
Ejemplo n.º 11
0
def get_storefront_recent(request_profile, pre_fetch=True):
    """
    Get Recent Listings for storefront
    """
    username = request_profile.user.username
    # Get Recent Listings
    recent_listings_raw = models.Listing.objects.for_user_organization_minus_security_markings(
        username).order_by('-approved_date').filter(
        approval_status=models.Listing.APPROVED,
        is_enabled=True,
        is_deleted=False)

    recent_listings = pipeline.Pipeline(recommend_utils.ListIterator([listing for listing in recent_listings_raw]),
                                        [pipes.ListingPostSecurityMarkingCheckPipe(username),
                                         pipes.LimitPipe(24)]).to_list()
    return recent_listings
Ejemplo n.º 12
0
    def _get_recommended_listings(self):
        profile_username = self.profile_instance.user.username

        # Post security_marking check - lazy loading
        pipeline_list = [
            pipes.ListingPostSecurityMarkingCheckPipe(profile_username),
            pipes.LimitPipe(10)
        ]

        if self.randomize_recommended:
            pipeline_list.insert(0, pipes.JitterPipe())

        recommended_listings_iterator = recommend_utils.ListIterator(
            self.recommended_listings_raw)
        self.recommended_listings = pipeline.Pipeline(
            recommended_listings_iterator, pipeline_list).to_list()
        self.recommended_listings_ids = [
            listing.id for listing in self.recommended_listings
        ]
Ejemplo n.º 13
0
def get_storefront_most_popular(username, pre_fetch=True):
    """
    Get Most Popular Listings for storefront
    """
    # Get most popular listings via a weighted average
    most_popular_listings_raw = models.Listing.objects.for_user_organization_minus_security_markings(
        username).filter(approval_status=models.Listing.APPROVED,
                         is_enabled=True,
                         is_deleted=False).order_by('-avg_rate',
                                                    '-total_reviews')

    if pre_fetch:
        most_popular_listings_raw = listing_serializers.ListingSerializer.setup_eager_loading(
            most_popular_listings_raw)

    most_popular_listings = pipeline.Pipeline(
        recommend_utils.ListIterator(
            [listing for listing in most_popular_listings_raw]), [
                pipes.ListingPostSecurityMarkingCheckPipe(username),
                pipes.LimitPipe(36)
            ]).to_list()
    return most_popular_listings
Ejemplo n.º 14
0
def get_storefront_recommended(username, pre_fetch=True):
    """
    Get Recommended Listings for storefront
    """
    extra_data = {}

    profile = models.Profile.objects.get(user__username=username)

    if not profile.is_beta_user():
        return [], extra_data

    # Retrieve List of Recommended Apps for profile:
    listing_ids_list, recommended_entry_data = get_recommendation_listing_ids(
        profile)
    extra_data['recommended_entry_data'] = recommended_entry_data

    # Retrieve Profile Bookmarks and remove bookmarked from recommendation list
    bookmarked_apps_list = set([
        application_library_entry.listing.id for application_library_entry in
        models.ApplicationLibraryEntry.objects.for_user(username)
    ])

    listing_ids_list_temp = []

    for current_listing_id in listing_ids_list:
        if current_listing_id not in bookmarked_apps_list:
            listing_ids_list_temp.append(current_listing_id)

    listing_ids_list = listing_ids_list_temp

    # Send new recommendation list minus bookmarked apps to User Interface
    recommended_listings_queryset = models.Listing.objects.for_user_organization_minus_security_markings(
        username).filter(pk__in=listing_ids_list,
                         approval_status=models.Listing.APPROVED,
                         is_enabled=True,
                         is_deleted=False).all()

    if pre_fetch:
        recommended_listings_queryset = listing_serializers.ListingSerializer.setup_eager_loading(
            recommended_listings_queryset)

    # Fix Order of Recommendations
    id_recommended_object_mapper = {}
    for recommendation_entry in recommended_listings_queryset:
        id_recommended_object_mapper[
            recommendation_entry.id] = recommendation_entry

    # recommended_listings_raw = [id_recommended_object_mapper[listing_id] for listing_id in listing_ids_list]

    recommended_listings_raw = []

    for listing_id in listing_ids_list:
        if listing_id in id_recommended_object_mapper:
            recommended_listings_raw.append(
                id_recommended_object_mapper[listing_id])

    # Post security_marking check - lazy loading
    recommended_listings = pipeline.Pipeline(
        recommend_utils.ListIterator([
            recommendations_listing
            for recommendations_listing in recommended_listings_raw
        ]), [
            pipes.JitterPipe(),
            pipes.ListingPostSecurityMarkingCheckPipe(username),
            pipes.LimitPipe(10)
        ]).to_list()

    return recommended_listings, extra_data
Ejemplo n.º 15
0
def get_storefront_new(username, request):
    """
    Returns data for /storefront api invocation including:
        * recommended listings (max=10)
        * featured listings (max=12)
        * recent (new) listings (max=24)
        * most popular listings (max=36)

    Args:
        username

    Returns:
        {
            'recommended': [Listing],
            'featured': [Listing],
            'recent': [Listing],
            'most_popular': [Listing]
        }
    """
    extra_data = {}
    profile = models.Profile.objects.get(user__username=username)

    if profile.highest_role() == 'APPS_MALL_STEWARD':
        exclude_orgs = []
    elif profile.highest_role() == 'ORG_STEWARD':
        user_orgs = profile.stewarded_organizations.all()
        user_orgs = [i.title for i in user_orgs]
        exclude_orgs = [
            agency.title
            for agency in models.Agency.objects.exclude(title__in=user_orgs)
        ]
    else:
        user_orgs = profile.organizations.all()
        user_orgs = [i.title for i in user_orgs]
        exclude_orgs = [
            agency.title
            for agency in models.Agency.objects.exclude(title__in=user_orgs)
        ]

    current_listings = get_user_listings(username, request, exclude_orgs)

    # Get Recommended Listings for owner
    if profile.is_beta_user():
        recommendation_listing_ids, recommended_entry_data = get_recommendation_listing_ids(
            profile)
        listing_ids_list = set(recommendation_listing_ids)

        recommended_listings_raw = []
        for current_listing in current_listings:
            if current_listing['id'] in listing_ids_list:
                recommended_listings_raw.append(current_listing)

        recommended_listings = pipeline.Pipeline(
            recommend_utils.ListIterator(recommended_listings_raw), [
                pipes.JitterPipe(),
                pipes.ListingDictPostSecurityMarkingCheckPipe(username),
                pipes.LimitPipe(10)
            ]).to_list()
    else:
        recommended_listings = []

    # Get Featured Listings
    featured_listings = pipeline.Pipeline(
        recommend_utils.ListIterator(current_listings), [
            pipes.ListingDictPostSecurityMarkingCheckPipe(username,
                                                          featured=True),
            pipes.LimitPipe(12)
        ]).to_list()
    # Get Recent Listings
    recent_listings = pipeline.Pipeline(
        recommend_utils.ListIterator(current_listings), [
            pipes.ListingDictPostSecurityMarkingCheckPipe(username),
            pipes.LimitPipe(24)
        ]).to_list()

    most_popular_listings = pipeline.Pipeline(
        recommend_utils.ListIterator(
            sorted(current_listings,
                   key=lambda k: (k['avg_rate'], ['total_reviews']),
                   reverse=True)), [
                       pipes.ListingDictPostSecurityMarkingCheckPipe(username),
                       pipes.LimitPipe(36)
                   ]).to_list()
    # TODO 2PI filtering
    data = {
        'recommended': recommended_listings,
        'featured': featured_listings,
        'recent': recent_listings,
        'most_popular': most_popular_listings
    }

    return data, extra_data