Exemplo n.º 1
0
 def test_feedback_index(self):
     """Test feedback index page for Betas."""
     r = self.client.get(reverse("feedback"), HTTP_USER_AGENT=(self.FX_UA % "20.0b2"), follow=True)
     eq_(r.status_code, 200)
     doc = pq(r.content)
     for link in ("feedback.happy", "feedback.sad"):
         eq_(doc('a[href$="%s"]' % reverse(link)).length, 1)
Exemplo n.º 2
0
def feedback(request, ua):
    """Page to receive feedback under happy/sad/idea categories"""

    if request.method == 'POST':
        typ = int(request.POST.get('type'))

        if typ == input.OPINION_PRAISE.id:
            form = PraiseForm(request.POST, auto_id='happy-%s')
        elif typ == input.OPINION_ISSUE.id:
            form = IssueForm(request.POST, auto_id='sad-%s')
        else:
            form = IdeaForm(request.POST, auto_id='idea-%s')

        if form.is_valid():
            save_opinion_from_form(request, typ, ua, form)

            url = reverse('feedback.thanks')
            return http.HttpResponseRedirect(url)
        else:
            forms = {'happy': (form if typ == input.OPINION_PRAISE.id else
                               PraiseForm(auto_id='happy-%s')),
                     'sad': (form if typ == input.OPINION_ISSUE.id else
                             IssueForm(auto_id='sad-%s')),
                     'idea': (form if typ == input.OPINION_IDEA.id else
                              IdeaForm(auto_id='idea-%s'))}
    else:
        forms = {'happy': PraiseForm(auto_id='happy-%s'),
                 'sad': IssueForm(auto_id='sad-%s'),
                 'idea': IdeaForm(auto_id='idea-%s')}

    template = 'feedback/%sindex.html' % (
        'mobile/' if request.mobile_site else '')
    return jingo.render(request, template,
                        {'forms': forms,
                         'post_url': reverse('feedback')})
Exemplo n.º 3
0
    def test_enforce_user_agent(self):
        """Make sure unknown user agents are forwarded to download page."""
        old_enforce_setting = settings.ENFORCE_USER_AGENT
        settings.ENFORCE_USER_AGENT = True

        # Let's detect the locale first
        self.client.get('/')

        # no UA: redirect
        r = self.client.get(reverse('feedback.sad'))
        self.assertEquals(r.status_code, 302)

        # old version: redirect
        r = self.client.get(reverse('feedback.sad'),
                            HTTP_USER_AGENT=self.FX_UA % '3.5')
        self.assertEquals(r.status_code, 302)
        self.assertTrue(r['Location'].endswith(reverse('feedback.need_beta')))

        # latest beta: no redirect
        r = self.client.get(
            reverse('feedback.sad'), HTTP_USER_AGENT=(self.FX_UA % (
                product_details.firefox_versions['LATEST_FIREFOX_DEVEL_VERSION'])))
        self.assertEquals(r.status_code, 200)

        # version newer than current: no redirect
        r = self.client.get(reverse('feedback.sad'),
                            HTTP_USER_AGENT=(self.FX_UA % '20.0'))
        self.assertEquals(r.status_code, 200)

        settings.ENFORCE_USER_AGENT = old_enforce_setting
Exemplo n.º 4
0
def search_url(context, defaults=None, extra=None, feed=False, **kwargs):
    """Build a search URL with default values unless specified otherwise."""
    if feed:
        search = reverse('search.feed')
    else:
        search = reverse('search')
    if not defaults:
        defaults = {}
    data = []

    # fallbacks other than None
    fallbacks = {'version': '--'}
    if not 'product' in defaults and not 'product' in kwargs:
        prod = context['request'].default_prod
        fallbacks['product'] = prod.short
        fallbacks['version'] = Version(input.LATEST_BETAS[prod]).simplified

    # get field data from keyword args or defaults
    for field in ReporterSearchForm.base_fields:
        val = kwargs.get(field, defaults.get(
            field, fallbacks.get(field, None)))
        if val:
            data.append((field, unicode(val).encode('utf-8')))

    # append extra fields
    if extra:
        data = dict(data)
        data.update(extra)

    return u'%s?%s' % (search, urlencode(data))
