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)
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')})
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
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))
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)
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
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")})
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')
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')
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')
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)
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)
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)
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'")
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)
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()
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)
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)))
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)
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
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/')
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(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')
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))
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)
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_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]))
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')
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')
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)
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)
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')
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)
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')
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]))
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)
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)