SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 13a926f4 authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

First working version of Post creation through confirmation

parent d5ace481
No related branches found
No related tags found
No related merge requests found
...@@ -58,3 +58,16 @@ class PostForm(forms.ModelForm): ...@@ -58,3 +58,16 @@ class PostForm(forms.ModelForm):
self.fields['needs_vetting'].widget = forms.HiddenInput() self.fields['needs_vetting'].widget = forms.HiddenInput()
self.fields['parent_content_type'].widget = forms.HiddenInput() self.fields['parent_content_type'].widget = forms.HiddenInput()
self.fields['parent_object_id'].widget = forms.HiddenInput() self.fields['parent_object_id'].widget = forms.HiddenInput()
class PostFormHidden(PostForm):
class Meta:
model = Post
fields = ['posted_by', 'posted_on', 'needs_vetting',
'parent_content_type', 'parent_object_id',
'subject', 'text']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['subject'].widget = forms.HiddenInput()
self.fields['text'].widget = forms.HiddenInput()
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
<div class="card"> <div class="card">
<div class="card-header d-flex justify-content-between"> <div class="card-header d-flex justify-content-between">
<a href="{{ forum.get_absolute_url }}">{{ forum }}</a> <a href="{{ forum.get_absolute_url }}">{{ forum }}</a>
<span class="badge badge-primary badge-pill">{{ forum.nr_posts }} posts</span> <span class="badge badge-primary badge-pill">{{ forum.nr_posts }} post{{ forum.nr_posts|pluralize }}</span>
</div> </div>
<div class="card-body"> <div class="card-body">
Forum description Forum description
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
{{ post.text|restructuredtext }} {{ post.text|restructuredtext }}
</div> </div>
<div class="card-footer"> <div class="card-footer">
{% if post.followup_posts.all|length > 0 %}
<span class="badge badge-primary badge-pill">{% with nr_followups=post.nr_followups %}{{ nr_followups }} repl{{ nr_followups|pluralize:"y,ies" }}{% endwith %}</span>
{% endif %}&nbsp;
<a href="{% url 'forums:post_create' slug=forum.slug parent_model='post' parent_id=post.id %}">Reply to this post</a> <a href="{% url 'forums:post_create' slug=forum.slug parent_model='post' parent_id=post.id %}">Reply to this post</a>
</div> </div>
{% if post.followup_posts.all|length > 0 %} {% if post.followup_posts.all|length > 0 %}
<div class="followupPosts"> <div class="followupPosts">
<h3><span class="badge badge-primary badge-pill">{% with nr_followups=post.nr_followups %}{{ nr_followups }} repl{{ nr_followups|pluralize:"y,ies" }}{% endwith %}</span></h3>
{% for followup in post.followup_posts.all %} {% for followup in post.followup_posts.all %}
{% include 'forums/post_card.html' with post=followup %} {% include 'forums/post_card.html' with post=followup %}
{% endfor %} {% endfor %}
......
{% extends 'forums/base.html' %}
{% load bootstrap %}
{% load restructuredtext %}
{% block breadcrumb_items %}
{{ block.super }}
<span class="breadcrumb-item">Confirm Post creation</span>
{% endblock %}
{% block pagetitle %}: Post: confirm creation{% endblock pagetitle %}
{% block content %}
<div class="row">
<div class="col-12">
<h3 class="highlight">Preview</h3>
<div class="card">
<div class="card-header">
{{ form.initial.subject }}
</div>
<div class="card-body">
{% if form.initial.text %}
{{ form.initial.text|restructuredtext }}
{% else %}
<span class="text-danger">No text given</span>
{% endif %}
</div>
</div>
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger">
<strong>{{ field.name }} - {{ error|escape }}</strong>
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endif %}
<form action="" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" value="Confirm Post creation" class="btn btn-primary">
<span class="text-danger">Not happy? Hit your browser's back button and redraft your Post</span>
</form>
</div>
</div>
{% endblock content %}
{% extends 'forums/base.html' %} {% extends 'forums/base.html' %}
{% load bootstrap %} {% load bootstrap %}
{% load restructuredtext %}
{% block breadcrumb_items %} {% block breadcrumb_items %}
{{ block.super }} {{ block.super }}
...@@ -13,10 +15,12 @@ ...@@ -13,10 +15,12 @@
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<h3 class="highlight">Compose a new Post</h3>
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<input type="submit" value="Submit" class="btn btn-primary"> <input type="submit" value="Run preview" class="btn btn-primary">
</form>
</div> </div>
</div> </div>
......
...@@ -47,4 +47,9 @@ urlpatterns = [ ...@@ -47,4 +47,9 @@ urlpatterns = [
views.PostCreateView.as_view(), views.PostCreateView.as_view(),
name='post_create' name='post_create'
), ),
url(
r'(?P<slug>[\w-]+)/post/(?P<parent_model>[a-z]+)/(?P<parent_id>[0-9]+)/add/confirm/$',
views.PostConfirmCreateView.as_view(),
name='post_confirm_create'
),
] ]
...@@ -4,12 +4,12 @@ __license__ = "AGPL v3" ...@@ -4,12 +4,12 @@ __license__ = "AGPL v3"
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.auth.mixins import UserPassesTestMixin from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse_lazy
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse, reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.views.generic.edit import CreateView, UpdateView, DeleteView
...@@ -20,7 +20,8 @@ from guardian.shortcuts import (assign_perm, remove_perm, ...@@ -20,7 +20,8 @@ from guardian.shortcuts import (assign_perm, remove_perm,
get_objects_for_user, get_perms, get_users_with_perms, get_groups_with_perms) get_objects_for_user, get_perms, get_users_with_perms, get_groups_with_perms)
from .models import Forum, Post from .models import Forum, Post
from .forms import ForumForm, ForumGroupPermissionsForm, ForumOrganizationPermissionsForm, PostForm from .forms import (ForumForm, ForumGroupPermissionsForm, ForumOrganizationPermissionsForm,
PostForm, PostFormHidden)
from scipost.mixins import PermissionsMixin from scipost.mixins import PermissionsMixin
...@@ -121,7 +122,7 @@ class ForumPermissionsView(PermissionRequiredMixin, UpdateView): ...@@ -121,7 +122,7 @@ class ForumPermissionsView(PermissionRequiredMixin, UpdateView):
return super().form_valid(form) return super().form_valid(form)
class ForumListView(ListView): class ForumListView(LoginRequiredMixin, ListView):
model = Forum model = Forum
template_name = 'forum_list.html' template_name = 'forum_list.html'
...@@ -165,5 +166,48 @@ class PostCreateView(UserPassesTestMixin, CreateView): ...@@ -165,5 +166,48 @@ class PostCreateView(UserPassesTestMixin, CreateView):
}) })
return initial return initial
def get_success_url(self): def form_valid(self, form):
return self.object.get_absolute_url() """
Save the form data to session variables only, redirect to confirmation view.
"""
self.request.session['post_subject'] = form.cleaned_data['subject']
self.request.session['post_text'] = form.cleaned_data['text']
return redirect(reverse('forums:post_confirm_create',
kwargs={'slug': self.kwargs.get('slug'),
'parent_model': self.kwargs.get('parent_model'),
'parent_id': self.kwargs.get('parent_id')}))
class PostConfirmCreateView(UserPassesTestMixin, CreateView):
form_class = PostFormHidden
template_name = 'forums/post_confirm_create.html'
def test_func(self):
if self.request.user.has_perm('forums.add_forum'):
return True
forum = get_object_or_404(Forum, slug=self.kwargs.get('slug'))
if self.request.user.has_perm('can_post_to_forum', forum):
return True
else:
raise PermissionDenied
def get_initial(self, *args, **kwargs):
initial = super().get_initial(*args, **kwargs)
parent_model = self.kwargs.get('parent_model')
parent_object_id = self.kwargs.get('parent_id')
if parent_model == 'forum':
parent_content_type = ContentType.objects.get(app_label='forums', model='forum')
elif parent_model == 'post':
parent_content_type = ContentType.objects.get(app_label='forums', model='post')
parent = parent_content_type.get_object_for_this_type(pk=parent_object_id)
else:
raise Http404
initial.update({
'posted_by': self.request.user,
'posted_on': timezone.now(),
'parent_content_type': parent_content_type,
'parent_object_id': parent_object_id,
'subject': self.request.session['post_subject'],
'text': self.request.session['post_text'],
})
return initial
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment