Ejemplo n.º 1
0
    def popular_sort(cls, domains):
        sorted_list = []
        MIN_REVIEWS = 1.0

        domains = [(domain,
                    Review.get_average_rating_by_app(domain.copied_from._id),
                    Review.get_num_ratings_by_app(domain.copied_from._id))
                   for domain in domains]
        domains = [(domain, avg or 0.0, num or 0)
                   for domain, avg, num in domains]

        total_average_sum = sum(avg for domain, avg, num in domains)
        total_average_count = len(domains)
        if not total_average_count:
            return []
        total_average = (total_average_sum / total_average_count)

        for domain, average_rating, num_ratings in domains:
            if num_ratings == 0:
                sorted_list.append((0.0, domain))
            else:
                weighted_rating = (
                    (num_ratings /
                     (num_ratings + MIN_REVIEWS)) * average_rating +
                    (MIN_REVIEWS /
                     (num_ratings + MIN_REVIEWS)) * total_average)
                sorted_list.append((weighted_rating, domain))

        sorted_list = [
            domain for weighted_rating, domain in sorted(
                sorted_list, key=lambda domain: domain[0], reverse=True)
        ]

        return sorted_list
Ejemplo n.º 2
0
    def popular_sort(cls, domains):
        sorted_list = []
        MIN_REVIEWS = 1.0

        domains = [
            (
                domain,
                Review.get_average_rating_by_app(domain.copied_from._id),
                Review.get_num_ratings_by_app(domain.copied_from._id),
            )
            for domain in domains
        ]
        domains = [(domain, avg or 0.0, num or 0) for domain, avg, num in domains]

        total_average_sum = sum(avg for domain, avg, num in domains)
        total_average_count = len(domains)
        if not total_average_count:
            return []
        total_average = total_average_sum / total_average_count

        for domain, average_rating, num_ratings in domains:
            if num_ratings == 0:
                sorted_list.append((0.0, domain))
            else:
                weighted_rating = (num_ratings / (num_ratings + MIN_REVIEWS)) * average_rating + (
                    MIN_REVIEWS / (num_ratings + MIN_REVIEWS)
                ) * total_average
                sorted_list.append((weighted_rating, domain))

        sorted_list = [
            domain for weighted_rating, domain in sorted(sorted_list, key=lambda domain: domain[0], reverse=True)
        ]

        return sorted_list
Ejemplo n.º 3
0
def appstore(request, template="appstore/appstore_base.html", sort_by=None):
    page = int(request.GET.get('page', 1))
    include_unapproved = (request.user.is_superuser and request.GET.get('unapproved', False))
    if not sort_by:
        results = Domain.published_snapshots(include_unapproved=include_unapproved, page=page, per_page=PER_PAGE)
        more_pages = page * PER_PAGE < results.total_rows and len(results) == PER_PAGE # hacky way to deal with approved vs unapproved
    else:
        total_results = Domain.published_snapshots(include_unapproved=include_unapproved)
        if sort_by == 'best':
            results = Domain.popular_sort(total_results, page)
            #more_pages = page * PER_PAGE < total_results and page <= 10
        elif sort_by == 'hits':
            results = Domain.hit_sort(total_results, page)
            #more_pages = page * PER_PAGE < len(total_results) and page <= 10
        more_pages = page * PER_PAGE < total_results.total_rows and len(results) == PER_PAGE # hacky way to deal with approved vs unapproved
    average_ratings = list()
    for result in results:
        average_ratings.append([result.name, Review.get_average_rating_by_app(result.original_doc)])

    return render_to_response(request, template, _appstore_context({
        'apps': results,
        'average_ratings': average_ratings,
        'page': page,
        'prev_page': (page-1),
        'next_page': (page+1),
        'more_pages': more_pages,
        'sort_by': sort_by,
        'include_unapproved': include_unapproved
    }))
