Example #1
0
    def diff_view(self, request, **kwargs):
        # view that shows a revision on the left and one on the right
        # if the right revision has value zero: the current page is used!
        # -> page id is only necessary in the utter case
        # if the comparison_pk is zero: the latest version is used
        # comparison_pk and base_pk are primary keys for *pages*!

        # also called left_pk
        left_pk = kwargs.pop('left_pk')
        # also called right_pk
        right_pk = kwargs.pop('right_pk')
        page_pk = kwargs.pop('page_pk')

        right_page_is_active_page = True

        language = request.GET.get('language')

        left = 'page'
        right = 'page'

        # get the draft we are talking about
        page_draft = get_object_or_404(Page, pk=page_pk).get_draft_object()

        # check if the current user may view the revision
        # -> if the user may see the page
        user = get_current_user()
        if not user_can_view_page(user, page_draft):
            messages.error(request, _('Missing permission to view this page.'))
            prev = request.META.get('HTTP_REFERER')
            if prev:
                return redirect(prev)
            else:
                raise Http404

        # the right panel has id=0
        # -> use the draft of the page
        # -> else: fetch the page
        if int(right_pk) == 0:
            right_page = page_draft
            right_page_is_active_page = True
        else:
            right = 'pageVersion'
            right_page = PageVersion.objects.get(pk=right_pk)
            right_page_is_active_page = False

        # the left panel has id=0
        # -> use the latest PageVersion draft of the page
        # -> else: fetch the page
        if int(left_pk) == 0:
            page_draft_versions = PageVersion.objects.filter(draft=page_draft, active=True, language=language)\
                .order_by('-hidden_page__changed_date')[:1]

            if page_draft_versions.count() > 0:
                left_page = page_draft_versions.first()
                left = 'pageVersion'
            else:
                messages.info(request,
                              _(u'There are no snapshots for this page'))
                return self.render_close_frame()
        else:
            left = 'pageVersion'
            left_page = PageVersion.objects.get(pk=left_pk)

        # list of page's revisions to show as the left sidebar
        revision_list = PageVersion.objects.filter(draft=page_draft,
                                                   language=language)
        # group the revisions by date
        grouped_revisions = {}
        for rev in revision_list.iterator():
            key = rev.hidden_page.changed_date.strftime("%Y-%m-%d")
            if key not in grouped_revisions.keys():
                grouped_revisions[key] = []
            grouped_revisions[key].insert(0, rev)
        sorted_grouped_revisions = sorted(grouped_revisions.items(),
                                          key=lambda i: i[0],
                                          reverse=True)

        # differences between the placeholders
        if left == 'pageVersion':
            l_page = left_page.hidden_page
        else:
            l_page = left_page
        if right == 'pageVersion':
            r_page = right_page.hidden_page
        else:
            r_page = right_page

        diffs = create_placeholder_contents(l_page, r_page, request, language)

        left_page_absolute_url = left_page.hidden_page.get_draft_url(
            language=language)

        context = SekizaiContext({
            'left':
            left,
            'right':
            right,
            'left_page':
            left_page,
            'right_page':
            right_page,
            'is_popup':
            True,
            'page':
            page_draft.pk,
            'active_left_page_version_pk':
            left_page.pk,
            'request':
            request,
            'sorted_grouped_revisions':
            sorted_grouped_revisions,
            'active_language':
            language,
            'all_languages':
            page_draft.languages.split(','),
            'diffs':
            diffs,
            'left_page_absolute_url':
            left_page_absolute_url,
            'right_page_is_active_page':
            right_page_is_active_page
        })

        return render(request,
                      self.diff_view_template,
                      context=context.flatten())
Example #2
0
        def render_page_row(page):
            page.title_cache = {
                trans.language: trans
                for trans in page.filtered_translations
            }

            for _language in languages:
                # EmptyTitle is used to prevent the cms from trying
                # to find a translation in the database
                page.title_cache.setdefault(_language,
                                            EmptyTitle(language=_language))

            has_move_page_permission = self.has_move_page_permission(request,
                                                                     obj=page)

            if permissions_on and not has_move_page_permission:
                # TODO: check if this is really needed
                metadata = '{"valid_children": False, "draggable": False}'
            else:
                metadata = ''

            # Get Bin/Version Context
            # ----------
            page_query = page.get_root().title_set.filter(
                title__in=[BIN_ROOT_TITLE, VERSION_ROOT_TITLE])
            is_in_bin = page_query.filter(title=BIN_ROOT_TITLE).exists()
            is_version = page_query.filter(title=VERSION_ROOT_TITLE).exists()

            if is_in_bin or is_version:
                # Get the page version associated with the hidden page
                page_version = PageVersion.objects.filter(
                    hidden_page=page.get_draft_object(), language=lang)
                # Need this as .~VERSIONS comes up as a 'version' but doesn't have a page_version
                if page_version.exists():
                    page_version = page_version.first()

                # Use Sekizai context so we can render the page
                context = SekizaiContext({
                    'admin':
                    self,
                    'opts':
                    self.opts,
                    'site':
                    site,
                    'page':
                    page,
                    'node':
                    page.node,
                    'ancestors':
                    [node.item for node in page.node.get_cached_ancestors()],
                    'descendants':
                    [node.item for node in page.node.get_cached_descendants()],
                    'request':
                    request,
                    'lang':
                    language,
                    'metadata':
                    metadata,
                    'page_languages':
                    page.get_languages(),
                    'preview_language':
                    language,
                    'follow_descendants':
                    follow_descendants,
                    'site_languages':
                    languages,
                    'is_popup':
                    is_popup,
                    # -------- bin/version settings --------
                    'has_add_page_permission':
                    False,
                    'has_change_permission':
                    False,
                    'has_change_advanced_settings_permission':
                    False,
                    'has_copy_page_permission':
                    False,
                    'has_publish_permission':
                    False,
                    'has_move_page_permission':
                    False,
                    'is_bin':
                    is_in_bin,
                    'is_version':
                    is_version,
                    'page_version':
                    page_version,
                })
                return bin_template.render(context.flatten())

            else:
                # For 'normal' pages return default context
                context = {
                    'admin':
                    self,
                    'opts':
                    self.opts,
                    'site':
                    site,
                    'page':
                    page,
                    'node':
                    page.node,
                    'ancestors':
                    [node.item for node in page.node.get_cached_ancestors()],
                    'descendants':
                    [node.item for node in page.node.get_cached_descendants()],
                    'request':
                    request,
                    'lang':
                    language,
                    'metadata':
                    metadata,
                    'page_languages':
                    page.get_languages(),
                    'preview_language':
                    language,
                    'follow_descendants':
                    follow_descendants,
                    'site_languages':
                    languages,
                    'is_popup':
                    is_popup,
                    'has_add_page_permission':
                    user_can_add(user, target=page),
                    'has_change_permission':
                    self.has_change_permission(request, obj=page),
                    'has_publish_permission':
                    self.has_publish_permission(request, obj=page),
                    'has_change_advanced_settings_permission':
                    self.has_change_advanced_settings_permission(request,
                                                                 obj=page),
                    'has_move_page_permission':
                    has_move_page_permission,
                }
                return template.render(context)