Exemplo n.º 1
0
    def _create_beta_topic(self, msg, beta_version, _type, tags):
        topic_title = beta_version.title
        _tags = "[beta][{}]".format(_type)
        i = 0
        max_len = Topic._meta.get_field("title").max_length

        while i < len(tags) and len(topic_title) + len(_tags) + len(
                tags[i].title) + 2 < max_len:
            _tags += "[{}]".format(tags[i])
            i += 1
        forum = get_object_or_404(
            Forum, pk=settings.ZDS_APP["forum"]["beta_forum_id"])
        topic = create_topic(
            request=self.request,
            author=self.request.user,
            forum=forum,
            title=topic_title,
            subtitle="{}".format(beta_version.description),
            text=msg,
            related_publishable_content=self.object,
        )
        topic.save()
        # make all authors follow the topic:
        for author in self.object.authors.all():
            TopicAnswerSubscription.objects.get_or_create_active(author, topic)
            mark_read(topic, author)

        return topic
Exemplo n.º 2
0
    def get_context_data(self, **kwargs):
        context = super(TopicPostsListView, self).get_context_data(**kwargs)
        form = PostForm(self.object, self.request.user)
        form.helper.form_action = reverse('post-new') + "?sujet=" + str(
            self.object.pk)

        context.update({
            'topic':
            self.object,
            'posts':
            self.build_list_with_previous_item(context['object_list']),
            'last_post_pk':
            self.object.last_message.pk,
            'form':
            form,
            'form_move':
            MoveTopicForm(topic=self.object),
        })
        reaction_ids = [post.pk for post in context['posts']]
        context["user_dislike"] = CommentDislike.objects\
            .select_related('comment')\
            .filter(user__pk=self.request.user.pk, comments__pk__in=reaction_ids)\
            .values_list('pk', flat=True)
        context["user_like"] = CommentLike.objects\
            .select_related('comment')\
            .filter(user__pk=self.request.user.pk, comments__pk__in=reaction_ids)\
            .values_list('pk', flat=True)
        context["is_staff"] = self.request.user.has_perm('forum.change_topic')
        if self.request.user.is_authenticated():
            if never_read(self.object):
                mark_read(self.object)
        return context
Exemplo n.º 3
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        form = PostForm(self.object, self.request.user)
        form.helper.form_action = reverse("post-new") + "?sujet=" + str(
            self.object.pk)

        posts = self.build_list_with_previous_item(context["object_list"])
        context.update({
            "topic": self.object,
            "posts": posts,
            "last_post_pk": self.object.last_message.pk,
            "form": form,
            "form_move": MoveTopicForm(topic=self.object),
        })

        votes = CommentVote.objects.filter(user_id=self.request.user.pk,
                                           comment__in=context["posts"]).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
        ]
        context["is_staff"] = self.request.user.has_perm("forum.change_topic")
        context["is_antispam"] = self.object.antispam()
        context[
            "subscriber_count"] = TopicAnswerSubscription.objects.get_subscriptions(
                self.object).count()
        if hasattr(self.request.user, "profile"):
            context["is_dev"] = self.request.user.profile.is_dev()
            context["has_token"] = self.request.user.profile.github_token != ""
            context["repositories"] = settings.ZDS_APP["github_projects"][
                "repositories"]

        if self.request.user.has_perm("forum.change_topic"):
            context["user_can_modify"] = [post.pk for post in context["posts"]]
        else:
            context["user_can_modify"] = [
                post.pk for post in context["posts"]
                if post.author == self.request.user
            ]

        if self.request.user.is_authenticated:
            if len(posts) > 0:
                signals.post_read.send(sender=posts[0].__class__,
                                       instances=posts,
                                       user=self.request.user)
            if not self.object.is_read:
                mark_read(self.object)
        return context
Exemplo n.º 4
0
    def get_context_data(self, **kwargs):
        context = super(TopicPostsListView, self).get_context_data(**kwargs)
        form = PostForm(self.object, self.request.user)
        form.helper.form_action = reverse('post-new') + '?sujet=' + str(
            self.object.pk)

        posts = self.build_list_with_previous_item(context['object_list'])
        context.update({
            'topic': self.object,
            'posts': posts,
            'last_post_pk': self.object.last_message.pk,
            'form': form,
            'form_move': MoveTopicForm(topic=self.object),
        })

        votes = CommentVote.objects.filter(user_id=self.request.user.pk,
                                           comment__in=context['posts']).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
        ]
        context['is_staff'] = self.request.user.has_perm('forum.change_topic')
        context['isantispam'] = self.object.antispam()
        context[
            'subscriber_count'] = TopicAnswerSubscription.objects.get_subscriptions(
                self.object).count()
        if hasattr(self.request.user, 'profile'):
            context['is_dev'] = self.request.user.profile.is_dev()
            context['tags'] = settings.ZDS_APP['site']['repository']['tags']
            context['has_token'] = self.request.user.profile.github_token != ''

        if self.request.user.has_perm('forum.change_topic'):
            context['user_can_modify'] = [post.pk for post in context['posts']]
        else:
            context['user_can_modify'] = [
                post.pk for post in context['posts']
                if post.author == self.request.user
            ]

        if self.request.user.is_authenticated():
            for post in posts:
                signals.content_read.send(sender=post.__class__,
                                          instance=post,
                                          user=self.request.user)
            if not is_read(self.object):
                mark_read(self.object)
        return context