Ejemplo n.º 4
0
def project_info(request, domain, template="appstore/project_info.html"):
    dom = Domain.get_by_name(domain)
    if not can_view_app(request, dom):
        raise Http404()

    if request.method == "POST" and dom.copied_from.name not in request.couch_user.get_domains():
        form = AddReviewForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['review_title']
            rating = int(request.POST.get('rating'))
            if rating < 1:
                rating = 1
            if rating > 5:
                rating = 5
            info = form.cleaned_data['review_info']
            date_published = datetime.now()
            user = request.user.username

            old_review = Review.get_by_version_and_user(domain, user)

            if len(old_review) > 0: # replace old review
                review = old_review[0]
                review.title = title
                review.rating = rating
                review.info = info
                review.date_published = date_published
            else:
                review = Review(title=title, rating=rating, user=user, info=info, date_published = date_published, domain=domain, project_id=dom.copied_from._id)
            review.save()
        else:
            form = AddReviewForm()
    else:
        form = AddReviewForm()

    copies = dom.copies_of_parent()

    reviews = Review.get_by_app(dom.copied_from._id)
    average_rating = Review.get_average_rating_by_app(dom.copied_from._id)
    num_ratings = Review.get_num_ratings_by_app(dom.copied_from._id)

    if average_rating:
        average_rating = round(average_rating, 1)

    images = set()
    audio = set()

    return render(request, template, {
        "project": dom,
        "applications": dom.full_applications(include_builds=False),
        "form": form,
        "copies": copies,
        "reviews": reviews,
        "average_rating": average_rating,
        "num_ratings": num_ratings,
        "images": images,
        "audio": audio,
        "url_base": reverse('appstore'),
        'display_import': True if getattr(request, "couch_user", "") and request.couch_user.get_domains() else False
    })
Ejemplo n.º 5
0
def appstore(request, template="appstore/appstore_base.html"):
    page_length = 10
    include_unapproved = True if request.GET.get('is_approved',
                                                 "") == "false" else False
    if include_unapproved and not request.user.is_superuser:
        raise Http404()
    params, _ = parse_args_for_es(request)
    page = params.pop('page', 1)
    page = int(page[0] if isinstance(page, list) else page)
    results = es_snapshot_query(params, SNAPSHOT_FACETS)
    hits = results.get('hits', {}).get('hits', [])
    hits = deduplicate(hits)
    d_results = [Domain.wrap(res['_source']) for res in hits]

    sort_by = request.GET.get('sort_by', None)
    if sort_by == 'best':
        d_results = Domain.popular_sort(d_results)
    elif sort_by == 'newest':
        pass
    else:
        d_results = Domain.hit_sort(d_results)

    persistent_params = {}
    if sort_by:
        persistent_params["sort_by"] = sort_by
    if include_unapproved:
        persistent_params["is_approved"] = "false"
    persistent_params = urlencode(
        persistent_params)  # json.dumps(persistent_params)

    average_ratings = list()
    for result in d_results:
        average_ratings.append([
            result.name,
            Review.get_average_rating_by_app(result.copied_from._id)
        ])

    more_pages = False if len(d_results) <= page * page_length else True

    facet_map = fill_mapping_with_facets(SNAPSHOT_MAPPING, results, params)
    vals = dict(
        apps=d_results[(page - 1) * page_length:page * page_length],
        page=page,
        prev_page=(page - 1),
        next_page=(page + 1),
        more_pages=more_pages,
        sort_by=sort_by,
        average_ratings=average_ratings,
        include_unapproved=include_unapproved,
        facet_map=facet_map,
        facets=results.get("facets", []),
        query_str=request.META['QUERY_STRING'],
        search_query=params.get('search', [""])[0],
        persistent_params=persistent_params,
    )
    return render(request, template, vals)
