예제 #1
0
 def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     events = list(Event.objects.filter(content=self.object))
     events.reverse()
     make_pagination(context,
                     self.request,
                     events,
                     settings.ZDS_APP["content"]["commits_per_page"],
                     context_list_name="events")
     return context
예제 #2
0
파일: history.py 프로젝트: Vultik/zds-site
    def get_context_data(self, **kwargs):
        context = super(DisplayHistory, self).get_context_data(**kwargs)

        repo = self.versioned_object.repository
        commits = list(objects.commit.Commit.iter_items(repo, "HEAD"))

        # Pagination of commits
        make_pagination(context,
                        self.request,
                        commits,
                        settings.ZDS_APP["content"]["commits_per_page"],
                        context_list_name="commits")

        # Git empty tree is 4b825dc642cb6eb9a060e54bf8d69288fbee4904, see
        # http://stackoverflow.com/questions/9765453/gits-semi-secret-empty-tree
        context["empty_sha"] = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"

        return context
예제 #3
0
    def get_context_data(self, **kwargs):
        """Show the given tutorial if exists."""
        context = super(DisplayOnlineContent, self).get_context_data(**kwargs)

        if context['is_staff']:
            if self.current_content_type == 'OPINION':
                context['alerts'] = self.object.alerts_on_this_content.all()
            context['formRevokeValidation'] = RevokeValidationForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})
            context['formUnpublication'] = UnpublicationForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})

        context['formWarnTypo'] = WarnTypoForm(self.versioned_object,
                                               self.versioned_object)

        queryset_reactions = ContentReaction.objects\
            .select_related('author') \
            .select_related('author__profile') \
            .select_related('hat') \
            .select_related('editor') \
            .prefetch_related('alerts_on_this_comment') \
            .prefetch_related('alerts_on_this_comment__author') \
            .filter(related_content__pk=self.object.pk) \
            .order_by('pubdate')

        # pagination of articles and opinions
        context['previous_content'] = None
        context['next_content'] = None

        if self.current_content_type in ('ARTICLE', 'OPINION'):
            queryset_pagination = PublishedContent.objects.filter(
                content_type=self.current_content_type, must_redirect=False)

            if self.current_content_type == 'OPINION':
                # filter opinions only from the same author
                queryset_pagination = queryset_pagination.filter(
                    authors__in=self.object.authors.all())

            context['previous_content'] = queryset_pagination \
                .filter(publication_date__lt=self.public_content_object.publication_date) \
                .order_by('publication_date').first()
            context['next_content'] = queryset_pagination \
                .filter(publication_date__gt=self.public_content_object.publication_date) \
                .order_by('publication_date').first()

        if self.versioned_object.type == 'OPINION':
            context['formPickOpinion'] = PickOpinionForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})
            context['formUnpickOpinion'] = UnpickOpinionForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})
            context['formConvertOpinion'] = PromoteOpinionToArticleForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})

        # pagination of comments
        make_pagination(context,
                        self.request,
                        queryset_reactions,
                        settings.ZDS_APP['content']['notes_per_page'],
                        context_list_name='reactions',
                        with_previous_item=True)

        # is JS activated ?
        context['is_js'] = True
        if not self.object.js_support:
            context['is_js'] = False

        # optimize requests:
        votes = CommentVote.objects.filter(
            user_id=self.request.user.id,
            comment__in=queryset_reactions).all()
        context['user_like'] = [
            vote.comment_id for vote in votes if vote.positive
        ]
        context['user_dislike'] = [
            vote.comment_id for vote in votes if not vote.positive
        ]

        if self.request.user.has_perm('tutorialv2.change_contentreaction'):
            context['user_can_modify'] = [
                reaction.pk for reaction in queryset_reactions
            ]
        else:
            context['user_can_modify'] = [
                reaction.pk for reaction in queryset_reactions
                if reaction.author == self.request.user
            ]

        context['is_antispam'] = self.object.antispam()
        context['pm_link'] = self.object.get_absolute_contact_url(
            _('À propos de'))
        context[
            'subscriber_count'] = ContentReactionAnswerSubscription.objects.get_subscriptions(
                self.object).count()
        # We need reading time expressed in minutes
        try:
            context['reading_time'] = int(
                self.versioned_object.get_tree_level() *
                self.object.public_version.char_count /
                settings.ZDS_APP['content']['characters_per_minute'])
        except ZeroDivisionError as e:
            logger.warning(
                'could not compute reading time: setting characters_per_minute is set to zero (error=%s)',
                e)

        if self.request.user.is_authenticated():
            for reaction in context['reactions']:
                signals.content_read.send(sender=reaction.__class__,
                                          instance=reaction,
                                          user=self.request.user)
            signals.content_read.send(sender=self.object.__class__,
                                      instance=self.object,
                                      user=self.request.user,
                                      target=PublishableContent)
        if last_participation_is_old(self.object, self.request.user):
            mark_read(self.object, self.request.user)

        return context
