Exemplo n.º 1
0
def document_listing(request, product_slug, topic_slug, subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(
        Topic, slug=topic_slug, product=product, parent__isnull=True
    )
    template = "products/documents.html"

    doc_kw = {"locale": request.LANGUAGE_CODE, "products": [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(
            Topic, slug=subtopic_slug, product=product, parent=topic
        )
        doc_kw["topics"] = [subtopic]
    else:
        subtopic = None
        doc_kw["topics"] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    return render(
        request,
        template,
        {
            "product": product,
            "topic": topic,
            "subtopic": subtopic,
            "topics": topics_for(product=product, parent=None),
            "subtopics": topics_for(product=product, parent=topic),
            "documents": documents,
            "fallback_documents": fallback_documents,
            "search_params": {"product": product_slug},
        },
    )
Exemplo n.º 2
0
    def test_topics_for_products(self):
        """Verify topics_for() returns topics for passed products."""
        desktop_topics = topics_for(product=self.desktop)
        eq_(len(desktop_topics), 3)

        mobile_topics = topics_for(product=self.mobile)
        eq_(len(mobile_topics), 2)
Exemplo n.º 3
0
Arquivo: views.py Projeto: jdm/kitsune
def document_listing(request, template, product_slug, topic_slug, subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(Topic, slug=topic_slug, product=product, parent__isnull=True)

    doc_kw = {"locale": request.LANGUAGE_CODE, "products": [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(Topic, slug=subtopic_slug, product=product, parent=topic)
        doc_kw["topics"] = [subtopic]
    else:
        subtopic = None
        doc_kw["topics"] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    return render(
        request,
        template,
        {
            "product": product,
            "topic": topic,
            "subtopic": subtopic,
            "topics": topics_for(products=[product], parent=None),
            "subtopics": topics_for(products=[product], parent=topic),
            "documents": documents,
            "fallback_documents": fallback_documents,
            "search_params": {"product": product_slug},
        },
    )
Exemplo n.º 4
0
def document_listing(request, template, product_slug, topic_slug, subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(Topic, slug=topic_slug, product=product, parent__isnull=True)

    doc_kw = {"locale": request.LANGUAGE_CODE, "products": [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(Topic, slug=subtopic_slug, product=product, parent=topic)
        doc_kw["topics"] = [subtopic]
    else:
        subtopic = None
        doc_kw["topics"] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    user_agent = request.META.get("HTTP_USER_AGENT", "")
    browser = get_browser(user_agent)
    show_fx_download = product.slug == "thunderbird" and browser != "Firefox"

    return render(
        request,
        template,
        {
            "product": product,
            "topic": topic,
            "subtopic": subtopic,
            "topics": topics_for(product=product, parent=None),
            "subtopics": topics_for(product=product, parent=topic),
            "documents": documents,
            "fallback_documents": fallback_documents,
            "search_params": {"product": product_slug},
            "show_fx_download": show_fx_download,
        },
    )
Exemplo n.º 5
0
def document_listing(request, template, product_slug, topic_slug,
                     subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(Topic, slug=topic_slug, product=product,
                              parent__isnull=True)

    doc_kw = {'locale': request.LANGUAGE_CODE, 'products': [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(Topic, slug=subtopic_slug,
                                     product=product, parent=topic)
        doc_kw['topics'] = [subtopic]
    else:
        subtopic = None
        doc_kw['topics'] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    user_agent = request.META.get('HTTP_USER_AGENT', '')
    browser = get_browser(user_agent)
    show_fx_download = (product.slug == 'thunderbird' and browser != 'Firefox')

    return render(request, template, {
        'product': product,
        'topic': topic,
        'subtopic': subtopic,
        'topics': topics_for(product=product, parent=None),
        'subtopics': topics_for(product=product, parent=topic),
        'documents': documents,
        'fallback_documents': fallback_documents,
        'search_params': {'product': product_slug},
        'show_fx_download': show_fx_download})
Exemplo n.º 6
0
def document_listing(request, template, product_slug, topic_slug,
                     subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(Topic, slug=topic_slug, product=product,
                              parent__isnull=True)

    doc_kw = {'locale': request.LANGUAGE_CODE, 'products': [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(Topic, slug=subtopic_slug,
                                     product=product, parent=topic)
        doc_kw['topics'] = [subtopic]
    else:
        subtopic = None
        doc_kw['topics'] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    return render(request, template, {
        'product': product,
        'topic': topic,
        'subtopic': subtopic,
        'topics': topics_for(product=product, parent=None),
        'subtopics': topics_for(product=product, parent=topic),
        'documents': documents,
        'fallback_documents': fallback_documents,
        'search_params': {'product': product_slug}
    })
Exemplo n.º 7
0
    def test_topics_for_products(self):
        """Verify topics_for() returns topics for passed products."""
        desktop_topics = topics_for(product=self.desktop)
        eq_(len(desktop_topics), 3)

        mobile_topics = topics_for(product=self.mobile)
        eq_(len(mobile_topics), 2)
Exemplo n.º 8
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({"id": t.id, "title": t.title})
        return HttpResponse(json.dumps({"topics": topic_list}), mimetype="application/json")

    versions = product.versions.filter(default=True)
    if versions:
        latest_version = versions[0].min_version
    else:
        latest_version = 0

    return render(
        request,
        template,
        {
            "product": product,
            "products": Product.objects.filter(visible=True),
            "topics": topics_for(products=[product], parent=None),
            "search_params": {"product": slug},
            "latest_version": latest_version,
        },
    )
Exemplo n.º 9
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            content_type='application/json')

    if slug == 'firefox':
        latest_version = product_details.firefox_versions['LATEST_FIREFOX_VERSION']
    else:
        versions = product.versions.filter(default=True)
        if versions:
            latest_version = versions[0].min_version
        else:
            latest_version = 0

    # Don't show firefox download button at header at firefox product page
    hide_fx_download = product.slug == 'firefox'

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(product=product, parent=None),
        'search_params': {'product': slug},
        'latest_version': latest_version,
        'hide_fx_download': hide_fx_download
    })
Exemplo n.º 10
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            content_type='application/json')

    versions = product.versions.filter(default=True)
    if versions:
        latest_version = versions[0].min_version
    else:
        latest_version = 0

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(product=product, parent=None),
        'search_params': {'product': slug},
        'latest_version': latest_version
    })
Exemplo n.º 11
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            content_type='application/json')

    if slug == 'firefox':
        latest_version = product_details.json_data['firefox_versions']['LATEST_FIREFOX_VERSION']
    else:
        versions = product.versions.filter(default=True)
        if versions:
            latest_version = versions[0].min_version
        else:
            latest_version = 0

    user_agent = request.META.get('HTTP_USER_AGENT', '')
    browser = get_browser(user_agent)
    show_fx_download = (product.slug == 'thunderbird' and browser != 'Firefox')

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(product=product, parent=None),
        'search_params': {'product': slug},
        'latest_version': latest_version,
        'show_fx_download': show_fx_download
    })
Exemplo n.º 12
0
def document_listing(request,
                     template,
                     product_slug,
                     topic_slug,
                     subtopic_slug=None):
    """The document listing page for a product + topic."""
    product = get_object_or_404(Product, slug=product_slug)
    topic = get_object_or_404(Topic,
                              slug=topic_slug,
                              product=product,
                              parent__isnull=True)

    doc_kw = {'locale': request.LANGUAGE_CODE, 'products': [product]}

    if subtopic_slug is not None:
        subtopic = get_object_or_404(Topic,
                                     slug=subtopic_slug,
                                     product=product,
                                     parent=topic)
        doc_kw['topics'] = [subtopic]
    else:
        subtopic = None
        doc_kw['topics'] = [topic]

    documents, fallback_documents = documents_for(**doc_kw)

    user_agent = request.META.get('HTTP_USER_AGENT', '')
    browser = get_browser(user_agent)
    show_fx_download = (product.slug == 'thunderbird' and browser != 'Firefox')

    return render(
        request, template, {
            'product': product,
            'topic': topic,
            'subtopic': subtopic,
            'topics': topics_for(product=product, parent=None),
            'subtopics': topics_for(product=product, parent=topic),
            'documents': documents,
            'fallback_documents': fallback_documents,
            'search_params': {
                'product': product_slug
            },
            'show_fx_download': show_fx_download
        })
Exemplo n.º 13
0
def question_details(request,
                     question_id,
                     form=None,
                     watch_form=None,
                     answer_preview=None,
                     **extra_kwargs):
    """View the answers to a question."""
    ans_ = _answers_data(request, question_id, form, watch_form,
                         answer_preview)
    question = ans_["question"]

    if question.is_spam and not request.user.has_perm("flagit.can_moderate"):
        raise Http404("No question matches the given query.")

    # Try to parse troubleshooting data as JSON.
    troubleshooting_json = question.metadata.get("troubleshooting")
    question.metadata["troubleshooting_parsed"] = parse_troubleshooting(
        troubleshooting_json)

    if request.user.is_authenticated:
        ct = ContentType.objects.get_for_model(request.user)
        ans_["images"] = list(
            ImageAttachment.objects.filter(
                creator=request.user,
                content_type=ct).only("id", "creator_id", "file",
                                      "thumbnail").order_by("-id")[:IMG_LIMIT])

    extra_kwargs.update(ans_)

    products = Product.objects.filter(visible=True)
    topics = topics_for(product=question.product)

    related_documents = question.related_documents
    related_questions = question.related_questions
    question_images = question.get_images()

    extra_kwargs.update({
        "all_products": products,
        "all_topics": topics,
        "product": question.product,
        "topic": question.topic,
        "related_documents": related_documents,
        "related_questions": related_questions,
        "question_images": question_images,
    })

    # Add noindex to questions without a solution.
    if not question.solution_id:
        extra_kwargs.update(robots_noindex=True)

    if request.session.pop("aaq-final-step", False):
        extra_kwargs.update({"aaq_final_step": True})

    return render(request, "questions/question_details.html", extra_kwargs)
Exemplo n.º 14
0
def product_landing(request, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)
    user = request.user
    template = "products/product.html"

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({"id": t.id, "title": t.title})
        return HttpResponse(json.dumps({"topics": topic_list}),
                            content_type="application/json")

    if slug == "firefox":
        latest_version = product_details.firefox_versions[
            "LATEST_FIREFOX_VERSION"]
    else:
        versions = product.versions.filter(default=True)
        if versions:
            latest_version = versions[0].min_version
        else:
            latest_version = 0

    return render(
        request,
        template,
        {
            "product":
            product,
            "products":
            Product.objects.filter(visible=True),
            "topics":
            topics_for(product=product, parent=None),
            "search_params": {
                "product": slug
            },
            "latest_version":
            latest_version,
            "subscribed_products_ids":
            (user.profile.products.all().values_list("id", flat=True)
             if user.is_authenticated() else []),
            "featured":
            get_featured_articles(product),
        },
    )
Exemplo n.º 15
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            mimetype='application/json')

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(products=[product], parent=None),
        'search_params': {'product': slug}})
Exemplo n.º 16
0
def product_landing(request, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({"id": t.id, "title": t.title})
        return HttpResponse(json.dumps({"topics": topic_list}),
                            content_type="application/json")

    if slug == "firefox":
        latest_version = product_details.firefox_versions[
            "LATEST_FIREFOX_VERSION"]
    else:
        versions = product.versions.filter(default=True)
        if versions:
            latest_version = versions[0].min_version
        else:
            latest_version = 0

    return render(
        request,
        "products/product.html",
        {
            "product_key":
            _get_aaq_product_key(product.slug),
            "product":
            product,
            "products":
            Product.objects.filter(visible=True),
            "topics":
            topics_for(product=product, parent=None),
            "search_params": {
                "product": slug
            },
            "latest_version":
            latest_version,
            "featured":
            get_featured_articles(product, locale=request.LANGUAGE_CODE),
        },
    )
Exemplo n.º 17
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            mimetype='application/json')

    try:
        topic = Topic.objects.get(product=product, slug=HOT_TOPIC_SLUG)

        hot_docs, fallback_hot_docs = documents_for(
            locale=request.LANGUAGE_CODE,
            topics=[topic],
            products=[product])
    except Topic.DoesNotExist:
        # "hot" topic doesn't exist, move on.
        hot_docs = fallback_hot_docs = None

    hot_questions = []
    try:
        hot_tag = Tag.objects.get(slug=HOT_TOPIC_SLUG)
        if request.LANGUAGE_CODE in settings.AAQ_LANGUAGES:
            hot_questions = Question.objects.filter(
                locale=request.LANGUAGE_CODE,
                products=product,
                tags=hot_tag)
            hot_questions = hot_questions.order_by('-created')[:3]
    except Tag.DoesNotExist:
        pass

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(products=[product], parent=None),
        'hot_docs': hot_docs,
        'hot_questions': hot_questions,
        'fallback_hot_docs': fallback_hot_docs,
        'search_params': {'product': slug}})
Exemplo n.º 18
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            mimetype='application/json')

    try:
        topic = Topic.objects.get(product=product, slug=HOT_TOPIC_SLUG)

        hot_docs, fallback_hot_docs = documents_for(
            locale=request.LANGUAGE_CODE, topics=[topic], products=[product])
    except Topic.DoesNotExist:
        # "hot" topic doesn't exist, move on.
        hot_docs = fallback_hot_docs = None

    hot_questions = []
    try:
        hot_tag = Tag.objects.get(slug=HOT_TOPIC_SLUG)
        if request.LANGUAGE_CODE in settings.AAQ_LANGUAGES:
            hot_questions = Question.objects.filter(
                locale=request.LANGUAGE_CODE, products=product, tags=hot_tag)
            hot_questions = hot_questions.order_by('-created')[:3]
    except Tag.DoesNotExist:
        pass

    return render(
        request, template, {
            'product': product,
            'products': Product.objects.filter(visible=True),
            'topics': topics_for(products=[product], parent=None),
            'hot_docs': hot_docs,
            'hot_questions': hot_questions,
            'fallback_hot_docs': fallback_hot_docs,
            'search_params': {
                'product': slug
            }
        })