Ejemplo n.º 6
0
def appstore(request, template="appstore/appstore_base.html"):
    page_length = 10
    include_unapproved = True if request.GET.get('is_approved', "") == "false" else False
    if include_unapproved and not request.user.is_superuser:
        raise Http404()
    params, _ = parse_args_for_es(request)
    page = params.pop('page', 1)
    page = int(page[0] if isinstance(page, list) else page)
    results = es_snapshot_query(params, SNAPSHOT_FACETS)
    hits = results.get('hits', {}).get('hits', [])
    hits = deduplicate(hits)
    d_results = [Domain.wrap(res['_source']) for res in hits]

    sort_by = request.GET.get('sort_by', None)
    if sort_by == 'best':
        d_results = Domain.popular_sort(d_results)
    elif sort_by == 'newest':
        pass
    else:
        d_results = Domain.hit_sort(d_results)

    persistent_params = {}
    if sort_by:
        persistent_params["sort_by"] = sort_by
    if include_unapproved:
        persistent_params["is_approved"] = "false"
    persistent_params = urlencode(persistent_params) # json.dumps(persistent_params)

    average_ratings = list()
    for result in d_results:
        average_ratings.append([result.name, Review.get_average_rating_by_app(result.copied_from._id)])

    more_pages = False if len(d_results) <= page*page_length else True

    facet_map = fill_mapping_with_facets(SNAPSHOT_MAPPING, results, params)
    vals = dict(
        apps=d_results[(page-1)*page_length:page*page_length],
        page=page,
        prev_page=(page-1),
        next_page=(page+1),
        more_pages=more_pages,
        sort_by=sort_by,
        average_ratings=average_ratings,
        include_unapproved=include_unapproved,
        facet_map=facet_map,
        facets=results.get("facets", []),
        query_str=request.META['QUERY_STRING'],
        search_query=params.get('search', [""])[0],
        persistent_params=persistent_params,
    )
    return render(request, template, vals)
Ejemplo n.º 7
0
def appstore(request, template="appstore/appstore_base.html"):
    page_length = 10
    include_unapproved = True if request.GET.get('is_approved',
                                                 "") == "false" else False
    if include_unapproved and not request.user.is_superuser:
        raise Http404()
    params, _ = parse_args_for_es(request)
    params = dict([(SNAPSHOT_MAPPING.get(p, p), params[p]) for p in params])
    page = params.pop('page', 1)
    page = int(page[0] if isinstance(page, list) else page)
    results = es_snapshot_query(params, SNAPSHOT_FACETS)
    d_results = [
        Domain.wrap(res['_source'])
        for res in results.get('hits', {}).get('hits', [])
    ]

    sort_by = request.GET.get('sort_by', None)
    if sort_by == 'best':
        d_results = Domain.popular_sort(d_results)
    elif sort_by == 'newest':
        pass
    else:
        d_results = Domain.hit_sort(d_results)

    average_ratings = list()
    for result in d_results:
        average_ratings.append([
            result.name,
            Review.get_average_rating_by_app(result.copied_from._id)
        ])

    more_pages = False if len(d_results) <= page * page_length else True

    facets_sortables = generate_sortables_from_facets(
        results, params, inverse_dict(SNAPSHOT_MAPPING))
    vals = dict(apps=d_results[(page - 1) * page_length:page * page_length],
                page=page,
                prev_page=(page - 1),
                next_page=(page + 1),
                more_pages=more_pages,
                sort_by=sort_by,
                average_ratings=average_ratings,
                include_unapproved=include_unapproved,
                sortables=facets_sortables,
                query_str=request.META['QUERY_STRING'],
                search_query=params.get('search', [""])[0])
    return render(request, template, vals)
Ejemplo n.º 8
0
def appstore(request, template="appstore/appstore_base.html"):
    page_length = 10
    include_unapproved = True if request.GET.get('is_approved', "") == "false" else False
    if include_unapproved and not request.user.is_superuser:
        raise Http404()
    params, _ = parse_args_for_es(request)
    params = dict([(SNAPSHOT_MAPPING.get(p, p), params[p]) for p in params])
    page = params.pop('page', 1)
    page = int(page[0] if isinstance(page, list) else page)
    results = es_snapshot_query(params, SNAPSHOT_FACETS)
    d_results = [Domain.wrap(res['_source']) for res in results.get('hits', {}).get('hits', [])]

    sort_by = request.GET.get('sort_by', None)
    if sort_by == 'best':
        d_results = Domain.popular_sort(d_results)
    elif sort_by == 'newest':
        pass
    else:
        d_results = Domain.hit_sort(d_results)

    average_ratings = list()
    for result in d_results:
        average_ratings.append([result.name, Review.get_average_rating_by_app(result.copied_from._id)])

    more_pages = False if len(d_results) <= page*page_length else True

    facets_sortables = generate_sortables_from_facets(results, params, inverse_dict(SNAPSHOT_MAPPING))
    vals = dict(apps=d_results[(page-1)*page_length:page*page_length],
        page=page,
        prev_page=(page-1),
        next_page=(page+1),
        more_pages=more_pages,
        sort_by=sort_by,
        average_ratings=average_ratings,
        include_unapproved=include_unapproved,
        sortables=facets_sortables,
        query_str=request.META['QUERY_STRING'],
        search_query = params.get('search', [""])[0])
    return render(request, template, vals)