예제 #4
0
    def get_context_data(self, **kwargs):
        context = super(ViewPublications, self).get_context_data(**kwargs)

        if self.kwargs.get('slug', False):
            self.level = 2
            self.max_last_contents = settings.ZDS_APP['content'][
                'max_last_publications_level_2']
        if self.kwargs.get('slug_category', False):
            self.level = 3
            self.max_last_contents = settings.ZDS_APP['content'][
                'max_last_publications_level_3']
        if self.request.GET.get('category', False) or \
                self.request.GET.get('subcategory', False) or \
                self.request.GET.get('type', False) or \
                self.request.GET.get('tag', False):
            self.level = 4
            self.max_last_contents = 50

        self.template_name = self.templates[self.level]
        recent_kwargs = {}

        if self.level is 1:
            # get categories and subcategories
            categories = ViewPublications.categories_with_contents_count(
                self.handle_types)

            context['categories'] = categories
            context['content_count'] = PublishedContent.objects \
                .last_contents(content_type=self.handle_types, with_comments_count=False) \
                .count()

        elif self.level is 2:
            context['category'] = get_object_or_404(
                Category, slug=self.kwargs.get('slug'))
            context[
                'subcategories'] = ViewPublications.subcategories_with_contents_count(
                    context['category'], self.handle_types)
            recent_kwargs['subcategories'] = context['subcategories']

        elif self.level is 3:
            subcategory = get_object_or_404(SubCategory,
                                            slug=self.kwargs.get('slug'))
            context['category'] = subcategory.get_parent_category()

            if context['category'].slug != self.kwargs.get('slug_category'):
                raise Http404('wrong slug for category ({} != {})'.format(
                    context['category'].slug,
                    self.kwargs.get('slug_category')))

            context['subcategory'] = subcategory
            recent_kwargs['subcategories'] = [subcategory]

        elif self.level is 4:
            category = self.request.GET.get('category', None)
            subcategory = self.request.GET.get('subcategory', None)
            subcategories = None
            if category is not None:
                context['category'] = get_object_or_404(Category,
                                                        slug=category)
                subcategories = context['category'].get_subcategories()
            elif subcategory is not None:
                subcategory = get_object_or_404(
                    SubCategory, slug=self.request.GET.get('subcategory'))
                context['category'] = subcategory.get_parent_category()
                context['subcategory'] = subcategory
                subcategories = [subcategory]

            content_type = self.handle_types
            context['type'] = None
            if 'type' in self.request.GET:
                _type = self.request.GET.get('type', '').upper()
                if _type in self.handle_types:
                    content_type = _type
                    context['type'] = TYPE_CHOICES_DICT[_type]
                else:
                    raise Http404('wrong type {}'.format(_type))

            tag = self.request.GET.get('tag', None)
            tags = None
            if tag is not None:
                tags = [get_object_or_404(Tag, slug=tag)]
                context['tag'] = tags[0]

            contents_queryset = PublishedContent.objects.last_contents(
                subcategories=subcategories,
                tags=tags,
                content_type=content_type)
            items_per_page = settings.ZDS_APP['content']['content_per_page']
            make_pagination(context,
                            self.request,
                            contents_queryset,
                            items_per_page,
                            context_list_name='filtered_contents',
                            with_previous_item=False)

        if self.level < 4:
            last_articles = PublishedContent.objects.last_contents(
                **dict(content_type='ARTICLE', **recent_kwargs))
            context['last_articles'] = last_articles[:self.max_last_contents]
            context['more_articles'] = last_articles.count(
            ) > self.max_last_contents

            last_tutorials = PublishedContent.objects.last_contents(
                **dict(content_type='TUTORIAL', **recent_kwargs))
            context['last_tutorials'] = last_tutorials[:self.max_last_contents]
            context['more_tutorials'] = last_tutorials.count(
            ) > self.max_last_contents

            context['beta_forum'] = Forum.objects\
                .prefetch_related('category')\
                .filter(pk=settings.ZDS_APP['forum']['beta_forum_id'])\
                .last()

        context['level'] = self.level
        return context
