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
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
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 }))
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 })
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)
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)
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)
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)
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)
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 })
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)
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, }, )