Ejemplo n.º 9
0
def filter_snapshots(request, filter_by, filter, template="appstore/appstore_base.html", sort_by=None):
    if filter_by not in ('category', 'license', 'region', 'author'): # 'organization',
        raise Http404("That page doesn't exist")

    page = int(request.GET.get('page', 1))
    filter = filter.replace('+', ' ')
    #query = '%s:"%s"' % (filter_by, filter)

    results = Domain.get_by_field(FILTERS[filter_by], filter)
    total_rows = len(results)

    if not sort_by:
        results = results[(page-1)*PER_PAGE : page*PER_PAGE]
    else:
        #results, total_rows = Domain.snapshot_search(query, per_page=None)
        if sort_by == 'best':
            results = Domain.popular_sort(results, page)
        elif sort_by == 'hits':
            results = Domain.hit_sort(results, page)

    more_pages = page * PER_PAGE < total_rows

    average_ratings = list()
    for result in results:
        average_ratings.append([result.name, Review.get_average_rating_by_app(result.original_doc)])

    vals = _appstore_context(dict(apps=results,
                                  filter_by=filter_by,
                                  filter=filter,
                                  filter_url=filter.replace(' ', '+'),
                                  page=page,
                                  prev_page=(page-1),
                                  next_page=(page+1),
                                  more_pages=more_pages,
                                  sort_by=sort_by,
                                  average_ratings=average_ratings))
    return render_to_response(request, template, vals)
Ejemplo n.º 10
0
def project_info(request, domain, template="appstore/project_info.html"):
    dom = Domain.get(domain)
    if not can_view_app(request, dom):
        raise Http404()

    if request.method == "POST" and dom.copied_from.name not in request.couch_user.get_domains(
    ):
        form = AddReviewForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['review_title']
            rating = int(request.POST.get('rating'))
            if rating < 1:
                rating = 1
            if rating > 5:
                rating = 5
            info = form.cleaned_data['review_info']
            date_published = datetime.now()
            user = request.user.username

            old_review = Review.get_by_version_and_user(domain, user)

            if len(old_review) > 0:  # replace old review
                review = old_review[0]
                review.title = title
                review.rating = rating
                review.info = info
                review.date_published = date_published
            else:
                review = Review(title=title,
                                rating=rating,
                                user=user,
                                info=info,
                                date_published=date_published,
                                domain=domain,
                                project_id=dom.copied_from._id)
            review.save()
        else:
            form = AddReviewForm()
    else:
        form = AddReviewForm()

    copies = dom.copies_of_parent()

    reviews = Review.get_by_app(dom.copied_from._id)
    average_rating = Review.get_average_rating_by_app(dom.copied_from._id)
    num_ratings = Review.get_num_ratings_by_app(dom.copied_from._id)

    if average_rating:
        average_rating = round(average_rating, 1)

    images = set()
    audio = set()

    return render(
        request, template, {
            "project":
            dom,
            "applications":
            dom.full_applications(include_builds=False),
            "form":
            form,
            "copies":
            copies,
            "reviews":
            reviews,
            "average_rating":
            average_rating,
            "num_ratings":
            num_ratings,
            "images":
            images,
            "audio":
            audio,
            "url_base":
            reverse('appstore'),
            'display_import':
            True if getattr(request, "couch_user", "")
            and request.couch_user.get_domains() else False
        })