예제 #5
0
파일: lists.py 프로젝트: leroivi/zds-site
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        if self.kwargs.get("slug", False):
            self.level = 2
            self.max_last_contents = settings.ZDS_APP["content"][
                "max_last_publications_level_2"]
        if self.kwargs.get("slug_category", False):
            self.level = 3
            self.max_last_contents = settings.ZDS_APP["content"][
                "max_last_publications_level_3"]
        if (self.request.GET.get("category", False)
                or self.request.GET.get("subcategory", False)
                or self.request.GET.get("type", False)
                or self.request.GET.get("tag", False)):
            self.level = 4
            self.max_last_contents = 50

        self.template_name = self.templates[self.level]
        recent_kwargs = {}

        if self.level == 1:
            # get categories and subcategories
            categories = ViewPublications.categories_with_contents_count(
                self.handle_types)

            context["categories"] = categories
            context["content_count"] = PublishedContent.objects.last_contents(
                content_type=self.handle_types,
                with_comments_count=False).count()

        elif self.level == 2:
            context["category"] = get_object_or_404(
                Category, slug=self.kwargs.get("slug"))
            context[
                "subcategories"] = ViewPublications.subcategories_with_contents_count(
                    context["category"], self.handle_types)
            recent_kwargs["subcategories"] = context["subcategories"]

        elif self.level == 3:
            subcategory = get_object_or_404(SubCategory,
                                            slug=self.kwargs.get("slug"))
            context["category"] = subcategory.get_parent_category()

            if context["category"].slug != self.kwargs.get("slug_category"):
                raise Http404("wrong slug for category ({} != {})".format(
                    context["category"].slug,
                    self.kwargs.get("slug_category")))

            context["subcategory"] = subcategory
            recent_kwargs["subcategories"] = [subcategory]

        elif self.level == 4:
            category = self.request.GET.get("category", None)
            subcategory = self.request.GET.get("subcategory", None)
            subcategories = None
            if category is not None:
                context["category"] = get_object_or_404(Category,
                                                        slug=category)
                subcategories = context["category"].get_subcategories()
            elif subcategory is not None:
                subcategory = get_object_or_404(
                    SubCategory, slug=self.request.GET.get("subcategory"))
                context["category"] = subcategory.get_parent_category()
                context["subcategory"] = subcategory
                subcategories = [subcategory]

            content_type = self.handle_types
            context["type"] = None
            if "type" in self.request.GET:
                _type = self.request.GET.get("type", "").upper()
                if _type in self.handle_types:
                    content_type = _type
                    context["type"] = TYPE_CHOICES_DICT[_type]
                else:
                    raise Http404(f"wrong type {_type}")

            tag = self.request.GET.get("tag", None)
            tags = None
            if tag is not None:
                tags = [get_object_or_404(Tag, slug=slugify(tag))]
                context["tag"] = tags[0]

            contents_queryset = PublishedContent.objects.last_contents(
                subcategories=subcategories,
                tags=tags,
                content_type=content_type)
            items_per_page = settings.ZDS_APP["content"]["content_per_page"]
            make_pagination(
                context,
                self.request,
                contents_queryset,
                items_per_page,
                context_list_name="filtered_contents",
                with_previous_item=False,
            )

        if self.level < 4:
            last_articles = PublishedContent.objects.last_contents(
                **dict(content_type="ARTICLE", **recent_kwargs))
            context["last_articles"] = last_articles[:self.max_last_contents]
            context["more_articles"] = last_articles.count(
            ) > self.max_last_contents

            last_tutorials = PublishedContent.objects.last_contents(
                **dict(content_type="TUTORIAL", **recent_kwargs))
            context["last_tutorials"] = last_tutorials[:self.max_last_contents]
            context["more_tutorials"] = last_tutorials.count(
            ) > self.max_last_contents

            context["beta_forum"] = (
                Forum.objects.prefetch_related("category").filter(
                    pk=settings.ZDS_APP["forum"]["beta_forum_id"]).last())

        context["level"] = self.level
        return context