Exemplo n.º 19
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)
    user = request.user

    if request.is_ajax():
        # Return a list of topics/subtopics for the product
        topic_list = list()
        for t in Topic.objects.filter(product=product, visible=True):
            topic_list.append({'id': t.id, 'title': t.title})
        return HttpResponse(json.dumps({'topics': topic_list}),
                            content_type='application/json')

    if slug == 'firefox':
        latest_version = product_details.firefox_versions[
            'LATEST_FIREFOX_VERSION']
    else:
        versions = product.versions.filter(default=True)
        if versions:
            latest_version = versions[0].min_version
        else:
            latest_version = 0

    return render(
        request, template, {
            'product':
            product,
            'products':
            Product.objects.filter(visible=True),
            'topics':
            topics_for(product=product, parent=None),
            'search_params': {
                'product': slug
            },
            'latest_version':
            latest_version,
            'show_contact_form':
            user.profile.has_subscriptions
            if user.is_authenticated() else False
        })
Exemplo n.º 20
0
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    try:
        topic = Topic.objects.get(product=product, slug=HOT_TOPIC_SLUG)

        hot_docs, fallback_hot_docs = documents_for(
            locale=request.LANGUAGE_CODE,
            topics=[topic],
            products=[product])
    except Topic.DoesNotExist:
        # "hot" topic doesn't exist, move on.
        hot_docs = fallback_hot_docs = None

    hot_questions = []
    try:
        hot_tag = Tag.objects.get(slug=HOT_TOPIC_SLUG)
        if request.LANGUAGE_CODE in settings.AAQ_LANGUAGES:
            hot_questions = Question.objects.filter(
                locale=request.LANGUAGE_CODE,
                products=product,
                tags=hot_tag)
            hot_questions = hot_questions.order_by('-created')[:3]
    except Tag.DoesNotExist:
        pass

    return render(request, template, {
        'product': product,
        'products': Product.objects.filter(visible=True),
        'topics': topics_for(
            products=[product],
            parent=None),
        'hot_docs': hot_docs,
        'hot_questions': hot_questions,
        'fallback_hot_docs': fallback_hot_docs,
        'search_params': {'product': slug}})
