Ejemplo n.º 1
0
def details(http_request, url):
    """
    Show details for a selected website.
    """
    page = 1
    if url.isdigit():
        website = get_object_or_404(Website, id=int(url))
        if 'page' in http_request.GET:
            page = int(http_request.GET['page'])
    else:
        if http_request.META['QUERY_STRING']:
            url += '?' + http_request.META['QUERY_STRING']
        url = normalize_url(url) # Replace ' ' with '%20' etc.
        try:
            website = Website.objects.get(url=url)
        except Website.DoesNotExist:
            return unknown_url(http_request, url)
    # Use caching to reduce number of SQL queries
    domain = website.domain
    browsers = Browser.objects.all()
    preload_foreign_keys(browsers, browser_group=True)
    factories = Factory.objects.all()
    preload_foreign_keys(factories, operating_system=True)
    request_groups = list(website.requestgroup_set.all())
    paginator = Paginator(request_groups, 5, orphans=2)
    if page < 1 or page > paginator.num_pages:
        raise Http404('Requested page out of range.')
    request_group_list = paginator.page(page).object_list
    pages_list = []
    if paginator.num_pages > 1:
        for number in range(1, paginator.num_pages + 1):
            extra_classes = ''
            if page == number:
                extra_classes = ' current'
            pages_list.append(
                u'<a class="page%s" href="%s?page=%d">%d</a>' % (
                extra_classes, website.get_numeric_url(), number, number))
    user_has_priority = False
    if 'shotserver04.priority' in settings.INSTALLED_APPS:
        if not http_request.user.is_anonymous():
            user_has_priority = http_request.user.userpriority_set.filter(
                expire__gte=datetime.now()).count()
        if not user_has_priority:
            website_details_head_extra = """
<p class="admonition new">
<a href="/priority/">Support the Browsershots project!<br />
Get a month of priority processing for 10 Euros or 15 Dollars.</a>
</p>
""".strip()
    for index, request_group in enumerate(request_groups):
        request_group._http_request = http_request
        request_group._index = len(request_groups) - index
        request_group._browsers_cache = browsers
        request_group._factories_cache = factories
        request_group._website_cache = website
        request_group._website_cache._domain_cache = domain
    # Get other websites on the same domain
    domain_website_list = domain.website_set.exclude(id=website.id)
    return render_to_response('websites/details.html', locals(),
        context_instance=RequestContext(http_request))
Ejemplo n.º 2
0
def details(http_request, url):
    """
    Show details for a selected website.
    """
    page = 1
    if url.isdigit():
        website = get_object_or_404(Website, id=int(url))
        if 'page' in http_request.GET:
            page = int(http_request.GET['page'])
    else:
        if http_request.META['QUERY_STRING']:
            url += '?' + http_request.META['QUERY_STRING']
        url = normalize_url(url) # Replace ' ' with '%20' etc.
        try:
            website = Website.objects.get(url=url)
        except Website.DoesNotExist:
            return unknown_url(http_request, url)
    # Use caching to reduce number of SQL queries
    domain = website.domain
    browsers = Browser.objects.all()
    preload_foreign_keys(browsers, browser_group=True)
    factories = Factory.objects.all()
    preload_foreign_keys(factories, operating_system=True)
    request_groups = list(website.requestgroup_set.all())
    paginator = Paginator(request_groups, 5, orphans=2)
    if page < 1 or page > paginator.num_pages:
        raise Http404('Requested page out of range.')
    request_group_list = paginator.page(page).object_list
    pages_list = []
    if paginator.num_pages > 1:
        for number in range(1, paginator.num_pages + 1):
            extra_classes = ''
            if page == number:
                extra_classes = ' current'
            pages_list.append(
                u'<a class="page%s" href="%s?page=%d">%d</a>' % (
                extra_classes, website.get_numeric_url(), number, number))
    user_has_priority = False
    if 'shotserver04.priority' in settings.INSTALLED_APPS:
        if not http_request.user.is_anonymous():
            user_has_priority = http_request.user.userpriority_set.filter(
                expire__gte=datetime.now()).count()
        if not user_has_priority:
            website_details_head_extra = """
<p class="admonition new">
<a href="/priority/">Support the Browsershots project!<br />
Get a month of priority processing for 10 Euros or 15 Dollars.</a>
</p>
""".strip()
    for index, request_group in enumerate(request_groups):
        request_group._http_request = http_request
        request_group._index = len(request_groups) - index
        request_group._browsers_cache = browsers
        request_group._factories_cache = factories
        request_group._website_cache = website
        request_group._website_cache._domain_cache = domain
    # Get other websites on the same domain
    domain_website_list = domain.website_set.exclude(id=website.id)
    return render_to_response('websites/details.html', locals(),
        context_instance=RequestContext(http_request))