예제 #6
0
    def get_context_data(self, **kwargs):
        """Show the given tutorial if exists."""
        context = super(DisplayOnlineContent, self).get_context_data(**kwargs)

        if context['is_staff']:
            context['formRevokeValidation'] = RevokeValidationForm(
                self.versioned_object,
                initial={'version': self.versioned_object.sha_public})

        context['formWarnTypo'] = WarnTypoForm(self.versioned_object,
                                               self.versioned_object)

        queryset_reactions = ContentReaction.objects\
            .select_related('author')\
            .select_related('author__profile')\
            .select_related('editor')\
            .prefetch_related('alerts')\
            .prefetch_related('alerts__author')\
            .filter(related_content__pk=self.object.pk)\
            .order_by("pubdate")

        # pagination of articles
        context['paginate_articles'] = False

        if self.object.type == 'ARTICLE':
            # fetch all articles in order to find the previous and the next one
            all_articles = \
                [a for a in PublishedContent.objects
                    .filter(content_type="ARTICLE", must_redirect=False)
                    .order_by('publication_date')
                    .all()]
            articles_count = len(all_articles)

            try:
                position = all_articles.index(self.public_content_object)
            except ValueError:
                pass  # for an unknown reason, the article is not in the list. This should not happen
            else:
                context['paginate_articles'] = True
                context['previous_article'] = None
                context['next_article'] = None

                if position > 0:
                    context['previous_article'] = all_articles[position - 1]
                if position < articles_count - 1:
                    context['next_article'] = all_articles[position + 1]

        # pagination of comments
        make_pagination(context,
                        self.request,
                        queryset_reactions,
                        settings.ZDS_APP['content']['notes_per_page'],
                        context_list_name='reactions',
                        with_previous_item=True)

        # is JS activated ?
        context["is_js"] = True
        if not self.object.js_support:
            context["is_js"] = False

        # optimize requests:

        context["user_dislike"] = CommentDislike.objects\
            .select_related('note')\
            .filter(user__pk=self.request.user.pk, comments__in=context['reactions'])\
            .values_list('comments__pk', flat=True)
        context["user_like"] = CommentLike.objects\
            .select_related('note')\
            .filter(user__pk=self.request.user.pk, comments__in=context['reactions'])\
            .values_list('comments__pk', flat=True)

        if self.request.user.has_perm('tutorialv2.change_contentreaction'):
            context["user_can_modify"] = [
                reaction.pk for reaction in context['reactions']
            ]
        else:
            queryset_reactions_user = ContentReaction.objects\
                .filter(author__pk=self.request.user.pk, related_content__pk=self.object.pk)\
                .values_list('id', flat=True)
            context["user_can_modify"] = queryset_reactions_user

        context['isantispam'] = self.object.antispam()

        # handle reactions:
        if last_participation_is_old(self.object, self.request.user):
            mark_read(self.object)

        return context
