Exemple #1
0
    def get_resources_as_linkheader(self):
        import link_header

        links = []
        for path, resource in self._resources.items():
            if hasattr(resource, "get_link_description"):
                details = resource.get_link_description()
            else:
                details = {}
            lh = link_header.Link('/' + '/'.join(path), **details)

            links.append(lh)
        return link_header.LinkHeader(links)
    def get_resources_as_linkheader(self):
        import link_header

        links = []

        selfdetails = self.get_link_description()
        if selfdetails:
            links.append(link_header.Link("", **selfdetails))

        for path, resource in self._resources.items():
            if hasattr(resource, "get_resources_as_linkheader"):
                for l in resource.get_resources_as_linkheader().links:
                    links.append(
                        link_header.Link('/' + '/'.join(path) + l.href,
                                         l.attr_pairs))
            else:
                if hasattr(resource, "get_link_description"):
                    details = resource.get_link_description()
                else:
                    details = {}
                lh = link_header.Link('/' + '/'.join(path), **details)

                links.append(lh)
        return link_header.LinkHeader(links)
Exemple #3
0
def single_linky(request, guid):
    """
    Given a Perma ID, serve it up.
    """

    # Create a canonical version of guid (non-alphanumerics removed, hyphens every 4 characters, uppercase),
    # and forward to that if it's different from current guid.
    canonical_guid = Link.get_canonical_guid(guid)
    link = get_object_or_404(Link.objects.all_with_deleted(),
                             guid=canonical_guid)

    if canonical_guid != guid:
        return HttpResponsePermanentRedirect(
            reverse('single_linky', args=[canonical_guid]))

    # If we get an unrecognized archive type (which could be an old type like 'live' or 'pdf'), forward to default version
    serve_type = request.GET.get('type')
    if serve_type is None:
        serve_type = 'source'
    elif serve_type not in valid_serve_types:
        return HttpResponsePermanentRedirect(
            reverse('single_linky', args=[canonical_guid]))

    # Increment the view count if we're not the referrer
    parsed_url = urlparse(request.META.get('HTTP_REFERER', ''))
    if not request.get_host(
    ) in parsed_url.netloc and not settings.READ_ONLY_MODE:
        link.view_count += 1
        link.save()

    # serve raw WARC
    if serve_type == 'warc_download':

        response = StreamingHttpResponse(FileWrapper(
            default_storage.open(link.warc_storage_file()), 1024 * 8),
                                         content_type="application/gzip")
        response[
            'Content-Disposition'] = "attachment; filename=%s.warc.gz" % link.guid
        return response

    if serve_type == 'image':
        capture = link.screenshot_capture
    else:
        capture = link.primary_capture

    new_record = False
    if request.user.is_authenticated(
    ) and link.created_by_id == request.user.id and not link.user_deleted:
        # If this record was just created by the current user, show them a new record message
        new_record = link.creation_timestamp > timezone.now() - timedelta(
            seconds=300)

    context = {
        'link': link,
        'can_view': request.user.can_view(link),
        'can_edit': request.user.can_view(link),
        'can_delete': request.user.can_delete(link),
        'can_toggle_private': request.user.can_toggle_private(link),
        'capture': capture,
        'next': request.get_full_path(),
        'serve_type': serve_type,
        'new_record': new_record,
        'this_page': 'single_link',
    }

    response = render(request, 'archive/single-link.html', context)
    date_header = format_date_time(mktime(link.creation_timestamp.timetuple()))
    protocol = "https://" if settings.SECURE_SSL_REDIRECT else "http://"
    link_memento = protocol + settings.WARC_HOST + '/' + link.guid
    link_timegate = protocol + settings.WARC_HOST + '/warc/' + link.safe_url
    link_timemap = protocol + settings.WARC_HOST + '/warc/timemap/*/' + link.safe_url
    response['Memento-Datetime'] = date_header

    response['Link'] = str(
        link_header.LinkHeader([
            link_header.Link(
                link.safe_url,
                rel="original",
                datetime=date_header,
            ),
            link_header.Link(
                link_memento,
                rel="memento",
                datetime=date_header,
            ),
            link_header.Link(link_timegate, rel="timegate"),
            link_header.Link(link_timemap,
                             rel="timemap",
                             type="application/link-format"),
        ]))
    return response