Ejemplo n.º 11
0
def project_info(request, domain, template="appstore/project_info.html"):
    dom = Domain.get_by_name(domain)
    if not dom or not dom.is_snapshot or (not dom.is_approved and not request.couch_user.is_domain_admin(domain)):
        raise Http404()

    if request.method == "POST" and dom.original_doc not in request.couch_user.get_domains():
        versioned = True
        form = AddReviewForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['review_title']
            rating = int(request.POST.get('rating'))
            if rating < 1:
                rating = 1
            if rating > 5:
                rating = 5
            info = form.cleaned_data['review_info']
            date_published = datetime.now()
            user = request.user.username

            old_review = Review.get_by_version_and_user(domain, user)

            if len(old_review) > 0: # replace old review
                review = old_review[0]
                review.title = title
                review.rating = rating
                review.info = info
                review.date_published = date_published
            else:
                review = Review(title=title, rating=rating, user=user, info=info, date_published = date_published, domain=domain, original_doc=dom.original_doc)
            review.save()
        else:
            form = AddReviewForm()
    else:
        form = AddReviewForm()
        versioned = request.GET.get('current', False)

    if versioned:
        reviews = Review.get_by_version(domain)
        average_rating = Review.get_average_rating_by_version(domain)
        num_ratings = Review.get_num_ratings_by_version(domain)
    else:
        reviews = Review.get_by_app(dom.original_doc)
        average_rating = Review.get_average_rating_by_app(dom.original_doc)
        num_ratings = Review.get_num_ratings_by_app(dom.original_doc)

    if average_rating:
        average_rating = round(average_rating, 1)

    current_link = ''
    if not versioned:
        current_link = 'true'

    images = set()
    audio = set()
#    for app in dom.applications():
#        if app.doc_type == 'Application':
#            app = Application.get(app._id)
#            sorted_images, sorted_audio, has_error = utils.get_sorted_multimedia_refs(app)
#            images.update(i['url'] for i in app.get_template_map(sorted_images)[0] if i['url'])
#            audio.update(a['url'] for a in app.get_template_map(sorted_audio)[0] if a['url'])

    vals = _appstore_context(dict(
        project=dom,
        form=form,
        reviews=reviews,
        average_rating=average_rating,
        num_ratings=num_ratings,
        versioned=versioned,
        current_link=current_link,
        images=images,
        audio=audio,
    ))
    return render_to_response(request, template, vals)
Ejemplo n.º 12
0
def project_info(request, domain, template="appstore/project_info.html"):
    dom = Domain.get_by_name(domain)
    if not can_view_app(request, dom):
        raise Http404()

    if request.method == "POST" and dom.copied_from.name not in request.couch_user.get_domains():
        form = AddReviewForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data["review_title"]
            rating = int(request.POST.get("rating"))
            if rating < 1:
                rating = 1
            if rating > 5:
                rating = 5
            info = form.cleaned_data["review_info"]
            date_published = datetime.now()
            user = request.user.username

            old_review = Review.get_by_version_and_user(domain, user)

            if len(old_review) > 0:  # replace old review
                review = old_review[0]
                review.title = title
                review.rating = rating
                review.info = info
                review.date_published = date_published
            else:
                review = Review(
                    title=title,
                    rating=rating,
                    user=user,
                    info=info,
                    date_published=date_published,
                    domain=domain,
                    project_id=dom.copied_from._id,
                )
            review.save()
        else:
            form = AddReviewForm()
    else:
        form = AddReviewForm()

    copies = dom.copies_of_parent()

    reviews = Review.get_by_app(dom.copied_from._id)
    average_rating = Review.get_average_rating_by_app(dom.copied_from._id)
    num_ratings = Review.get_num_ratings_by_app(dom.copied_from._id)

    if average_rating:
        average_rating = round(average_rating, 1)

    images = set()
    audio = set()

    # get facets
    results = es_snapshot_query({}, SNAPSHOT_FACETS)
    facets_sortables = generate_sortables_from_facets(results, {}, inverse_dict(SNAPSHOT_MAPPING))

    pb_id = dom.cda.user_id
    published_by = CouchUser.get_by_user_id(pb_id) if pb_id else None

    return render(
        request,
        template,
        {
            "project": dom,
            "applications": dom.full_applications(include_builds=False),
            "form": form,
            "published_by": published_by,
            "copies": copies,
            "reviews": reviews,
            "average_rating": average_rating,
            "num_ratings": num_ratings,
            "images": images,
            "audio": audio,
            "sortables": facets_sortables,
            "url_base": reverse("appstore"),
            "display_import": True
            if getattr(request, "couch_user", "") and request.couch_user.get_domains()
            else False,
        },
    )