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)
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