SciPost Code Repository

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

First implementation of full stack for forums

parent abb2918d
No related branches found
No related tags found
No related merge requests found
......@@ -124,6 +124,9 @@ class Post(models.Model):
def __str__(self):
return '%s: %s' % (self.posted_by, self.subject[:32])
def get_absolute_url(self):
return '%s#post%s' % (self.get_forum().get_absolute_url(), self.id)
@property
def nr_followups(self):
nr = 0
......@@ -139,3 +142,14 @@ class Post(models.Model):
id_list += post.posts_hierarchy_id_list()
print ('post %s id_list: %s' % (self.id, id_list))
return id_list
def get_forum(self):
"""
Climb back the hierarchy up to the original Forum.
If no Forum is found, return None.
"""
type_forum = ContentType.objects.get_by_natural_key('forums', 'forum')
if self.parent_content_type == type_forum:
return self.parent
else:
return self.parent.get_forum()
......@@ -55,11 +55,11 @@
{% endif %}
{% for post in forum.posts.all %}
{% include 'forums/post_card.html' with post=post %}
{% include 'forums/post_card.html' with forum=forum post=post %}
{% endfor %}
<p>
<a href="{% url 'forums:post_create' parent_model='forum' parent_id=forum.id %}">Add a Post</a>
<a href="{% url 'forums:post_create' slug=forum.slug parent_model='forum' parent_id=forum.id %}">Add a Post</a>
</p>
</div>
......
<div class="card">
<div class="card" id="post{{ post.id }}">
<div class="card-header">
{{ post.subject }}
<div class="postInfo">
{{ post.posted_by }} on {{ post.posted_on|date:"Y-m-d" }}
- <a href="{{ post.get_absolute_url }}"><i class="fa fa-link" title="permalink to this Post"></i></a>
{% if post.parent %}
- regarding <a href="{{ post.parent.get_absolute_url }}">{{ post.parent }}</a>
{% endif %}
......@@ -14,7 +15,7 @@
</p>
</div>
<div class="card-footer">
<a href="{% url 'forums:post_create' 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>
{% if post.followup_posts.all|length > 0 %}
<div class="followupPosts">
......
......@@ -38,7 +38,7 @@ urlpatterns = [
name='forums'
),
url(
r'^post/(?P<parent_model>[a-z]+)/(?P<parent_id>[0-9]+)/add/$',
r'(?P<slug>[\w-]+)/post/(?P<parent_model>[a-z]+)/(?P<parent_id>[0-9]+)/add/$',
views.PostCreateView.as_view(),
name='post_create'
),
......
......@@ -3,15 +3,17 @@ __license__ = "AGPL v3"
from django.contrib.auth.models import Group
from django.contrib.auth.mixins import UserPassesTestMixin
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse_lazy
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.utils import timezone
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView
from django.views.generic.list import ListView
from guardian.decorators import permission_required_or_403
from guardian.mixins import PermissionRequiredMixin
from guardian.shortcuts import (assign_perm, remove_perm,
get_objects_for_user, get_perms, get_users_with_perms, get_groups_with_perms)
......@@ -32,6 +34,7 @@ class ForumCreateView(PermissionsMixin, CreateView):
def get_initial(self):
initial = super().get_initial()
parent_model = self.kwargs.get('parent_model')
parent_content_type = None
parent_object_id = self.kwargs.get('parent_id')
if parent_model == 'forum':
parent_content_type = ContentType.objects.get(app_label='forums', model='forum')
......@@ -104,10 +107,19 @@ class ForumListView(ListView):
return queryset
class PostCreateView(CreateView):
class PostCreateView(UserPassesTestMixin, CreateView):
model = Post
form_class= PostForm
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')
......@@ -119,6 +131,8 @@ class PostCreateView(CreateView):
parent_content_type = ContentType.objects.get(app_label='forums', model='post')
parent = parent_content_type.get_object_for_this_type(pk=parent_object_id)
subject = 'Reply to %s' % parent.subject
else:
raise Http404
initial.update({
'posted_by': self.request.user,
'posted_on': timezone.now(),
......@@ -129,4 +143,4 @@ class PostCreateView(CreateView):
return initial
def get_success_url(self):
return reverse_lazy('forums:forums')
return self.object.get_absolute_url()
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