def active(http_request): """ Get a list of currently active browsers. Return value ~~~~~~~~~~~~ * active list (browser version identifiers) Each identifier consists of 4 parts joined with underscores: * platform string (e.g. linux / windows / mac-os) * browser string (e.g. firefox / msie / opera / safari) * major int (major version, e.g. 1) * minor int (minor version, e.g. 5) """ factories = Factory.objects.filter(last_poll__gte=last_poll_timeout()) preload_foreign_keys(factories, operating_system__platform=True) browsers = Browser.objects.filter(factory__in=factories, active=True) preload_foreign_keys(browsers, factory=factories) results = set() for browser in browsers: platform_name = browser.factory.operating_system.platform.name browser_name = browser.browser_group.name major = str(browser.major) minor = str(browser.minor) name = '_'.join((platform_name, browser_name, major, minor)) name = name.lower().replace(' ', '-') results.add(name) results = list(results) results.sort() return results
def overview(http_request): """ List all screenshot factories. """ factory_table_header = Factory.table_header() factory_list = Factory.objects.select_related().filter( last_poll__gt=last_poll_timeout()).order_by('-uploads_per_day') if not len(factory_list): return error_page(http_request, _("out of service"), _("No active screenshot factories."), _("Please try again later.")) return render_to_response('factories/overview.html', locals(), context_instance=RequestContext(http_request))
def matching_factories(self): """ Get active factories that are compatible with this request group. """ factories = Factory.objects.filter(last_poll__gte=last_poll_timeout()) result = [] for factory in factories: if self.width and self.height: if not factory.supports_screen_size(self.width, self.height): continue elif self.width: if not factory.supports_screen_width(self.width): continue elif self.height: if not factory.supports_screen_height(self.height): continue if self.bits_per_pixel: if not factory.supports_color_depth(self.bits_per_pixel): continue result.append(factory) preload_foreign_keys(result, operating_system=True) return result
def matching_factories(self): """ Get active factories that are compatible with this request group. """ factories = Factory.objects.filter( last_poll__gte=last_poll_timeout()) result = [] for factory in factories: if self.width and self.height: if not factory.supports_screen_size(self.width, self.height): continue elif self.width: if not factory.supports_screen_width(self.width): continue elif self.height: if not factory.supports_screen_height(self.height): continue if self.bits_per_pixel: if not factory.supports_color_depth(self.bits_per_pixel): continue result.append(factory) preload_foreign_keys(result, operating_system=True) return result
def start(http_request): """ Front page with URL input, browser chooser, and options. """ if (http_request.user.is_anonymous() and hasattr(settings, 'ALLOW_ANONYMOUS_REQUESTS') and not settings.ALLOW_ANONYMOUS_REQUESTS): url = '/' if http_request.META['QUERY_STRING']: url += '?' + http_request.META['QUERY_STRING'] return error_page(http_request, _("login required"), _("Anonymous screenshot requests are not allowed."), u'<a href="/accounts/login/?next=%s">%s</a>' % ( urllib.quote(url.encode('utf-8')), _("Please log in with your username and password."))) # Initialize forms. post = http_request.POST or None url_form = UrlForm(post) features_form = FeaturesForm(post) options_form = OptionsForm(post) special_form = SpecialForm(post) # Get available choices from database, with correct translations. active_factories = Factory.objects.filter( last_poll__gte=last_poll_timeout()) active_browsers = Browser.objects.filter( factory__in=active_factories, active=True) if not active_browsers: return error_page(http_request, _("out of service"), _("No active screenshot factories."), _("Please try again later.")) features_form.load_choices(active_browsers) options_form.load_choices(active_factories) # Validate posted data. valid_post = (url_form.is_valid() and options_form.is_valid() and features_form.is_valid() and special_form.is_valid()) # Preload some database entries for browser forms preload_foreign_keys(active_browsers, factory=active_factories, factory__operating_system=True, browser_group=True, engine=True) # Select browsers according to GET request selected_browsers = None if 'browsers' in http_request.GET: selected_browsers = http_request.GET['browsers'].split() # Browser forms for each platform. browser_forms = [] for platform in Platform.objects.all(): browser_form = BrowsersForm(active_browsers, platform, post, selected_browsers) browser_form.platform_name = \ unicode(platform).lower().replace(' ', '-') if browser_form.is_bound: browser_form.full_clean() if browser_form.fields: browser_forms.append(browser_form) valid_post = valid_post and browser_form.is_valid() browser_forms[0].is_first = True browser_forms[-1].is_last = True priority = 0 if valid_post: if (url_form.cleaned_data['shocksite_keywords'] > settings.SHOCKSITE_KEYWORDS_ALLOWED): # Ignore screenshot requests for shock sites. priority = -url_form.cleaned_data['shocksite_keywords'] elif 'shotserver04.priority' in settings.INSTALLED_APPS: # Get priority processing for domain or user. from shotserver04.priority import domain_priority, user_priority priority = max(domain_priority(url_form.cleaned_data['domain']), user_priority(http_request.user)) usage_limited = check_usage_limits( http_request, priority, url_form.cleaned_data['website'], url_form.cleaned_data['domain']) if usage_limited: valid_post = False if not valid_post: # Show HTML form. if 'url' in http_request.GET: url_form.fields['url'].initial = http_request.GET['url'] multi_column(browser_forms) selectors = mark_safe(',\n'.join([ SELECTOR_TEMPLATE % (plus_minus, capfirst(text)) for text, plus_minus in selector_pairs(browser_forms)])) news_list = NewsItem.objects.all()[:10] sponsors_list = Sponsor.objects.filter(front_page=True) show_special_form = http_request.user.is_authenticated() return render_to_response('start/start.html', locals(), context_instance=RequestContext(http_request)) # Create screenshot requests and redirect to website overview. expire = datetime.now() + timedelta(minutes=30) values = { 'website': url_form.cleaned_data['website'], 'ip': http_request.META['REMOTE_ADDR'], 'user': None, } if http_request.user.is_authenticated(): values['user'] = http_request.user values.update(options_form.cleaned_data) values.update(features_form.cleaned_data) values.update(special_form.cleaned_data) match_values = {} for key in values: if values[key] is None: match_values[key + '__isnull'] = True else: match_values[key] = values[key] existing = RequestGroup.objects.filter( expire__gte=datetime.now(), **match_values).order_by('-submitted') if (len(existing) and existing[0].request_set.filter(screenshot__isnull=True).count()): # Previous request group is still pending, reuse it. request_group = existing[0] request_group.update_fields(expire=expire) if priority > request_group.priority: request_group.update_fields(priority=priority) else: request_group = RequestGroup.objects.create( expire=expire, priority=priority, **values) for browser_form in browser_forms: create_platform_requests( request_group, browser_form.platform, browser_form, priority) # Make sure that the redirect will show the new request group transaction.commit() # return render_to_response('debug.html', locals(), # context_instance=RequestContext(http_request)) return HttpResponseRedirect(values['website'].get_absolute_url())