Exemplo n.º 5
0
def sites_url(context, form, url=None, **kwargs):
    """Return the current form values as URL parameters.

    Values are taken from the given form and can be overriden using kwargs.
    This is used to modify parts of a query without losing search context.
    The 'page' is always reset if not explicitly given.
    Parameters are only included if the values differ from the default.
    """
    parameters = form.cleaned_data.copy()
    # page is reset on every change of search
    for name in form.cleaned_data.keys():
        if name == 'page' or parameters[name] == FIELD_DEFS[name].default:
            del parameters[name]
    for name, value in kwargs.iteritems():
        parameters[name] = value

    if url or context.get('site'):
        # single site URL
        _baseurl = url or context['site'].url
        _parsed = utils.urlparse(_baseurl)
        parts = [reverse('single_site', args=[_parsed.scheme, _parsed.netloc])]
        if 'q' in parameters:
            del parameters['q']
    else:
        # regular sites search URL
        parts = [reverse("website_issues")]

    if len(parameters):
        parts.extend(["?", urlencode(parameters)])

    return ''.join(parts)
Exemplo n.º 6
0
    def test_enforce_user_agent(self):
        """Make sure unknown user agents are forwarded to download page."""
        old_enforce_setting = settings.ENFORCE_USER_AGENT
        settings.ENFORCE_USER_AGENT = True

        # Let's detect the locale first
        self.client.get('/')

        # no UA: redirect
        r = self.client.get(reverse('feedback.sad'))
        self.assertEquals(r.status_code, 302)

        # old version: redirect
        FX_UA = ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; '
                 'de; rv:1.9.2.3) Gecko/20100401 Firefox/%s')
        r = self.client.get(reverse('feedback.sad'),
                            HTTP_USER_AGENT=FX_UA % '3.5')
        self.assertEquals(r.status_code, 302)
        self.assertTrue(r['Location'].endswith(reverse('feedback.need_beta')))

        # latest beta: no redirect
        r = self.client.get(reverse('feedback.sad'), HTTP_USER_AGENT=(
            FX_UA % firefox_versions['LATEST_FIREFOX_DEVEL_VERSION']))
        self.assertEquals(r.status_code, 200)

        # version newer than current: no redirect
        r = self.client.get(reverse('feedback.sad'),
                            HTTP_USER_AGENT=(FX_UA % '20.0'))
        self.assertEquals(r.status_code, 200)

        settings.ENFORCE_USER_AGENT = old_enforce_setting
Exemplo n.º 7
0
def feedback(request, ua):
    """Page to receive feedback under happy/sad/idea categories"""

    if request.method == "POST":
        typ = int(request.POST.get("_type"))

        if typ == input.OPINION_PRAISE.id:
            form = PraiseForm(request.POST, auto_id="happy-%s")
        elif typ == input.OPINION_ISSUE.id:
            form = IssueForm(request.POST, auto_id="sad-%s")
        else:
            form = IdeaForm(request.POST, auto_id="idea-%s")

        if form.is_valid():
            request.session["previous_opinion"] = save_opinion_from_form(request, typ, ua, form)

            url = reverse("feedback.thanks")
            return http.HttpResponseRedirect(url)
        else:
            forms = {
                "happy": (form if typ == input.OPINION_PRAISE.id else PraiseForm(auto_id="happy-%s")),
                "sad": (form if typ == input.OPINION_ISSUE.id else IssueForm(auto_id="sad-%s")),
                "idea": (form if typ == input.OPINION_IDEA.id else IdeaForm(auto_id="idea-%s")),
            }
    else:
        forms = {
            "happy": PraiseForm(auto_id="happy-%s"),
            "sad": IssueForm(auto_id="sad-%s"),
            "idea": IdeaForm(auto_id="idea-%s"),
        }

    template = "feedback/%sindex.html" % ("mobile/" if request.mobile_site else "")
    return jingo.render(request, template, {"forms": forms, "post_url": reverse("feedback")})
