diff --git a/machina/apps/forum_conversation/abstract_models.py b/machina/apps/forum_conversation/abstract_models.py index 023033b04..487289f79 100644 --- a/machina/apps/forum_conversation/abstract_models.py +++ b/machina/apps/forum_conversation/abstract_models.py @@ -229,7 +229,9 @@ class AbstractPost(DatedModel): anonymous_key = models.CharField( max_length=100, blank=True, null=True, verbose_name=_('Anonymous user forum key'), ) - + parent = models.ForeignKey( + 'self', related_name='children', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='Reply to post', + ) # Each post can have its own subject. The subject of the thread corresponds to the # one associated with the first post subject = models.CharField(verbose_name=_('Subject'), max_length=255) diff --git a/machina/apps/forum_conversation/forms.py b/machina/apps/forum_conversation/forms.py index 36e266d0a..a2db99077 100644 --- a/machina/apps/forum_conversation/forms.py +++ b/machina/apps/forum_conversation/forms.py @@ -32,12 +32,13 @@ class PostForm(forms.ModelForm): class Meta: model = Post - fields = ['subject', 'content', 'username', 'update_reason', 'enable_signature', ] + fields = ['subject', 'content', 'username', 'update_reason', 'enable_signature', 'parent'] def __init__(self, *args, **kwargs): self.user = kwargs.pop('user', None) self.forum = kwargs.pop('forum', None) self.topic = kwargs.pop('topic', None) + self.parent = kwargs.pop('parent', None) self.perm_handler = PermissionHandler() @@ -47,6 +48,7 @@ def __init__(self, *args, **kwargs): self.fields['subject'].widget.attrs['placeholder'] = _('Enter your subject') self.fields['content'].label = _('Message') self.fields['content'].widget.attrs['placeholder'] = _('Enter your message') + self.fields['parent'].initial = self.parent # Handles anonymous users if self.user and self.user.is_anonymous: @@ -99,6 +101,7 @@ def save(self, commit=True): subject=self.cleaned_data['subject'], approved=self.perm_handler.can_post_without_approval(self.forum, self.user), content=self.cleaned_data['content'], + parent=self.cleaned_data['parent'], enable_signature=self.cleaned_data['enable_signature']) if not self.user.is_anonymous: post.poster = self.user diff --git a/machina/apps/forum_conversation/migrations/0014_add_parent.py b/machina/apps/forum_conversation/migrations/0014_add_parent.py new file mode 100644 index 000000000..df1d2b438 --- /dev/null +++ b/machina/apps/forum_conversation/migrations/0014_add_parent.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.11 on 2022-04-23 15:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('forum_conversation', '0013_auto_20201220_1745'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='forum_conversatin.Post', verbose_name='Parent post'), + ), + ] diff --git a/machina/apps/forum_conversation/views.py b/machina/apps/forum_conversation/views.py index 4d44f0227..9de8badfb 100644 --- a/machina/apps/forum_conversation/views.py +++ b/machina/apps/forum_conversation/views.py @@ -212,6 +212,7 @@ def get_post_form_kwargs(self): 'user': self.request.user, 'forum': self.get_forum(), 'topic': self.get_topic(), + 'parent': self.get_parent_post(), } post = self.get_post() @@ -311,6 +312,15 @@ def get_topic(self): self._topic = get_object_or_404(Topic, pk=pk) return self._topic + def get_parent_post(self): + if 'parent' in self.request.GET: + try: + return Post.objects.get( + pk=self.request.GET['parent']) + except Post.DoesNotExist: + return None + return None + def get_post(self): """ Returns the considered post if applicable. """ pk = self.kwargs.get(self.post_pk_url_kwarg, None) diff --git a/machina/templates/machina/forum_conversation/partials/post_form.html b/machina/templates/machina/forum_conversation/partials/post_form.html index ba51faa0e..47602dfe1 100644 --- a/machina/templates/machina/forum_conversation/partials/post_form.html +++ b/machina/templates/machina/forum_conversation/partials/post_form.html @@ -12,6 +12,7 @@ {% if post_form.username %} {% include "partials/form_field.html" with field=post_form.username %} {% endif %} +{{ post_form.parent.as_hidden }} {% if post_form.update_reason %} {% include "partials/form_field.html" with field=post_form.update_reason %} {% endif %}