Exemplo n.º 21
0
Arquivo: views.py Projeto: jdm/kitsune
def product_landing(request, template, slug):
    """The product landing page."""
    product = get_object_or_404(Product, slug=slug)

    try:
        topic = Topic.objects.get(product=product, slug=HOT_TOPIC_SLUG)

        hot_docs, fallback_hot_docs = documents_for(locale=request.LANGUAGE_CODE, topics=[topic], products=[product])
    except Topic.DoesNotExist:
        # "hot" topic doesn't exist, move on.
        hot_docs = fallback_hot_docs = None

    return render(
        request,
        template,
        {
            "product": product,
            "products": Product.objects.filter(visible=True),
            "topics": topics_for(products=[product], parent=None),
            "hot_docs": hot_docs,
            "fallback_hot_docs": fallback_hot_docs,
            "search_params": {"product": slug},
        },
    )
Exemplo n.º 22
0
def aaq(request, product_key=None, category_key=None, step=1):
    """Ask a new question."""

    template = "questions/new_question.html"

    # Check if any product forum has a locale in the user's current locale
    if (request.LANGUAGE_CODE not in QuestionLocale.objects.locales_list()
            and request.LANGUAGE_CODE != settings.WIKI_DEFAULT_LANGUAGE):

        locale, path = split_path(request.path)
        path = "/" + settings.WIKI_DEFAULT_LANGUAGE + "/" + path

        old_lang = settings.LANGUAGES_DICT[request.LANGUAGE_CODE.lower()]
        new_lang = settings.LANGUAGES_DICT[
            settings.WIKI_DEFAULT_LANGUAGE.lower()]
        msg = _(
            "The questions forum isn't available in {old_lang}, we "
            "have redirected you to the {new_lang} questions forum.").format(
                old_lang=old_lang, new_lang=new_lang)
        messages.add_message(request, messages.WARNING, msg)

        return HttpResponseRedirect(path)

    # Check if the user is using a mobile device,
    # render step 2 if they are
    product_key = product_key or request.GET.get("product")
    if product_key is None:

        change_product = False
        if request.GET.get("q") == "change_product":
            change_product = True

        is_mobile_device = get_user_agent(request).is_mobile

        if is_mobile_device and not change_product:
            user_agent = request.META.get("HTTP_USER_AGENT", "")
            product_key = get_mobile_product_from_ua(user_agent)
            if product_key:
                # redirect needed for InAAQMiddleware
                step_2 = reverse("questions.aaq_step2",
                                 kwargs={"product_key": product_key})
                return HttpResponseRedirect(step_2)

    # Return 404 if the product doesn't exist in config
    product_config = config.products.get(product_key)
    if product_key and not product_config:
        raise Http404

    # If the selected product doesn't exist in DB, render a 404
    if step > 1:
        try:
            product = Product.objects.get(slug=product_config["product"])
        except Product.DoesNotExist:
            raise Http404
        else:
            # Check if the selected product has a forum in the user's locale
            if not product.questions_locales.filter(
                    locale=request.LANGUAGE_CODE).count():
                locale, path = split_path(request.path)
                path = "/" + settings.WIKI_DEFAULT_LANGUAGE + "/" + path

                old_lang = settings.LANGUAGES_DICT[
                    request.LANGUAGE_CODE.lower()]
                new_lang = settings.LANGUAGES_DICT[
                    settings.WIKI_DEFAULT_LANGUAGE.lower()]
                msg = _(
                    "The questions forum isn't available for {product} in {old_lang}, we "
                    "have redirected you to the {new_lang} questions forum."
                ).format(product=product.title,
                         old_lang=old_lang,
                         new_lang=new_lang)
                messages.add_message(request, messages.WARNING, msg)

                return HttpResponseRedirect(path)

    context = {
        "products": config.products,
        "current_product": product_config,
        "current_step": step,
        "host": Site.objects.get_current().domain,
    }

    if step == 2:
        context["featured"] = get_featured_articles(
            product, locale=request.LANGUAGE_CODE)
        context["topics"] = topics_for(product, parent=None)
    elif step == 3:
        form = NewQuestionForm(
            product=product_config,
            data=request.POST or None,
            initial={"category": category_key},
        )
        context["form"] = form

        # NOJS: upload image
        if "upload_image" in request.POST:
            upload_imageattachment(request, request.user)

        if form.is_valid() and not is_ratelimited(request, "aaq-day", "5/d"):

            question = form.save(
                user=request.user,
                locale=request.LANGUAGE_CODE,
                product=product,
                product_config=product_config,
            )

            if form.cleaned_data.get("is_spam"):
                _add_to_moderation_queue(request, question)

            # Submitting the question counts as a vote
            question_vote(request, question.id)

            my_questions_url = reverse("users.questions",
                                       args=[request.user.username])
            messages.add_message(
                request,
                messages.SUCCESS,
                _("Done! Your question is now posted on the Mozilla community support forum. "
                  +
                  "You can see your post anytime by visiting the {a_open}My Questions"
                  + "{a_close} page in your profile.").format(
                      a_open="<a href='" + my_questions_url + "'>",
                      a_close="</a>"),
                extra_tags="safe",
            )

            request.session["aaq-final-step"] = True

            url = reverse("questions.details",
                          kwargs={"question_id": question.id})
            return HttpResponseRedirect(url)

        if getattr(request, "limited", False):
            raise PermissionDenied

        user_ct = ContentType.objects.get_for_model(request.user)
        context["images"] = ImageAttachment.objects.filter(
            creator=request.user,
            content_type=user_ct,
        ).order_by("-id")[:IMG_LIMIT]

    return render(request, template, context)