예제 #7
0
    def get_context_data(self, **kwargs):
        """Show the given tutorial if exists."""
        context = super(DisplayOnlineContent, self).get_context_data(**kwargs)

        if context["is_staff"]:
            if self.current_content_type == "OPINION":
                context["alerts"] = self.object.alerts_on_this_content.all()
            context["formRevokeValidation"] = RevokeValidationForm(
                self.versioned_object,
                initial={"version": self.versioned_object.sha_public})
            context["formUnpublication"] = UnpublicationForm(
                self.versioned_object,
                initial={"version": self.versioned_object.sha_public})

        context["formWarnTypo"] = WarnTypoForm(self.versioned_object,
                                               self.versioned_object)

        queryset_reactions = (
            ContentReaction.objects.select_related("author").select_related(
                "author__profile").select_related("hat").select_related(
                    "editor").prefetch_related("alerts_on_this_comment").
            prefetch_related("alerts_on_this_comment__author").filter(
                related_content__pk=self.object.pk).order_by("pubdate"))

        # pagination of articles and opinions
        context["previous_content"] = None
        context["next_content"] = None

        if self.current_content_type in ("ARTICLE", "OPINION"):
            queryset_pagination = PublishedContent.objects.filter(
                content_type=self.current_content_type, must_redirect=False)

            context["previous_content"] = (queryset_pagination.filter(
                publication_date__lt=self.public_content_object.
                publication_date).order_by("-publication_date").first())
            context["next_content"] = (queryset_pagination.filter(
                publication_date__gt=self.public_content_object.
                publication_date).order_by("publication_date").first())

        if self.versioned_object.type == "OPINION":
            context["formPickOpinion"] = PickOpinionForm(
                self.versioned_object,
                initial={"version": self.versioned_object.sha_public})
            context["formUnpickOpinion"] = UnpickOpinionForm(
                self.versioned_object,
                initial={"version": self.versioned_object.sha_public})
            context["formConvertOpinion"] = PromoteOpinionToArticleForm(
                self.versioned_object,
                initial={"version": self.versioned_object.sha_public})
        else:
            context["content_suggestions"] = ContentSuggestion.objects.filter(
                publication=self.object)
            excluded_for_search = [
                str(x.suggestion.pk) for x in context["content_suggestions"]
            ]
            excluded_for_search.append(str(self.object.pk))
            context["formAddSuggestion"] = SearchSuggestionForm(
                content=self.object,
                initial={"excluded_pk": ",".join(excluded_for_search)})

        context["form_edit_tags"] = EditContentTagsForm(
            self.versioned_object, self.object)

        # pagination of comments
        make_pagination(
            context,
            self.request,
            queryset_reactions,
            settings.ZDS_APP["content"]["notes_per_page"],
            context_list_name="reactions",
            with_previous_item=True,
        )

        # is JS activated ?
        context["is_js"] = True
        if not self.object.js_support:
            context["is_js"] = False

        # optimize requests:
        votes = CommentVote.objects.filter(
            user_id=self.request.user.id,
            comment__in=queryset_reactions).all()
        context["user_like"] = [
            vote.comment_id for vote in votes if vote.positive
        ]
        context["user_dislike"] = [
            vote.comment_id for vote in votes if not vote.positive
        ]

        if self.request.user.has_perm("tutorialv2.change_contentreaction"):
            context["user_can_modify"] = [
                reaction.pk for reaction in queryset_reactions
            ]
        else:
            context["user_can_modify"] = [
                reaction.pk for reaction in queryset_reactions
                if reaction.author == self.request.user
            ]

        context["is_antispam"] = self.object.antispam()
        context["pm_link"] = self.object.get_absolute_contact_url(
            _("À propos de"))
        context[
            "subscriber_count"] = ContentReactionAnswerSubscription.objects.get_subscriptions(
                self.object).count()
        # We need reading time expressed in minutes
        try:
            char_count = self.object.public_version.char_count
            if char_count:
                context["reading_time"] = int(
                    self.versioned_object.get_tree_level() * char_count /
                    settings.ZDS_APP["content"]["characters_per_minute"])
        except ZeroDivisionError as e:
            logger.warning(
                "could not compute reading time: setting characters_per_minute is set to zero (error=%s)",
                e)

        if self.request.user.is_authenticated:
            for reaction in context["reactions"]:
                signals.content_read.send(sender=reaction.__class__,
                                          instance=reaction,
                                          user=self.request.user)
            signals.content_read.send(sender=self.object.__class__,
                                      instance=self.object,
                                      user=self.request.user,
                                      target=PublishableContent)
        if last_participation_is_old(self.object, self.request.user):
            mark_read(self.object, self.request.user)

        context["contributions"] = ContentContribution.objects.filter(
            content=self.object).order_by("contribution_role__position")
        context[
            "content_suggestions_random"] = ContentSuggestion.objects.filter(
                publication=self.object).order_by(
                    "?")[:settings.ZDS_APP["content"]["suggestions_per_page"]]

        return context
