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
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
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
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
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
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)