def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.is_deleted or (addon.is_pending() and not addon.is_persona()): # Allow pending themes to be listed. raise http.Http404 if addon.is_disabled: return render(request, 'addons/impala/disabled.html', {'addon': addon}, status=404) # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.slug]))
def addon_detail(request, addon_id): """Add-ons details page dispatcher.""" addon = get_object_or_404(Addon.objects.valid(), id=addon_id) if settings.SANDBOX_PANIC and addon.status in amo.UNREVIEWED_STATUSES: raise http.Http404 # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.id]))
def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.is_deleted: raise http.Http404 if addon.is_disabled: return render(request, 'addons/impala/disabled.html', {'addon': addon}, status=404) if addon.is_webapp(): # Apps don't deserve AMO detail pages. raise http.Http404 # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect( reverse('addons.detail', args=[addon.slug]))
def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.is_deleted or (addon.is_pending() and not addon.is_persona()): # Allow pending themes to be listed. raise http.Http404 if addon.is_disabled: return render(request, 'addons/impala/disabled.html', {'addon': addon}, status=404) if addon.is_webapp(): # Apps don't deserve AMO detail pages. raise http.Http404 # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.slug]))
def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.is_disabled or (addon.is_premium() and not addon.can_be_purchased()): return jingo.render(request, "addons/impala/disabled.html", {"addon": addon}, status=404) """Add-ons details page dispatcher.""" # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse("addons.detail", args=[addon.slug]))
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect('addons.detail', addon.slug, permanent=True) # Popular collections this addon is part of. collections = Collection.objects.listed().filter( addons=addon, application=request.APP.id) ctx = { 'addon': addon, 'src': request.GET.get('src', 'dp-btn-primary'), 'version_src': request.GET.get('src', 'dp-btn-version'), 'tags': addon.tags.not_blacklisted(), 'grouped_ratings': GroupedRating.get(addon.id), 'review_form': ReviewForm(), 'reviews': Review.objects.valid().filter(addon=addon, is_latest=True), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], 'abuse_form': AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). ctx['author_addons'] = addon.authors_other_addons(app=request.APP)[:6] return render(request, 'addons/impala/details-more.html', ctx) else: return render(request, 'addons/impala/details.html', ctx)
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect('addons.detail', addon.slug, permanent=True) # Addon recommendations. recommended = Addon.objects.listed(request.APP).filter( recommended_for__addon=addon)[:6] ctx = { 'addon': addon, 'src': request.GET.get('src', 'dp-btn-primary'), 'version_src': request.GET.get('src', 'dp-btn-version'), 'tags': addon.tags.not_blacklisted(), 'recommendations': recommended, 'reviews': Review.objects.valid().filter(addon=addon, is_latest=True), 'get_replies': Review.get_replies, 'abuse_form': AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). ctx['author_addons'] = addon.authors_other_addons(app=request.APP)[:6] return render(request, 'addons/impala/details-more.html', ctx) else: if addon.is_webapp(): ctx['search_placeholder'] = 'apps' return render(request, 'addons/impala/details.html', ctx)
def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.disabled_by_user or addon.status == amo.STATUS_DISABLED: return jingo.render(request, 'addons/disabled.html', {'addon': addon}, status=404) # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.slug]))
def addon_detail(request, addon): """Add-ons details page dispatcher.""" if addon.disabled_by_user or addon.status == amo.STATUS_DISABLED: return jingo.render(request, 'addons/disabled.html', {'addon': addon}, status=404) # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect( reverse('addons.detail', args=[addon.slug]))
def redirect_view(request, url): """ Redirect all requests that come here to an API call with a view parameter. """ dest = "/api/%.1f/%s" % (api.CURRENT_VERSION, urllib.quote(url.encode("utf-8"))) dest = get_url_prefix().fix(dest) return HttpResponsePermanentRedirect(dest)
def locale_url(url): """Take a URL and give it the locale prefix.""" if settings.MARKETPLACE: return url prefixer = urlresolvers.get_url_prefix() script = prefixer.request.META['SCRIPT_NAME'] parts = [script, prefixer.locale, url.lstrip('/')] return '/'.join(parts)
def extension_detail(request, addon): """Extensions details page.""" # if current version is incompatible with this app, redirect comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.id])) # source tracking src = request.GET.get('src', 'addondetail') # get satisfaction only supports en-US lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang == 'en_US' and addon.get_satisfaction_company) # other add-ons from the same author(s) author_addons = order_by_translation(addon.authors_other_addons, 'name') # tags dev_tags, user_tags = addon.tags_partitioned_by_developer current_user_tags = [] if request.user.is_authenticated(): current_user_tags = user_tags.filter( addon_tags__user=request.amo_user) # addon recommendations recommended = Addon.objects.valid().only_translations().filter( recommended_for__addon=addon)[:5] # popular collections this addon is part of collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) data = { 'addon': addon, 'author_addons': author_addons, 'src': src, 'dev_tags': dev_tags, 'user_tags': user_tags, 'current_user_tags': current_user_tags, 'recommendations': recommended, 'review_form': ReviewForm(), 'reviews': Review.objects.latest().filter(addon=addon), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], } return jingo.render(request, 'addons/details.html', data)
def activate(self, locale): old_prefix = get_url_prefix() old_locale = translation.get_language() rf = test_utils.RequestFactory() set_url_prefix(Prefixer(rf.get('/%s/' % (locale, )))) translation.activate(locale) yield set_url_prefix(old_prefix) translation.activate(old_locale)
def activate(self, locale): old_prefix = get_url_prefix() old_locale = translation.get_language() rf = test_utils.RequestFactory() set_url_prefix(Prefixer(rf.get('/%s/' % (locale,)))) translation.activate(locale) yield set_url_prefix(old_prefix) translation.activate(old_locale)
def redirect_view(request, url): """ Redirect all requests that come here to an API call with a view parameter. """ dest = '/api/%.1f/%s' % (api.CURRENT_VERSION, urllib.quote(url.encode('utf-8'))) dest = get_url_prefix().fix(dest) return HttpResponsePermanentRedirect(dest)
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect('addons.detail', addon.slug, permanent=True) # get satisfaction only supports en-US. lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang == 'en_US' and addon.get_satisfaction_company) # Addon recommendations. recommended = Addon.objects.listed(request.APP).filter( recommended_for__addon=addon)[:6] # Popular collections this addon is part of. collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) ctx = { 'addon': addon, 'src': request.GET.get('src', 'dp-btn-primary'), 'version_src': request.GET.get('src', 'dp-btn-version'), 'tags': addon.tags.not_blacklisted(), 'grouped_ratings': GroupedRating.get(addon.id), 'recommendations': recommended, 'review_form': ReviewForm(), 'reviews': Review.objects.latest().filter(addon=addon), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], 'abuse_form': AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). if addon.is_webapp(): others = Webapp.objects.listed().filter(type=amo.ADDON_WEBAPP) else: others = (Addon.objects.listed(request.APP) .exclude(type=amo.ADDON_WEBAPP)) others = (others.exclude(id=addon.id).distinct() .filter(addonuser__listed=True, authors__in=addon.listed_authors)) ctx['author_addons'] = others[:6] return jingo.render(request, 'addons/impala/details-more.html', ctx) else: if addon.is_webapp(): ctx['search_placeholder'] = 'apps' return jingo.render(request, 'addons/impala/details.html', ctx)
def impala_extension_detail(request, addon): """Extensions details page.""" # if current version is incompatible with this app, redirect comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.slug])) # source tracking src = request.GET.get('src', 'addon-detail') # get satisfaction only supports en-US lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang == 'en_US' and addon.get_satisfaction_company) # other add-ons from the same author(s) author_addons = order_by_translation(addon.authors_other_addons, 'name')[:6] # tags tags = addon.tags.not_blacklisted() # addon recommendations recommended = MiniAddon.objects.valid().filter( recommended_for__addon=addon)[:5] # popular collections this addon is part of collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) data = { 'addon': addon, 'author_addons': author_addons, 'src': src, 'tags': tags, 'grouped_ratings': GroupedRating.get(addon.id), 'recommendations': recommended, 'review_form': ReviewForm(), 'reviews': Review.objects.latest().filter(addon=addon), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], } if settings.REPORT_ABUSE: data['abuse_form'] = AbuseForm(request=request) return jingo.render(request, 'addons/impala/details.html', data)
def impala_extension_detail(request, addon): """Extensions details page.""" # if current version is incompatible with this app, redirect comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return http.HttpResponsePermanentRedirect( reverse('addons.detail', args=[addon.slug])) # source tracking src = request.GET.get('src', 'addon-detail') # get satisfaction only supports en-US lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang == 'en_US' and addon.get_satisfaction_company) # other add-ons from the same author(s) author_addons = order_by_translation(addon.authors_other_addons, 'name')[:6] # tags tags = addon.tags.not_blacklisted() # addon recommendations recommended = MiniAddon.objects.valid().filter( recommended_for__addon=addon)[:5] # popular collections this addon is part of collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) data = { 'addon': addon, 'author_addons': author_addons, 'src': src, 'tags': tags, 'grouped_ratings': GroupedRating.get(addon.id), 'recommendations': recommended, 'review_form': ReviewForm(), 'reviews': Review.objects.latest().filter(addon=addon), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], } if settings.REPORT_ABUSE: data['abuse_form'] = AbuseForm(request=request) return jingo.render(request, 'addons/impala/details.html', data)
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect("addons.detail", addon.slug, permanent=True) # get satisfaction only supports en-US. lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = lang == "en_US" and addon.get_satisfaction_company # Addon recommendations. recommended = Addon.objects.listed(request.APP).filter(recommended_for__addon=addon)[:6] # Popular collections this addon is part of. collections = Collection.objects.listed().filter(addons=addon, application__id=request.APP.id) ctx = { "addon": addon, "src": request.GET.get("src", "dp-btn-primary"), "version_src": request.GET.get("src", "dp-btn-version"), "tags": addon.tags.not_blacklisted(), "grouped_ratings": GroupedRating.get(addon.id), "recommendations": recommended, "review_form": ReviewForm(), "reviews": Review.objects.latest().filter(addon=addon), "get_replies": Review.get_replies, "collections": collections.order_by("-subscribers")[:3], "abuse_form": AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). if addon.is_webapp(): others = Webapp.objects.listed().filter(type=amo.ADDON_WEBAPP) else: others = Addon.objects.listed(request.APP).exclude(type=amo.ADDON_WEBAPP) others = others.exclude(id=addon.id).distinct().filter(addonuser__listed=True, authors__in=addon.listed_authors) ctx["author_addons"] = others[:6] return jingo.render(request, "addons/impala/details-more.html", ctx) else: if addon.is_webapp(): ctx["search_cat"] = "apps" return jingo.render(request, "addons/impala/details.html", ctx)
def activate(self, locale=None, app=None): """Active an app or a locale.""" prefixer = old_prefix = get_url_prefix() old_app = old_prefix.app old_locale = translation.get_language() if locale: rf = test_utils.RequestFactory() prefixer = Prefixer(rf.get('/%s/' % (locale,))) translation.activate(locale) if app: prefixer.app = app set_url_prefix(prefixer) yield old_prefix.app = old_app set_url_prefix(old_prefix) translation.activate(old_locale)
def remora_url(url, lang=None, app=None, prefix=''): """ Builds a remora-style URL, independent from Zamboni's prefixer logic. If app and/or lang are None, the current Zamboni values will be used. To omit them from the URL, set them to ''. """ prefixer = get_url_prefix() if lang is None: lang = getattr(prefixer, 'locale', settings.LANGUAGE_CODE) if app is None: app = getattr(prefixer, 'app', settings.DEFAULT_APP) url_parts = [p for p in (prefix.strip('/'), lang, app, url.lstrip('/')) if p] return url_fix('/'+'/'.join(url_parts))
def activate(self, locale=None, app=None): """Active an app or a locale.""" prefixer = old_prefix = get_url_prefix() old_app = old_prefix.app old_locale = translation.get_language() if locale: rf = RequestFactory() prefixer = Prefixer(rf.get('/%s/' % (locale,))) tower.activate(locale) if app: prefixer.app = app set_url_prefix(prefixer) yield old_prefix.app = old_app set_url_prefix(old_prefix) tower.activate(old_locale)
def logout(request): user = request.user if not user.is_anonymous(): log.debug(u"User (%s) logged out" % user) auth.logout(request) if 'to' in request.GET: request = _clean_next_url(request) next = request.GET.get('to') if not next: next = settings.LOGOUT_REDIRECT_URL prefixer = get_url_prefix() if prefixer: next = prefixer.fix(next) response = http.HttpResponseRedirect(next) # Fire logged out signal. logged_out.send(None, request=request, response=response) return response
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect('addons.detail', addon.slug, permanent=True) # Addon recommendations. recommended = Addon.objects.listed(request.APP).filter( recommended_for__addon=addon)[:6] # Popular collections this addon is part of. collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) ctx = { 'addon': addon, 'src': request.GET.get('src', 'dp-btn-primary'), 'version_src': request.GET.get('src', 'dp-btn-version'), 'tags': addon.tags.not_blacklisted(), 'grouped_ratings': GroupedRating.get(addon.id), 'recommendations': recommended, 'review_form': ReviewForm(), 'reviews': Review.objects.valid().filter(addon=addon, is_latest=True), 'get_replies': Review.get_replies, 'collections': collections.order_by('-subscribers')[:3], 'abuse_form': AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). ctx['author_addons'] = addon.authors_other_addons(app=request.APP)[:6] return jingo.render(request, 'addons/impala/details-more.html', ctx) else: if addon.is_webapp(): ctx['search_placeholder'] = 'apps' return jingo.render(request, 'addons/impala/details.html', ctx)
def logout(request): # Not using get_profile() becuase user could be anonymous user = request.user if not user.is_anonymous(): log.debug(u"User (%s) logged out" % user) auth.logout(request) if "to" in request.GET: request = _clean_next_url(request) next = request.GET.get("to") if not next: next = settings.LOGOUT_REDIRECT_URL prefixer = get_url_prefix() if prefixer: next = prefixer.fix(next) response = http.HttpResponseRedirect(next) # Fire logged out signal so we can be decoupled from cake. logged_out.send(None, request=request, response=response) return response
def impala_addon_detail(request, addon): """Add-ons details page dispatcher.""" # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return impala_extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect( reverse('addons.i_detail', args=[addon.slug]))
def impala_addon_detail(request, addon): """Add-ons details page dispatcher.""" # addon needs to have a version and be valid for this app. if addon.type in request.APP.types: if addon.type == amo.ADDON_PERSONA: return persona_detail(request, addon) else: if not addon.current_version: raise http.Http404 return impala_extension_detail(request, addon) else: # Redirect to an app that supports this type. try: new_app = [a for a in amo.APP_USAGE if addon.type in a.types][0] except IndexError: raise http.Http404 else: prefixer = urlresolvers.get_url_prefix() prefixer.app = new_app.short return http.HttpResponsePermanentRedirect(reverse( 'addons.i_detail', args=[addon.slug]))
def extension_detail(request, addon): """Extensions details page.""" # If current version is incompatible with this app, redirect. comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return redirect("addons.detail", addon.slug, permanent=True) # Addon recommendations. recommended = Addon.objects.listed(request.APP).filter(recommended_for__addon=addon)[:6] # Popular collections this addon is part of. collections = Collection.objects.listed().filter(addons=addon, application__id=request.APP.id) ctx = { "addon": addon, "src": request.GET.get("src", "dp-btn-primary"), "version_src": request.GET.get("src", "dp-btn-version"), "tags": addon.tags.not_blacklisted(), "grouped_ratings": GroupedRating.get(addon.id), "recommendations": recommended, "review_form": ReviewForm(), "reviews": Review.objects.valid().filter(addon=addon, is_latest=True), "get_replies": Review.get_replies, "collections": collections.order_by("-subscribers")[:3], "abuse_form": AbuseForm(request=request), } # details.html just returns the top half of the page for speed. The bottom # does a lot more queries we don't want on the initial page load. if request.is_ajax(): # Other add-ons/apps from the same author(s). ctx["author_addons"] = addon.authors_other_addons(app=request.APP)[:6] return render(request, "addons/impala/details-more.html", ctx) else: return render(request, "addons/impala/details.html", ctx)
def addon_detail(request, addon_id): """Add-ons details page.""" addon = get_object_or_404(Addon.objects.valid(), id=addon_id) # if current version is incompatible with this app, redirect comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon_id])) addon.is_searchengine = (addon.type == amo.ADDON_SEARCH) # source tracking src = request.GET.get('src', 'addondetail') # get satisfaction only supports en-US lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang=='en_US' and addon.get_satisfaction_company) # other add-ons from the same author(s) author_addons = Addon.objects.valid().filter( addonuser__listed=True, authors__in=addon.listed_authors).distinct() # tags tags = addon.tags.not_blacklisted() dev_tags = tags.filter(addon_tags__user__in=addon.authors.all()) user_tags = tags.exclude(addon_tags__user__in=addon.authors.all()) # addon recommendations recommended = Addon.objects.valid().filter( recommended_for__addon=addon)[:5] # popular collections this addon is part of coll_show_count = 3 collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) other_coll_count = collections.count() - coll_show_count popular_coll = collections.order_by('-subscribers')[:coll_show_count] # this user's collections if request.user.is_authenticated(): profile = UserProfile.objects.get(user=request.user) user_collections = profile.collections.filter( collectionuser__role=amo.COLLECTION_ROLE_ADMIN) else: user_collections = [] data = { 'addon': addon, 'author_addons': author_addons, 'src': src, 'dev_tags': dev_tags, 'user_tags': user_tags, 'recommendations': recommended, 'collections': popular_coll, 'other_collection_count': other_coll_count, 'user_collections': user_collections } return jingo.render(request, 'addons/details.html', data)
def locale_url(url): """Take a URL and give it the locale prefix.""" prefixer = urlresolvers.get_url_prefix() script = prefixer.request.META["SCRIPT_NAME"] parts = [script, prefixer.locale, url.lstrip("/")] return "/".join(parts)
def extension_detail(request, addon): """Extensions details page.""" # if current version is incompatible with this app, redirect comp_apps = addon.compatible_apps if comp_apps and request.APP not in comp_apps: prefixer = urlresolvers.get_url_prefix() prefixer.app = comp_apps.keys()[0].short return http.HttpResponsePermanentRedirect(reverse( 'addons.detail', args=[addon.id])) # source tracking src = request.GET.get('src', 'addondetail') # get satisfaction only supports en-US lang = translation.to_locale(translation.get_language()) addon.has_satisfaction = (lang == 'en_US' and addon.get_satisfaction_company) # other add-ons from the same author(s) author_addons = (Addon.objects.valid().only_translations() .exclude(id=addon.id) .filter(addonuser__listed=True, authors__in=addon.listed_authors).distinct()) # tags (dev_tags, user_tags) = addon.tags_partitioned_by_developer current_user_tags = [] if request.user.is_authenticated(): current_user_tags = user_tags.filter( addon_tags__user=request.amo_user) # addon recommendations recommended = Addon.objects.valid().only_translations().filter( recommended_for__addon=addon)[:5] # popular collections this addon is part of coll_show_count = 3 collections = Collection.objects.listed().filter( addons=addon, application__id=request.APP.id) other_coll_count = max(0, collections.count() - coll_show_count) popular_coll = collections.order_by('-subscribers')[:coll_show_count] # this user's collections user_collections = _details_collections_dropdown(request, addon) data = { 'addon': addon, 'author_addons': author_addons, 'src': src, 'dev_tags': dev_tags, 'user_tags': user_tags, 'current_user_tags': current_user_tags, 'recommendations': recommended, 'collections': popular_coll, 'other_collection_count': other_coll_count, 'user_collections': user_collections, } return jingo.render(request, 'addons/details.html', data)