예제 #8
0
    def get_context_data(self, **kwargs):
        """Show the given tutorial if exists."""
        context = super(DisplayOnlineContent, self).get_context_data(**kwargs)

        if context['is_staff']:
            context['formRevokeValidation'] = RevokeValidationForm(
                self.versioned_object, initial={'version': self.versioned_object.sha_public})

        context['formWarnTypo'] = WarnTypoForm(self.versioned_object, self.versioned_object)

        queryset_reactions = ContentReaction.objects\
            .select_related('author')\
            .select_related('author__profile')\
            .select_related('editor')\
            .prefetch_related('alerts')\
            .prefetch_related('alerts__author')\
            .filter(related_content__pk=self.object.pk)\
            .order_by("pubdate")

        # pagination of articles
        context['paginate_articles'] = False

        if self.object.type == 'ARTICLE':
            # fetch all articles in order to find the previous and the next one
            all_articles = \
                [a for a in PublishedContent.objects
                    .filter(content_type="ARTICLE", must_redirect=False)
                    .order_by('publication_date')
                    .all()]
            articles_count = len(all_articles)

            try:
                position = all_articles.index(self.public_content_object)
            except ValueError:
                pass  # for an unknown reason, the article is not in the list. This should not happen
            else:
                context['paginate_articles'] = True
                context['previous_article'] = None
                context['next_article'] = None

                if position > 0:
                    context['previous_article'] = all_articles[position - 1]
                if position < articles_count - 1:
                    context['next_article'] = all_articles[position + 1]

        # pagination of comments
        make_pagination(context,
                        self.request,
                        queryset_reactions,
                        settings.ZDS_APP['content']['notes_per_page'],
                        context_list_name='reactions',
                        with_previous_item=True)

        # is JS activated ?
        context["is_js"] = True
        if not self.object.js_support:
            context["is_js"] = False

        # optimize requests:
        votes = CommentVote.objects.filter(user_id=self.request.user.id, comment__in=queryset_reactions).all()
        context["user_like"] = [vote.comment_id for vote in votes if vote.positive]
        context["user_dislike"] = [vote.comment_id for vote in votes if not vote.positive]

        if self.request.user.has_perm('tutorialv2.change_contentreaction'):
            context["user_can_modify"] = [reaction.pk for reaction in queryset_reactions]
        else:
            context["user_can_modify"] = [reaction.pk for reaction in queryset_reactions
                                          if reaction.author == self.request.user]

        context['isantispam'] = self.object.antispam()
        context['pm_link'] = self.object.get_absolute_contact_url(_(u'À propos de'))
        context['subscriber_count'] = ContentReactionAnswerSubscription.objects.get_subscriptions(self.object).count()

        if self.request.user.is_authenticated():
            for reaction in context['reactions']:
                signals.content_read.send(sender=reaction.__class__, instance=reaction, user=self.request.user)
            signals.content_read.send(
                sender=self.object.__class__, instance=self.object, user=self.request.user, target=PublishableContent)
        if last_participation_is_old(self.object, self.request.user):
            mark_read(self.object, self.request.user)

        return context