示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
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
示例#6
0
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