Ejemplo n.º 3
0
 def clean_url(self):
     """
     Clean URL and attempt HTTP GET request.
     """
     self.cleaned_data['url'] = normalize_url(self.cleaned_data['url'])
     self.add_scheme()
     self.split_url()
     self.punycode_url()
     self.check_server_disallowed()
     self.add_slash()
     self.robots_txt()
     response = self.http_get()
     self.cleaned_data['headers'] = response[0]
     self.cleaned_data['content'] = response[1]
     self.check_content_type()
     self.check_content()
     self.cleaned_data['domain'] = self.get_or_create_domain()
     self.cleaned_data['website'] = self.get_or_create_website()
     return self.cleaned_data['url']
Ejemplo n.º 4
0
def submit(http_request, username, encrypted_password, url, browsers):
    """
    Submit a new group of screenshot requests.

    Arguments
    ~~~~~~~~~
    * username string (your user account on the server)
    * encrypted_password string (lowercase hexadecimal, length 32)
    * url string (request screenshots of this website)
    * browsers list (platform, name and version for each browser)

    Return value
    ~~~~~~~~~~~~
    * id int (request group id)

    You can use the returned request group id to check the progress of
    the screenshot requests with requests.status.
    """
    # Get user from database
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        raise Fault(404, "User not found.")
    # Verify authentication
    nonces.verifyUser(http_request, user, encrypted_password)
    # Check priority
    priority = 0
    if 'shotserver04.priority' in settings.INSTALLED_APPS:
        from shotserver04.priority import user_priority
        priority = user_priority(user)
        if priority < 1:
            raise Fault(402, "Priority processing is required.")
    # Create domain and website if needed
    url = normalize_url(url)
    domain_name = extract_domain(url, remove_www=True)
    domain = Domain.objects.get_or_create(name=domain_name)[0]
    website = Website.objects.get_or_create(domain=domain, url=url)[0]
    # Create request group
    expire = datetime.now() + timedelta(minutes=30)
    ip = http_request.META['REMOTE_ADDR']
    request_group = RequestGroup.objects.create(website=website,
                                                user=user,
                                                ip=ip,
                                                expire=expire,
                                                priority=priority)
    # Create browser requests
    platforms = Platform.objects.all()
    browser_groups = BrowserGroup.objects.all()
    for name in browsers:
        parts = name.split('_')
        if len(parts) != 4:
            continue
        platform_name, browser_name, major, minor = parts
        platform_name = platform_name.replace('-', ' ')
        platform = find_by_name(platforms, platform_name)
        if platform is None:
            continue
        browser_group = find_by_name(browser_groups, browser_name)
        if browser_group is None:
            continue
        Request.objects.get_or_create(
            request_group=request_group,
            platform=platform,
            browser_group=browser_group,
            major=int_or_none(major),
            minor=int_or_none(minor),
            priority=priority,
        )
    return request_group.id
Ejemplo n.º 5
0
def submit(http_request, username, encrypted_password, url, browsers):
    """
    Submit a new group of screenshot requests.

    Arguments
    ~~~~~~~~~
    * username string (your user account on the server)
    * encrypted_password string (lowercase hexadecimal, length 32)
    * url string (request screenshots of this website)
    * browsers list (platform, name and version for each browser)

    Return value
    ~~~~~~~~~~~~
    * id int (request group id)

    You can use the returned request group id to check the progress of
    the screenshot requests with requests.status.
    """
    # Get user from database
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        raise Fault(404, "User not found.")
    # Verify authentication
    nonces.verifyUser(http_request, user, encrypted_password)
    # Check priority
    priority = 0
    if 'shotserver04.priority' in settings.INSTALLED_APPS:
        from shotserver04.priority import user_priority
        priority = user_priority(user)
        if priority < 1:
            raise Fault(402, "Priority processing is required.")
    # Create domain and website if needed
    url = normalize_url(url)
    domain_name = extract_domain(url, remove_www=True)
    domain = Domain.objects.get_or_create(name=domain_name)[0]
    website = Website.objects.get_or_create(domain=domain, url=url)[0]
    # Create request group
    expire = datetime.now() + timedelta(minutes=30)
    ip = http_request.META['REMOTE_ADDR']
    request_group = RequestGroup.objects.create(
        website=website, user=user, ip=ip,
        expire=expire, priority=priority)
    # Create browser requests
    platforms = Platform.objects.all()
    browser_groups = BrowserGroup.objects.all()
    for name in browsers:
        parts = name.split('_')
        if len(parts) != 4:
            continue
        platform_name, browser_name, major, minor = parts
        platform_name = platform_name.replace('-', ' ')
        platform = find_by_name(platforms, platform_name)
        if platform is None:
            continue
        browser_group = find_by_name(browser_groups, browser_name)
        if browser_group is None:
            continue
        Request.objects.get_or_create(
            request_group=request_group,
            platform=platform,
            browser_group=browser_group,
            major=int_or_none(major),
            minor=int_or_none(minor),
            priority=priority,
            )
    return request_group.id