Exemplo n.º 8
0
 def test_feedback_index(self):
     """Test feedback index page for Betas."""
     r = self.client.get(reverse('feedback', channel='beta'),
                         HTTP_USER_AGENT=(self.FX_UA % '20.0b2'),
                         follow=True)
     eq_(r.status_code, 200)
     doc = pq(r.content)
     for link in ('feedback.happy', 'feedback.sad'):
         eq_(doc('a[href$="%s"]' % reverse(link)).length, 1)
    def test_thanks(self):
        # test link to android market
        r = self.client.get(reverse('thanks'), SITE_ID=settings.MOBILE_SITE_ID)
        doc = pq(r.content)
        eq_(doc('#thanks-download a').attr('href'),
            'https://market.android.com/details?id=org.mozilla.firefox_beta')

        # test link to channels page
        r = self.client.get(reverse('thanks'))
        doc = pq(r.content)
        eq_(doc('#thanks_download a').attr('href'),
            'http://www.mozilla.org/firefox/channel')
Exemplo n.º 10
0
    def test_forward_mobile(self, mock):
        fake_mobile_domain = 'mymobiledomain.example.com'

        def side_effect(*args, **kwargs):
            class FakeSite(object):
                id = settings.MOBILE_SITE_ID
                domain = fake_mobile_domain
            return FakeSite()
        mock.side_effect = side_effect

        r = self.mclient.get(reverse('dashboard') + '?foo=bar')
        eq_(r.status_code, 302)
        eq_(r['Location'], 'http://' + fake_mobile_domain +
            reverse('dashboard') + '?foo=bar')
Exemplo n.º 11
0
    def test_thanks(self):
        # test link to android market
        r = self.client.get(reverse('thanks'), SITE_ID=settings.MOBILE_SITE_ID)
        doc = pq(r.content)
        eq_(
            doc('#thanks-download a').attr('href'),
            'https://market.android.com/details?id=org.mozilla.firefox_beta')

        # test link to channels page
        r = self.client.get(reverse('thanks'))
        doc = pq(r.content)
        eq_(
            doc('#thanks_download a').attr('href'),
            'http://www.mozilla.org/firefox/channel')
Exemplo n.º 12
0
    def test_mobile_device_detection(self, mock):
        """
        Requests to front page and submission pages should forward mobile
        users to mobile site.
        """
        fake_mobile_domain = 'mymobiledomain.example.com'

        def side_effect(*args, **kwargs):
            class FakeSite(object):
                id = settings.MOBILE_SITE_ID
                domain = fake_mobile_domain
            return FakeSite()
        mock.side_effect = side_effect

        # URLs that should allow Mobile detection
        urls = (
            reverse('dashboard', channel='beta'),
            reverse('feedback.happy'),
            reverse('feedback.sad'),
            reverse('feedback.idea'),
            reverse('feedback'),
        )

        # User Agent Patterns: (UA, forward: true/false?)
        ua_patterns = (
            # Fx
            ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; '
             'rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13', False),
            # MSIE
            ('Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)',
             False),
            # Fennec
            ('Mozilla/5.0 (X11; U; Linux armv6l; fr; rv:1.9.1b1pre) Gecko/'
             '20081005220218 Gecko/2008052201 Fennec/0.9pre', True),
            # iPod touch
            ('Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 '
             '(KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3',
             True),
        )
        for test_url in urls:
            for ua, forward_this in ua_patterns:
                r = self.client.get(test_url, HTTP_USER_AGENT=ua)
                if forward_this:
                    eq_(r.status_code, 301)
                    assert r['Location'].find(fake_mobile_domain) >= 0
                else:
                    assert (r.status_code == 200 or  # Page is served, or:
                            r.status_code / 100 == 3 and  # some redirect...
                            # ... but not to the mobile domain.
                            r['Location'].find(fake_mobile_domain) == -1)
