def make_etag(self, renderer_settings): """Return an ETag identifying this render.""" etag = '%s:%s:%s:%s' % ( get_diff_renderer_class(), renderer_settings['collapse_all'], renderer_settings['highlighting'], settings.TEMPLATE_SERIAL) return encode_etag(etag)
def make_etag(self, renderer_settings, filediff_id, interdiffset_or_id=None, **kwargs): """Return an ETag identifying this render.""" if interdiffset_or_id and isinstance(interdiffset_or_id, DiffSet): interdiffset_or_id = interdiffset_or_id.pk etag = "%s:%s:%s:%s:%s:%s" % ( get_diff_renderer_class(), renderer_settings["collapse_all"], renderer_settings["highlighting"], filediff_id, interdiffset_or_id, settings.TEMPLATE_SERIAL, ) return encode_etag(etag)
def make_etag(self, renderer_settings, filediff_id, interfilediff_id=None, **kwargs): """Return an ETag identifying this render. Args: renderer_settings (dict): The settings determining how to render this diff. The following keys are required: ``collapse_all`` and ``highlighting``. The following key is optional: ``show_deleted``. filediff_id (int): The ID of the :py:class:`~reviewboard.diffviewer.models.filediff.FileDiff` being rendered. interfilediff_id (int): The ID of the :py:class:`~reviewboard.diffviewer.models.filediff.FileDiff` on the other side of the diff revision, if viewing an interdiff. **kwargs (dict): Additional keyword arguments passed to the function. Return: unicode: The encoded ETag identifying this render. """ etag = '%s:%s:%s:%s:%s:%s' % ( get_diff_renderer_class(), renderer_settings['collapse_all'], renderer_settings['highlighting'], filediff_id, interfilediff_id, settings.TEMPLATE_SERIAL) show_deleted = renderer_settings.get('show_deleted') if show_deleted: etag += ':%s' % show_deleted return encode_etag(etag)
def make_etag(self, renderer_settings, filediff_id, interfilediff_id=None, **kwargs): """Return an ETag identifying this render. Args: renderer_settings (dict): The settings determining how to render this diff. The following keys are required: ``collapse_all`` and ``highlighting``. The following key is optional: ``show_deleted``. filediff_id (int): The ID of the :py:class:`~reviewboard.diffviewer.models.FileDiff` being rendered. interfilediff_id (int): The ID of the :py:class:`~reviewboard.diffviewer.models.FileDiff` on the other side of the diff revision, if viewing an interdiff. **kwargs (dict): Additional keyword arguments passed to the function. Return: unicode: The encoded ETag identifying this render. """ etag = '%s:%s:%s:%s:%s:%s' % ( get_diff_renderer_class(), renderer_settings['collapse_all'], renderer_settings['highlighting'], filediff_id, interfilediff_id, settings.TEMPLATE_SERIAL) show_deleted = renderer_settings.get('show_deleted') if show_deleted: etag += ':%s' % show_deleted return encode_etag(etag)
def view_diff(request, diffset, interdiffset=None, extra_context={}, template_name='diffviewer/view_diff.html'): highlighting = get_enable_highlighting(request.user) try: if interdiffset: logging.debug("Generating diff viewer page for interdiffset ids " "%s-%s", diffset.id, interdiffset.id, request=request) else: logging.debug("Generating diff viewer page for filediff id %s", diffset.id, request=request) files = get_diff_files(diffset, None, interdiffset, request=request) # Break the list of files into pages siteconfig = SiteConfiguration.objects.get_current() paginator = Paginator(files, siteconfig.get("diffviewer_paginate_by"), siteconfig.get("diffviewer_paginate_orphans")) page_num = int(request.GET.get('page', 1)) if request.GET.get('file', False): file_id = int(request.GET['file']) for i, f in enumerate(files): if f['filediff'].id == file_id: page_num = i // paginator.per_page + 1 if page_num > paginator.num_pages: page_num = paginator.num_pages break page = paginator.page(page_num) collapse_diffs = get_collapse_diff(request) context = { 'diffset': diffset, 'interdiffset': interdiffset, 'diffset_pair': (diffset, interdiffset), 'files': page.object_list, 'collapseall': collapse_diffs, # Add the pagination context 'is_paginated': page.has_other_pages(), 'page': page.number, 'pages': paginator.num_pages, 'page_numbers': paginator.page_range, 'has_next': page.has_next(), 'next_page': page.next_page_number(), 'has_previous': page.has_previous(), 'previous_page': page.previous_page_number(), 'page_start_index': page.start_index(), } context.update(extra_context) renderer_class = get_diff_renderer_class() if renderer_class.preload_first_file and page.object_list: # Attempt to preload the first file before rendering any part of # the page. This helps to remove the perception that the diff # viewer takes longer to load now that we have progressive diffs. # Users were seeing the page itself load quickly, but didn't see # that first diff immediately and instead saw a spinner, making # them feel it was taking longer than it used to to load a page. # We just trick the user by providing that first file. first_file = page.object_list[0] else: first_file = None if first_file: filediff = first_file['filediff'] if filediff.diffset == interdiffset: temp_files = get_diff_files(interdiffset, filediff, None, request=request) else: temp_files = get_diff_files(diffset, filediff, interdiffset, request=request) if temp_files: try: populate_diff_chunks(temp_files, highlighting, request=request) except Exception, e: file_temp = temp_files[0] file_temp['index'] = first_file['index'] first_file['fragment'] = exception_traceback( request, e, 'diffviewer/diff_fragment_error.html', extra_context={'file': file_temp}) else: file_temp = temp_files[0] file_temp['index'] = first_file['index'] renderer = renderer_class( file_temp, highlighting=highlighting, collapse_all=collapse_diffs, extra_context=context) first_file['fragment'] = renderer.render_to_string() response = render_to_response(template_name, RequestContext(request, context)) response.set_cookie('collapsediffs', collapse_diffs) if interdiffset: logging.debug("Done generating diff viewer page for interdiffset " "ids %s-%s", diffset.id, interdiffset.id, request=request) else: logging.debug("Done generating diff viewer page for filediff " "id %s", diffset.id, request=request) return response
def view_diff(request, diffset, interdiffset=None, extra_context={}, template_name='diffviewer/view_diff.html'): highlighting = get_enable_highlighting(request.user) try: if interdiffset: logging.debug( "Generating diff viewer page for interdiffset ids " "%s-%s", diffset.id, interdiffset.id, request=request) else: logging.debug("Generating diff viewer page for filediff id %s", diffset.id, request=request) files = get_diff_files(diffset, None, interdiffset, request=request) # Break the list of files into pages siteconfig = SiteConfiguration.objects.get_current() paginator = Paginator(files, siteconfig.get("diffviewer_paginate_by"), siteconfig.get("diffviewer_paginate_orphans")) page_num = int(request.GET.get('page', 1)) if request.GET.get('file', False): file_id = int(request.GET['file']) for i, f in enumerate(files): if f['filediff'].id == file_id: page_num = i // paginator.per_page + 1 if page_num > paginator.num_pages: page_num = paginator.num_pages break page = paginator.page(page_num) collapse_diffs = get_collapse_diff(request) context = { 'diffset': diffset, 'interdiffset': interdiffset, 'diffset_pair': (diffset, interdiffset), 'files': page.object_list, 'collapseall': collapse_diffs, # Add the pagination context 'is_paginated': page.has_other_pages(), 'page': page.number, 'pages': paginator.num_pages, 'page_numbers': paginator.page_range, 'has_next': page.has_next(), 'next_page': page.next_page_number(), 'has_previous': page.has_previous(), 'previous_page': page.previous_page_number(), 'page_start_index': page.start_index(), } context.update(extra_context) renderer_class = get_diff_renderer_class() if renderer_class.preload_first_file and page.object_list: # Attempt to preload the first file before rendering any part of # the page. This helps to remove the perception that the diff # viewer takes longer to load now that we have progressive diffs. # Users were seeing the page itself load quickly, but didn't see # that first diff immediately and instead saw a spinner, making # them feel it was taking longer than it used to to load a page. # We just trick the user by providing that first file. first_file = page.object_list[0] else: first_file = None if first_file: filediff = first_file['filediff'] if filediff.diffset == interdiffset: temp_files = get_diff_files(interdiffset, filediff, None, request=request) else: temp_files = get_diff_files(diffset, filediff, interdiffset, request=request) if temp_files: try: populate_diff_chunks(temp_files, highlighting, request=request) except Exception, e: file_temp = temp_files[0] file_temp['index'] = first_file['index'] first_file['fragment'] = exception_traceback( request, e, 'diffviewer/diff_fragment_error.html', extra_context={'file': file_temp}) else: file_temp = temp_files[0] file_temp['index'] = first_file['index'] renderer = renderer_class(file_temp, highlighting=highlighting, collapse_all=collapse_diffs, extra_context=context) first_file['fragment'] = renderer.render_to_string() response = render_to_response(template_name, RequestContext(request, context)) response.set_cookie('collapsediffs', collapse_diffs) if interdiffset: logging.debug( "Done generating diff viewer page for interdiffset " "ids %s-%s", diffset.id, interdiffset.id, request=request) else: logging.debug( "Done generating diff viewer page for filediff " "id %s", diffset.id, request=request) return response