diff --git a/lacommunaute/forum_conversation/forms.py b/lacommunaute/forum_conversation/forms.py index ea0f7c229..4f7d36c05 100644 --- a/lacommunaute/forum_conversation/forms.py +++ b/lacommunaute/forum_conversation/forms.py @@ -8,7 +8,18 @@ from lacommunaute.notification.utils import should_not_be_approved -class PostForm(AbstractPostForm): +class UpdatePostMixin: + def update_post(self, post): + if self.user.is_anonymous: + post.username = self.cleaned_data["username"] + if should_not_be_approved(self.cleaned_data["username"]): + post.approved = False + else: + post.updated_by = self.user + post.updates_count = F("updates_count") + 1 + + +class PostForm(UpdatePostMixin, AbstractPostForm): subject = CharField(widget=HiddenInput(), required=False) def create_post(self): @@ -21,17 +32,8 @@ def create_post(self): return post - def update_post(self, post): - if self.user.is_anonymous: - post.username = self.cleaned_data["username"] - if should_not_be_approved(self.cleaned_data["username"]): - post.approved = False - else: - post.updated_by = self.user - post.updates_count = F("updates_count") + 1 - -class TopicForm(AbstractTopicForm): +class TopicForm(UpdatePostMixin, AbstractTopicForm): tags = ModelMultipleChoiceField( label="", queryset=Tag.objects.all(), widget=CheckboxSelectMultiple, required=False ) diff --git a/lacommunaute/forum_conversation/tests/tests_views.py b/lacommunaute/forum_conversation/tests/tests_views.py index f7f45cf62..d509d228b 100644 --- a/lacommunaute/forum_conversation/tests/tests_views.py +++ b/lacommunaute/forum_conversation/tests/tests_views.py @@ -18,7 +18,7 @@ from lacommunaute.forum_conversation.enums import Filters from lacommunaute.forum_conversation.factories import CertifiedPostFactory, PostFactory, TopicFactory from lacommunaute.forum_conversation.forms import PostForm -from lacommunaute.forum_conversation.models import Topic +from lacommunaute.forum_conversation.models import Post, Topic from lacommunaute.forum_conversation.views import PostDeleteView, TopicCreateView from lacommunaute.forum_upvote.factories import UpVoteFactory from lacommunaute.notification.factories import BouncedEmailFactory @@ -237,6 +237,44 @@ def test_selected_tags_are_checked(self): not_checked_box = f'class="form-check-input" type="checkbox" name="tags" value="{tag.id}" >' self.assertContains(response, not_checked_box) + def test_update_by_anonymous_user(self): + response = self.client.post( + reverse( + "forum_conversation:topic_create", + kwargs={ + "forum_slug": self.forum.slug, + "forum_pk": self.forum.pk, + }, + ), + {"subject": "subject", "content": "La communauté", "username": "foo@email.com"}, + ) + post = Post.objects.select_related("topic").get(username="foo@email.com") + topic = post.topic + response = self.client.post( + reverse( + "forum_conversation:topic_update", + kwargs={ + "forum_slug": self.forum.slug, + "forum_pk": self.forum.pk, + "slug": topic.slug, + "pk": topic.pk, + }, + ), + {"subject": "subject", "content": "La communauté", "username": "foo@email.com"}, + ) + self.assertRedirects( + response, + reverse( + "forum_conversation:topic", + kwargs={ + "forum_slug": self.forum.slug, + "forum_pk": self.forum.pk, + "slug": topic.slug, + "pk": topic.pk, + }, + ), + ) + class PostCreateViewTest(TestCase): @classmethod