Exemplo n.º 13
0
        def wrapped(request, *args, **kwargs):
            # Validate User-Agent request header.
            ua = request.META.get('HTTP_USER_AGENT', None)
            parsed = ua_parse(ua)

            if not parsed:  # Unknown UA.
                if request.method == 'GET':
                    return http.HttpResponseRedirect(reverse(
                        'feedback.download',
                        channel='beta' if beta else 'release'))
                else:
                    return http.HttpResponseBadRequest(
                        _('User-Agent request header must be set.'))

            if not settings.ENFORCE_USER_AGENT:
                return f(request, ua=ua, *args, **kwargs)

            this_ver = Version(parsed['version'])
            # Enforce beta releases.
            if beta:
                if this_ver.is_release:  # Forward release to release feedback.
                    return http.HttpResponseRedirect(
                        reverse('feedback', channel='release'))
                elif not this_ver.is_beta:  # Not a beta? Upgrade to beta.
                    return http.HttpResponseRedirect(
                            reverse('feedback.download', channel='beta'))

                # Check for outdated beta.
                ref_ver = Version(input.LATEST_BETAS[parsed['browser']])
                if this_ver < ref_ver:
                    return http.HttpResponseRedirect(
                            reverse('feedback.download', channel='beta'))

            # Enforce release versions.
            else:
                if this_ver.is_beta:  # Forward betas to beta feedback.
                    return http.HttpResponseRedirect(
                        reverse('feedback', channel='beta'))
                elif not this_ver.is_release:  # Not a release? Upgrade.
                    return http.HttpResponseRedirect(
                            reverse('feedback.download', channel='beta'))

                ref_ver = Version(input.LATEST_RELEASE[parsed['browser']])

                # Bug 634324: Until Firefox 4 is released, show "download beta"
                # message to 3.6 and lower release users.
                ver4 = Version('4.0')
                if (parsed['browser'] == input.FIREFOX and this_ver < ver4):
                    return http.HttpResponseRedirect(
                            reverse('feedback.download', channel='beta'))

                # Check for outdated release.
                if this_ver < ref_ver:
                    return http.HttpResponseRedirect(
                            reverse('feedback.download', channel='release'))

            # If we made it here, it's a valid version.
            return f(request, ua=ua, *args, **kwargs)