Exemplo n.º 5
0
    def get_context_data(self, **kwargs):
        context = super(TopicPostsListView, self).get_context_data(**kwargs)
        form = PostForm(self.object, self.request.user)
        form.helper.form_action = reverse('post-new') + '?sujet=' + str(self.object.pk)

        posts = self.build_list_with_previous_item(context['object_list'])
        context.update({
            'topic': self.object,
            'posts': posts,
            'last_post_pk': self.object.last_message.pk,
            'form': form,
            'form_move': MoveTopicForm(topic=self.object),
        })

        votes = CommentVote.objects.filter(user_id=self.request.user.pk, comment__in=context['posts']).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]
        context['is_staff'] = self.request.user.has_perm('forum.change_topic')
        context['is_antispam'] = self.object.antispam()
        context['subscriber_count'] = TopicAnswerSubscription.objects.get_subscriptions(self.object).count()
        if hasattr(self.request.user, 'profile'):
            context['is_dev'] = self.request.user.profile.is_dev()
            context['tags'] = settings.ZDS_APP['site']['repository']['tags']
            context['has_token'] = self.request.user.profile.github_token != ''

        if self.request.user.has_perm('forum.change_topic'):
            context['user_can_modify'] = [post.pk for post in context['posts']]
        else:
            context['user_can_modify'] = [post.pk for post in context['posts'] if post.author == self.request.user]

        if self.request.user.is_authenticated():
            for post in posts:
                signals.content_read.send(sender=post.__class__, instance=post, user=self.request.user)
            if not is_read(self.object):
                mark_read(self.object)
        return context
Exemplo n.º 6
0
    def form_valid(self, form):
        beta_version = self.versioned_object
        sha_beta = beta_version.current_version

        # topic of the beta version:
        topic = self.object.beta_topic

        if topic:
            if topic.forum_id != settings.ZDS_APP["forum"]["beta_forum_id"]:
                # if the topic is moved from the beta forum, then a new one is created instead
                topic = None

        _type = self.object.type.lower()
        if _type == "tutorial":
            _type = _("tutoriel")
        elif _type == "opinion":
            raise PermissionDenied

        # perform actions:
        if self.action == "inactive":
            self.object.sha_beta = None

            msg_post = render_to_string(
                "tutorialv2/messages/beta_desactivate.md", {
                    "content": beta_version,
                    "type": _type
                })
            send_post(self.request, topic, self.request.user, msg_post)
            lock_topic(topic)

        elif self.action == "set":
            already_in_beta = self.object.in_beta()
            all_tags = []

            if not already_in_beta or self.object.sha_beta != sha_beta:
                self.object.sha_beta = sha_beta
                self.versioned_object.in_beta = True
                self.versioned_object.sha_beta = sha_beta

                msg = render_to_string(
                    "tutorialv2/messages/beta_activate_topic.md",
                    {
                        "content":
                        beta_version,
                        "type":
                        _type,
                        "url":
                        settings.ZDS_APP["site"]["url"] +
                        self.versioned_object.get_absolute_url_beta(),
                    },
                )

                if not topic:
                    # if first time putting the content in beta, send a message on the forum and a PM

                    # find tags
                    all_tags = self._get_all_tags()
                    topic = self._create_beta_topic(msg, beta_version, _type,
                                                    all_tags)

                    bot = get_object_or_404(
                        User,
                        username=settings.ZDS_APP["member"]["bot_account"])
                    msg_pm = render_to_string(
                        "tutorialv2/messages/beta_activate_pm.md",
                        {
                            "content":
                            beta_version,
                            "type":
                            _type,
                            "url":
                            settings.ZDS_APP["site"]["url"] +
                            topic.get_absolute_url(),
                            "user":
                            self.request.user,
                        },
                    )
                    if not self.object.validation_private_message:
                        self.object.validation_private_message = send_mp(
                            bot,
                            self.object.authors.all(),
                            self.object.validation_message_title,
                            beta_version.title,
                            msg_pm,
                            send_by_mail=False,
                            leave=True,
                            hat=get_hat_from_settings("validation"),
                        )
                        self.object.save()
                    else:
                        send_message_mp(
                            bot,
                            self.object.validation_private_message,
                            msg,
                            hat=get_hat_from_settings("validation"))

                # When the anti-spam triggers (because the author of the
                # message posted themselves within the last 15 minutes),
                # it is likely that we want to avoid to generate a duplicated
                # post that couldn't be deleted. We hence avoid to add another
                # message to the topic.

                else:
                    all_tags = self._get_all_tags()

                    if not already_in_beta:
                        unlock_topic(topic)
                        msg_post = render_to_string(
                            "tutorialv2/messages/beta_reactivate.md",
                            {
                                "content":
                                beta_version,
                                "type":
                                _type,
                                "url":
                                settings.ZDS_APP["site"]["url"] +
                                self.versioned_object.get_absolute_url_beta(),
                            },
                        )
                        topic = send_post(self.request, topic,
                                          self.request.user, msg_post)
                    elif not topic.antispam():
                        msg_post = render_to_string(
                            "tutorialv2/messages/beta_update.md",
                            {
                                "content":
                                beta_version,
                                "type":
                                _type,
                                "url":
                                settings.ZDS_APP["site"]["url"] +
                                self.versioned_object.get_absolute_url_beta(),
                            },
                        )
                        topic = send_post(self.request, topic,
                                          self.request.user, msg_post)

                # make sure that all authors follow the topic:
                for author in self.object.authors.all():
                    TopicAnswerSubscription.objects.get_or_create_active(
                        author, topic)
                    mark_read(topic, author)

            # finally set the tags on the topic
            if topic:
                topic.tags.clear()
                for tag in all_tags:
                    topic.tags.add(tag)
                topic.save()

        self.object.save(
        )  # we should prefer .update but it needs a huge refactoring

        self.success_url = self.versioned_object.get_absolute_url(
            version=sha_beta)

        if self.object.is_beta(sha_beta):
            self.success_url = self.versioned_object.get_absolute_url_beta()

        return super(ManageBetaContent, self).form_valid(form)