Commit f89a35b28c768cdae6448bcb8ca827f62fef2c2d
1 parent
10885250
Exists in
master
and in
5 other branches
Add post creation [Issue: #74]
Showing
9 changed files
with
140 additions
and
16 deletions
Show diff stats
courses/templates/subject/form_view_teacher.html
... | ... | @@ -32,16 +32,6 @@ |
32 | 32 | <div class="modal-body"> |
33 | 33 | <section> |
34 | 34 | <div class="forum_topics"></div> |
35 | - <div class="form-group"> | |
36 | - <div class="input-group"> | |
37 | - <textarea type="text" id="addon3a" class="form-control" placeholder="{% trans 'Post a comment...' %}"></textarea> | |
38 | - <span class="input-group-btn"> | |
39 | - <button type="button" class="btn btn-fab btn-fab-mini"> | |
40 | - <i class="material-icons">send</i> | |
41 | - </button> | |
42 | - </span> | |
43 | - </div> | |
44 | - </div> | |
45 | 35 | </section> |
46 | 36 | </div> |
47 | 37 | <div class="modal-footer"> | ... | ... |
forum/forms.py
1 | 1 | from django import forms |
2 | 2 | from django.utils.translation import ugettext_lazy as _ |
3 | -from .models import Forum, PostAnswer | |
3 | +from .models import Forum, Post, PostAnswer | |
4 | 4 | |
5 | 5 | class ForumForm(forms.ModelForm): |
6 | 6 | |
... | ... | @@ -19,6 +19,19 @@ class ForumForm(forms.ModelForm): |
19 | 19 | 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}), |
20 | 20 | } |
21 | 21 | |
22 | +class PostForm(forms.ModelForm): | |
23 | + | |
24 | + class Meta: | |
25 | + model = Post | |
26 | + fields = ('message', 'forum', ) | |
27 | + labels = { | |
28 | + 'message': _('Message') | |
29 | + } | |
30 | + widgets = { | |
31 | + 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}), | |
32 | + 'forum': forms.HiddenInput(), | |
33 | + } | |
34 | + | |
22 | 35 | class PostAnswerForm(forms.ModelForm): |
23 | 36 | |
24 | 37 | class Meta: | ... | ... |
forum/static/js/forum.js
... | ... | @@ -9,6 +9,24 @@ function showForum(url, forum_id) { |
9 | 9 | data: {'forum_id': forum_id}, |
10 | 10 | success: function(data) { |
11 | 11 | $(".forum_topics").html(data); |
12 | + | |
13 | + var frm = $('#form_post'); | |
14 | + frm.submit(function () { | |
15 | + $.ajax({ | |
16 | + type: frm.attr('method'), | |
17 | + url: frm.attr('action'), | |
18 | + data: frm.serialize(), | |
19 | + success: function (data) { | |
20 | + $("#posts_list").append(data); | |
21 | + frm[0].reset(); | |
22 | + }, | |
23 | + error: function(data) { | |
24 | + console.log(frm.serialize()); | |
25 | + console.log('Error'); | |
26 | + } | |
27 | + }); | |
28 | + return false; | |
29 | + }); | |
12 | 30 | } |
13 | 31 | }); |
14 | 32 | ... | ... |
forum/templates/forum/forum_list.html
1 | 1 | {% load i18n permission_tags list_post %} |
2 | +{% load widget_tweaks %} | |
2 | 3 | |
3 | 4 | <div class="comments-list"> |
4 | 5 | <div class="section-heading"> |
... | ... | @@ -8,7 +9,45 @@ |
8 | 9 | </div> |
9 | 10 | </div> |
10 | 11 | |
11 | -{% list_posts request forum %} | |
12 | +<div id="posts_list"> | |
13 | + {% list_posts request forum %} | |
14 | +</div> | |
15 | + | |
16 | +<form id="form_post" method="post" action="{% url 'forum:create_post' %}" enctype="multipart/form-data"> | |
17 | + {% csrf_token %} | |
18 | + {% for field in form %} | |
19 | + {% if field.field.widget.input_type == 'hidden' %} | |
20 | + {% render_field field class='form-control' value=forum.id %} | |
21 | + {% else %} | |
22 | + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | |
23 | + <div class="input-group"> | |
24 | + {% render_field field class='form-control' placeholder="Post a message" %} | |
25 | + <span class="help-block">{{ field.help_text }}</span> | |
26 | + {% if field.errors %} | |
27 | + <div class="row"> | |
28 | + <br /> | |
29 | + <div class="alert alert-danger alert-dismissible" role="alert"> | |
30 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
31 | + <span aria-hidden="true">×</span> | |
32 | + </button> | |
33 | + <ul> | |
34 | + {% for error in field.errors %} | |
35 | + <li>{{ error }}</li> | |
36 | + {% endfor %} | |
37 | + </ul> | |
38 | + </div> | |
39 | + </div> | |
40 | + {% endif %} | |
41 | + <span class="input-group-btn"> | |
42 | + <button type="submit" class="btn btn-fab btn-fab-mini"> | |
43 | + <i class="material-icons">send</i> | |
44 | + </button> | |
45 | + </span> | |
46 | + </div> | |
47 | + </div> | |
48 | + {% endif %} | |
49 | + {% endfor %} | |
50 | +</form> | |
12 | 51 | |
13 | 52 | <!--{% if foruns|length > 0 %} |
14 | 53 | {% for forum in foruns %} | ... | ... |
... | ... | @@ -0,0 +1,30 @@ |
1 | +{% load i18n permission_tags %} | |
2 | + | |
3 | +<div class="row"> | |
4 | + <div id="post_{{ post.id }}" class="col-sm-12 col-xs-12"> | |
5 | + <h3 class="user-name"> | |
6 | + {{ post.user }} | |
7 | + <div class="pull-right"> | |
8 | + <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');"> | |
9 | + <i class="material-icons">reply</i> | |
10 | + </a> | |
11 | + {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} | |
12 | + <div class="btn-group icon-more-horiz"> | |
13 | + <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |
14 | + <i class="material-icons">more_horiz</i> | |
15 | + </a> | |
16 | + <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | |
17 | + <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | |
18 | + <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | |
19 | + </ul> | |
20 | + </div> | |
21 | + {% endif %} | |
22 | + </div> | |
23 | + </h3> | |
24 | + <div class="card-data"> | |
25 | + <p class="comment-date"><i class="fa fa-clock-o"></i> {{ post.post_date }}</p> | |
26 | + </div> | |
27 | + <p class="comment-text">{{ post.message|linebreaks }}</p> | |
28 | + <div class="answer_post"></div> | |
29 | + </div> | |
30 | +</div> | |
0 | 31 | \ No newline at end of file | ... | ... |
forum/templates/post_answers/post_answer_form.html
forum/urls.py
... | ... | @@ -7,6 +7,8 @@ urlpatterns = [ |
7 | 7 | url(r'^$', views.ForumIndex.as_view(), name='index'), |
8 | 8 | url(r'^create$', views.CreateForumView.as_view(), name='create'), |
9 | 9 | url(r'^posts$', views.PostIndex.as_view(), name='posts'), |
10 | + url(r'^create_post$', views.CreatePostView.as_view(), name='create_post'), | |
11 | + url(r'^render+post/([\w_-]+)/$', views.render_post, name='render_post'), | |
10 | 12 | url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'), |
11 | 13 | url(r'^reply_post$', views.CreatePostAnswerView.as_view(), name='reply_post'), |
12 | 14 | ] | ... | ... |
forum/views.py
1 | 1 | from django.shortcuts import render, get_object_or_404 |
2 | -from django.core.urlresolvers import reverse_lazy | |
2 | +from django.core.urlresolvers import reverse, reverse_lazy | |
3 | 3 | from django.utils.translation import ugettext_lazy as _ |
4 | 4 | from django.views import generic |
5 | 5 | from django.contrib.auth.mixins import LoginRequiredMixin |
... | ... | @@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin |
7 | 7 | from .models import Forum, Post, PostAnswer |
8 | 8 | from courses.models import Topic |
9 | 9 | |
10 | -from .forms import ForumForm, PostAnswerForm | |
10 | +from .forms import ForumForm, PostForm, PostAnswerForm | |
11 | 11 | |
12 | 12 | class ForumIndex(LoginRequiredMixin, generic.ListView): |
13 | 13 | login_url = reverse_lazy("core:home") |
... | ... | @@ -20,6 +20,12 @@ class ForumIndex(LoginRequiredMixin, generic.ListView): |
20 | 20 | forum_id = self.request.GET.get('forum_id', 0) |
21 | 21 | |
22 | 22 | context = Forum.objects.get(id = forum_id) |
23 | + | |
24 | + return context | |
25 | + | |
26 | + def get_context_data(self, **kwargs): | |
27 | + context = super(ForumIndex, self).get_context_data(**kwargs) | |
28 | + context['form'] = PostForm() | |
23 | 29 | |
24 | 30 | return context |
25 | 31 | |
... | ... | @@ -43,6 +49,33 @@ class PostIndex(LoginRequiredMixin, generic.ListView): |
43 | 49 | |
44 | 50 | return context |
45 | 51 | |
52 | +class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | |
53 | + login_url = reverse_lazy("core:home") | |
54 | + redirect_field_name = 'next' | |
55 | + | |
56 | + form_class = PostForm | |
57 | + | |
58 | + def form_valid(self, form): | |
59 | + self.object = form.save(commit = False) | |
60 | + self.object.user = self.request.user | |
61 | + | |
62 | + self.object.save() | |
63 | + | |
64 | + return super(CreatePostView, self).form_valid(form) | |
65 | + | |
66 | + def get_success_url(self): | |
67 | + self.success_url = reverse('forum:render_post', args = (self.object.id, )) | |
68 | + | |
69 | + return self.success_url | |
70 | + | |
71 | +def render_post(request, post): | |
72 | + last_post = get_object_or_404(Post, id = post) | |
73 | + | |
74 | + context = {} | |
75 | + context['post'] = last_post | |
76 | + | |
77 | + return render(request, "post/post_render.html", context) | |
78 | + | |
46 | 79 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): |
47 | 80 | login_url = reverse_lazy("core:home") |
48 | 81 | redirect_field_name = 'next' | ... | ... |