Exemplo n.º 14
0
    def post_feedback(self, data, ajax=False, follow=True):
        """POST to the release feedback page."""
        options = dict(HTTP_USER_AGENT=(FX_UA % '20.0'), follow=follow)
        if ajax:
            options['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

        return self.client.post(reverse('feedback'), data, **options)
Exemplo n.º 15
0
 def test_title(self):
     r = self.client.get(reverse('search.feed'), {
         'product': 'firefox',
         'q': 'lol'
     })
     doc = self._pq(r)
     eq_(doc('title').text(), "Firefox Input: 'lol'")
Exemplo n.º 16
0
    def post_feedback(self, data, ajax=False, follow=True):
        """POST to the release feedback page."""
        options = dict(HTTP_USER_AGENT=(FX_UA % '20.0'), follow=follow)
        if ajax:
            options['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

        return self.client.post(reverse('feedback'), data, **options)
Exemplo n.º 17
0
def single_site(request, protocol, url_):
    """Display the clusters for a single site only."""
    form = WebsiteIssuesSearchForm(request.GET)
    if not form.is_valid():
        raise http.Http404

    if protocol == 'about':
        full_url = '%s:%s' % (protocol, url_)
    else:
        full_url = '%s://%s' % (protocol, url_)
    sites, _ = _fetch_summaries(form, url=full_url)
    if sites:
        site = sites[0]
        clusters = site.all_clusters
    else:
        site = get_list_or_404(SiteSummary, url=full_url)[0]
        clusters = []

    # Fetch a pageful of clusters
    pager = Paginator(clusters, settings.SEARCH_PERPAGE)
    try:
        page = pager.page(form.cleaned_data['page'])
    except (EmptyPage, InvalidPage):
        page = pager.page(pager.num_pages)

    data = dict(_common_data(form))
    data['base_url'] = reverse('single_site', args=[protocol, url_])
    try:
        data['base_url'] += '?' + request.META['QUERY_STRING']
    except UnicodeDecodeError:
        pass
    data.update({"page": page, "site": site})
    return jingo.render(request, 'website_issues/sites.html', data)
Exemplo n.º 18
0
    def test_idea(self):
        """Submit idea with and without AJAX."""
        # Empty POST: Count errors
        for ajax in True, False:
            r = self.post_feedback({'type': OPINION_IDEA.id}, ajax=ajax)
            if not ajax:
                doc = pq(r.content)
                eq_(doc('article#idea form .errorlist').length, 1)
            else:
                eq_(r.status_code, 400)
                errors = json.loads(r.content)
                assert 'description' in errors

        # Submit actual form
        data = {
            'type': OPINION_IDEA.id,
            'description': 'This is an idea.',
        }

        for ajax in True, False:
            r = self.post_feedback(data, follow=False, ajax=ajax)
            if not ajax:
                eq_(r.status_code, 302)
                assert r['Location'].endswith(
                        reverse('feedback', channel='release') + '#thanks')
            else:
                eq_(r.status_code, 200)
                eq_(r['Content-Type'], 'application/json')

            # Check the content made it into the database.
            latest = Opinion.objects.no_cache().order_by('-id')[0]
            eq_(latest.description, data['description'])
            latest.delete()
Exemplo n.º 19
0
def give_feedback(request, ua, positive):
    """Feedback page (positive or negative)."""

    # Positive or negative feedback form?
    Formtype = positive and HappyForm or SadForm

    if request.method == 'POST':
        form = Formtype(request.POST)
        if form.is_valid():
            # Remove URL if checkbox disabled.
            if not form.cleaned_data.get('add_url', False):
                form.cleaned_data['url'] = ''

            # Save to the DB.
            new_opinion = Opinion(
                positive=positive, url=form.cleaned_data.get('url', ''),
                description=form.cleaned_data['description'],
                user_agent=ua)
            new_opinion.save()

            return http.HttpResponseRedirect(reverse('feedback.thanks'))

    else:
        # URL is fed in by the feedback extension.
        url = request.GET.get('url', '')
        form = Formtype(initial={'url': url, 'add_url': False})

    data = {'form': form, 'positive': positive}
    return jingo.render(request, 'feedback/feedback.html', data)
Exemplo n.º 20
0
def search_url(defaults=None, extra=None, **kwargs):
    """Build a search URL with default values unless specified otherwise."""
    search = reverse('search')
    if not defaults:
        defaults = {}
    data = []

    # fallbacks other than None
    fallbacks = {}
    if not 'products' in defaults and not 'products' in kwargs:
        fallbacks['product'] = FIREFOX.short

    # get field data from keyword args or defaults
    for field in ReporterSearchForm.base_fields:
        val = kwargs.get(field, defaults.get(
            field, fallbacks.get(field, None)))
        if val:
            data.append((field, unicode(val).encode('utf-8')))

    # append extra fields
    if extra:
        data = dict(data)
        data.update(extra)

    return jinja2.Markup(u'%s?%s' % (search, urlencode(data)))
Exemplo n.º 21
0
 def test_site_theme(self):
     """Check each site theme page."""
     clusters = Cluster.objects.all()
     for c in clusters:
         params = dict(theme_id=c.id)
         r = self.client.get(reverse('site_theme', kwargs=params))
         eq_(r.status_code, 200)
         assert_true(len(r.content) > 0)
Exemplo n.º 22
0
    def test_mobile(self):
        """
        Verify mobile redirects work using a mobile browser.

        Verify that accessing the root of the site with a mobile User-Agent
        causes a redirect (this is how we route mobile users to m.input).
        Makes sure redirects only happen with a desktop browser too.
        """
        # Make sure the mobile site is defined in the test DB
        mobile_site = Site.objects.create(pk=settings.MOBILE_SITE_ID,
                                          domain='m.input.mozillatest.com',
                                          name='m.input.mozillatest.com')

        r = self.fxclient.get(reverse('search'))
        assert r.status_code in (200, 500)  # Sphinx will be down...
        r = self.mclient.get(reverse('search'))
        assert r.status_code == 302
Exemplo n.º 23
0
 def test_site_theme(self):
     """Check each site theme page."""
     clusters = Cluster.objects.all()
     for c in clusters:
         params = dict(theme_id=c.id)
         r = self.client.get(reverse('site_theme', kwargs=params))
         eq_(r.status_code, 200)
         assert_true(len(r.content) > 0)
Exemplo n.º 24
0
 def test_mobile_sumo_url(self):
     """Test the sumo url in the mobile version."""
     r = self.client.get(reverse('feedback'),
                         HTTP_USER_AGENT=(self.FX_UA % '20.0b2'),
                         SITE_ID=settings.MOBILE_SITE_ID)
     doc = pq(r.content)
     sumo_url = doc('#sumo-url')
     eq_(sumo_url.attr('href'), 'http://support.mozilla.com/en-US/')
Exemplo n.º 25
0
        def autocomplete_check(site_id):
            r = self.client.get(reverse('feedback.sad'), HTTP_USER_AGENT=(
                self.FX_UA % '20.0b2'), SITE_ID=site_id, follow=True)
            doc = pq(r.content)
            form = doc('#feedbackform form')

            assert form
            eq_(form.attr('autocomplete'), 'off')
 def test_mobile_sumo_url(self):
     """Test the sumo url in the mobile version."""
     r = self.client.get(reverse('feedback'),
                         HTTP_USER_AGENT=(self.FX_UA % '20.0b2'),
                         SITE_ID=settings.MOBILE_SITE_ID)
     doc = pq(r.content)
     sumo_url = doc('#sumo-url')
     eq_(sumo_url.attr('href'), 'http://support.mozilla.com/en-US/')
Exemplo n.º 27
0
    def test_mobile(self):
        """
        Verify mobile redirects work using a mobile browser.
        
        Verify that accessing the root of the site with a mobile User-Agent
        causes a redirect (this is how we route mobile users to m.input).
        Makes sure redirects only happen with a desktop browser too.
        """
        # Make sure the mobile site is defined in the test DB
        mobile_site = Site.objects.create(pk=settings.MOBILE_SITE_ID,
                        domain='m.input.mozillatest.com',
                        name='m.input.mozillatest.com')

        r = self.fxclient.get(reverse('search'))
        assert r.status_code == 200
        r = self.mclient.get(reverse('search'))
        assert r.status_code == 302
 def with_site(site_id):
     r = self.client.get(reverse('feedback'), HTTP_USER_AGENT=(
         self.FX_UA % '20.0b2'), SITE_ID=site_id, follow=True)
     d = pq(r.content)
     forms = d('article form')
     assert forms
     for form in forms:
         eq_(pq(form).attr('autocomplete'), 'off')
Exemplo n.º 29
0
 def test_max_length(self):
     """
     Ensure description's max_length attribute is propagated correctly for
     JS to pick up.
     """
     for link in ("feedback.happy", "feedback.sad"):
         r = self.client.get(reverse(link), HTTP_USER_AGENT=(self.FX_UA % "20.0b2"), follow=True)
         doc = pq(r.content)
         eq_(doc("#count").attr("data-max"), str(MAX_FEEDBACK_LENGTH))
Exemplo n.º 30
0
 def test_feedback_loads(self):
     """No general errors on release feedback page."""
     r = self.client.get(reverse('feedback', channel='release'),
                         HTTP_USER_AGENT=(FX_UA % '20.0'),
                         follow=True)
     eq_(r.status_code, 200)
     doc = pq(r.content)
     # Find all three forms
     eq_(doc('article form').length, 3)
Exemplo n.º 31
0
        def autocomplete_check(site_id):
            r = self.client.get(
                reverse("feedback.sad"), HTTP_USER_AGENT=(self.FX_UA % "20.0b2"), SITE_ID=site_id, follow=True
            )
            doc = pq(r.content)
            form = doc("#feedbackform form")

            assert form
            eq_(form.attr("autocomplete"), "off")
Exemplo n.º 32
0
    def test_beta_pagination_link(self):
        r = self.client.get(reverse('dashboard', channel='beta'))
        doc = pq(r.content)

        pag_link = doc('.pager a.next')
        eq_(len(pag_link), 1)
        assert pag_link.attr('href').endswith(
            '?product=firefox&version=%s' % (
                input.LATEST_BETAS[input.FIREFOX]))
Exemplo n.º 33
0
 def test_search_without_date(self):
     """Ensure searching without date does not restrict by date."""
     data = {
         'product': 'firefox',
     }
     r = self.client.get(reverse('search'), data, follow=True)
     eq_(r.status_code, 200)
     assert not r.context['form'].cleaned_data.get('date_start')
     assert not r.context['form'].cleaned_data.get('date_end')
Exemplo n.º 34
0
    def test_forward_mobile(self, mock):
        fake_mobile_domain = 'mymobiledomain.example.com'

        populate(1)
        id = Opinion.objects.values_list('id', flat=True)[0]

        def side_effect(*args, **kwargs):
            class FakeSite(object):
                id = settings.MOBILE_SITE_ID
                domain = fake_mobile_domain
            return FakeSite()
        mock.side_effect = side_effect

        r = self.mclient.get(reverse('opinion.detail', args=[id]) +
                             '?foo=bar')
        eq_(r.status_code, 302)
        eq_(r['Location'], 'http://' + fake_mobile_domain +
            reverse('opinion.detail', args=[id]) + '?foo=bar')
Exemplo n.º 35
0
def give_feedback(request, ua, type):
    """Submit feedback page"""

    Formtype = PraiseForm
    if type == OPINION_PRAISE:
        Formtype = PraiseForm
    elif type == OPINION_ISSUE:
        Formtype = IssueForm
    elif type == OPINION_SUGGESTION:
        Formtype = SuggestionForm

    if request.method == 'POST':
        form = Formtype(request.POST)
        if form.is_valid():
            # Remove URL if checkbox disabled.
            if not form.cleaned_data.get('add_url', False):
                form.cleaned_data['url'] = ''

            locale = detect_language(request)

            # Save to the DB.
            new_opinion = Opinion(
                type=type,
                url=form.cleaned_data.get('url', ''),
                description=form.cleaned_data['description'],
                user_agent=ua, locale=locale,
                manufacturer=form.cleaned_data['manufacturer'],
                device=form.cleaned_data['device'])
            new_opinion.save()

            return http.HttpResponseRedirect(reverse('feedback.thanks'))

    else:
        # URL is fed in by the feedback extension.
        url = request.GET.get('url', '')
        form = Formtype(initial={'url': url, 'add_url': False, 'type': type})

    # Set the div id for css styling
    div_id = 'feedbackform'
    if type == OPINION_SUGGESTION:
        div_id = 'suggestionform'

    url_suggestion = request.GET.get('url', 'suggestion')
    data = {
        'form': form,
        'type': type,
        'div_id': div_id,
        'MAX_FEEDBACK_LENGTH': settings.MAX_FEEDBACK_LENGTH,
        'OPINION_PRAISE': OPINION_PRAISE,
        'OPINION_ISSUE': OPINION_ISSUE,
        'OPINION_SUGGESTION': OPINION_SUGGESTION,
        'url_suggestion': url_suggestion
    }
    template = ('feedback/mobile/feedback.html' if request.mobile_site else
                'feedback/feedback.html')
    return jingo.render(request, template, data)
Exemplo n.º 36
0
 def test_nonexistant_site(self):
     """Single site for nonexistent url gives 404."""
     for sentiment in ["happy", "sad", None]:
         params = dict(url_='this.is.nonexistent.com', protocol='http')
         view_url = reverse('single_site', kwargs=params)
         if sentiment is not None:
             view_url += '?sentiment=%s' % sentiment
         r = self.client.get(view_url)
         eq_(r.status_code, 404)
         assert_true(len(r.content) > 0)
Exemplo n.º 37
0
 def test_search_with_invalid_date(self):
     """Date validation should not error out."""
     data = {
         'product': 'firefox',
         'date_start': 'cheesecake',
         'date_end': '',
     }
     r = self.client.get(reverse('search'), data, follow=True)
     eq_(r.status_code, 200)
     assert not hasattr(r.context['form'], 'cleaned_data')
Exemplo n.º 38
0
 def test_nonexistant_site(self):
     """Single site for nonexistent url gives 404."""
     for sentiment in ["happy", "sad", None]:
         params = dict(url_='this.is.nonexistent.com', protocol='http')
         view_url = reverse('single_site', kwargs=params)
         if sentiment is not None:
             view_url += '?sentiment=%s' % sentiment
         r = self.client.get(view_url)
         eq_(r.status_code, 404)
         assert_true(len(r.content) > 0)
Exemplo n.º 39
0
 def test_single_site(self):
     """Check results for a given site: praise, issues and both."""
     for i in xrange(NUM_SITES):
         for sentiment in ["happy", "sad", None]:
             params = dict(url_='www%i.example.com' % i, protocol='http')
             view_url = reverse('single_site', kwargs=params)
             if sentiment is not None:
                 view_url += '?sentiment=%s' % sentiment
             r = self.client.get(view_url)
             eq_(r.status_code, 200)
             assert_true(len(r.content) > 0)
Exemplo n.º 40
0
    def test_forward_mobile(self, mock):
        fake_mobile_domain = 'mymobiledomain.example.com'

        populate(1)
        id = Opinion.objects.values_list('id', flat=True)[0]

        def side_effect(*args, **kwargs):
            class FakeSite(object):
                id = settings.MOBILE_SITE_ID
                domain = fake_mobile_domain

            return FakeSite()

        mock.side_effect = side_effect

        r = self.mclient.get(reverse('opinion.detail', args=[id]) + '?foo=bar')
        eq_(r.status_code, 302)
        eq_(
            r['Location'], 'http://' + fake_mobile_domain +
            reverse('opinion.detail', args=[id]) + '?foo=bar')
Exemplo n.º 41
0
    def test_beta_pagination_link(self):
        """
        Verify the "next" pagination link appears and directs the user to the
        next page of search results.
        """
        r = self.client.get(reverse('search'))
        doc = pq(r.content)

        pag_link = doc('.pager a.newer')
        eq_(len(pag_link), 1)
        assert pag_link.attr('href').endswith(
            '?product=firefox&version=%s&page=2' % (
                getattr(input.FIREFOX, 'default_version', None) or
                input.LATEST_BETAS[input.FIREFOX]))
Exemplo n.º 42
0
    def wrapped(request, *args, **kwargs):
        # Validate User-Agent request header.
        ua = request.META.get('HTTP_USER_AGENT', None)
        parsed = ua_parse(ua)

        if not parsed:  # Unknown UA.
            if request.method == 'GET':
                return http.HttpResponseRedirect(reverse('feedback.download'))
            else:
                return http.HttpResponseBadRequest(
                    _('User-Agent request header must be set.'))

        if not settings.ENFORCE_USER_AGENT:
            return f(request, ua=ua, *args, **kwargs)

        this_ver = Version(parsed['version'])
        ref_ver = Version(input.LATEST_RELEASE[parsed['browser']])
        # Check for outdated release.
        if this_ver < ref_ver:
            return http.HttpResponseRedirect(reverse('feedback.download'))

        # If we made it here, it's a valid version.
        return f(request, ua=ua, *args, **kwargs)
Exemplo n.º 43
0
def website_issues(request):
    form = WebsiteIssuesSearchForm(request.GET)
    sites = page = one_offs = None
    form.full_clean()
    sites, page = _fetch_summaries(form)
    # Grab one-off domains for sidebar.
    if not (form.cleaned_data['show_one_offs'] or
            form.cleaned_data['site']):
        one_offs, _ = _fetch_summaries(form, count=settings.TRENDS_COUNT,
                                       one_offs=True)
    data = dict(_common_data(form))
    data['base_url'] = reverse('website_issues')
    try:
        data['base_url'] += '?' + request.META['QUERY_STRING']
    except UnicodeDecodeError:
        pass
    data.update({"page": page, "sites": sites, "one_offs": one_offs})
    return jingo.render(request, 'website_issues/sites.html', data)