Commit 92de728a479266b988b8ab4f46d1b64352114dbe
1 parent
fc50841e
Exists in
master
and in
5 other branches
Adding form to reply post [Issue: #73]
Showing
8 changed files
with
104 additions
and
12 deletions
Show diff stats
forum/forms.py
1 | from django import forms | 1 | from django import forms |
2 | from django.utils.translation import ugettext_lazy as _ | 2 | from django.utils.translation import ugettext_lazy as _ |
3 | -from .models import Forum | 3 | +from .models import Forum, PostAnswer |
4 | 4 | ||
5 | class ForumForm(forms.ModelForm): | 5 | class ForumForm(forms.ModelForm): |
6 | 6 | ||
@@ -17,4 +17,16 @@ class ForumForm(forms.ModelForm): | @@ -17,4 +17,16 @@ class ForumForm(forms.ModelForm): | ||
17 | } | 17 | } |
18 | widgets = { | 18 | widgets = { |
19 | 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}), | 19 | 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}), |
20 | + } | ||
21 | + | ||
22 | +class PostAnswerForm(forms.ModelForm): | ||
23 | + | ||
24 | + class Meta: | ||
25 | + model = PostAnswer | ||
26 | + fields = ('message', ) | ||
27 | + labels = { | ||
28 | + 'message': _('Message') | ||
29 | + } | ||
30 | + widgets = { | ||
31 | + 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}), | ||
20 | } | 32 | } |
21 | \ No newline at end of file | 33 | \ No newline at end of file |
@@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-09-28 18:58 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('forum', '0003_forum_create_date'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AddField( | ||
16 | + model_name='forum', | ||
17 | + name='modification_date', | ||
18 | + field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'), | ||
19 | + ), | ||
20 | + migrations.AddField( | ||
21 | + model_name='post', | ||
22 | + name='modification_date', | ||
23 | + field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'), | ||
24 | + ), | ||
25 | + migrations.AddField( | ||
26 | + model_name='postanswer', | ||
27 | + name='modification_date', | ||
28 | + field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'), | ||
29 | + ), | ||
30 | + ] |
forum/models.py
@@ -12,6 +12,7 @@ It works like a 'topic' of forum, which users can post to it and answer posts of | @@ -12,6 +12,7 @@ It works like a 'topic' of forum, which users can post to it and answer posts of | ||
12 | """ | 12 | """ |
13 | class Forum(Activity): | 13 | class Forum(Activity): |
14 | description = models.TextField(_('Description'), blank = True) | 14 | description = models.TextField(_('Description'), blank = True) |
15 | + modification_date = models.DateTimeField(_('Modification Date'), auto_now = True) | ||
15 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) | 16 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) |
16 | 17 | ||
17 | class Meta: | 18 | class Meta: |
@@ -28,6 +29,7 @@ It represents a post made in a forum (topic) | @@ -28,6 +29,7 @@ It represents a post made in a forum (topic) | ||
28 | class Post(models.Model): | 29 | class Post(models.Model): |
29 | user = models.ForeignKey(User, verbose_name = _('Autor')) | 30 | user = models.ForeignKey(User, verbose_name = _('Autor')) |
30 | message = models.TextField(_('Post message'), blank = False) | 31 | message = models.TextField(_('Post message'), blank = False) |
32 | + modification_date = models.DateTimeField(_('Modification Date'), auto_now = True) | ||
31 | post_date = models.DateTimeField(_('Post Date'), auto_now_add = True) | 33 | post_date = models.DateTimeField(_('Post Date'), auto_now_add = True) |
32 | forum = models.ForeignKey(Forum, verbose_name = _('Forum')) | 34 | forum = models.ForeignKey(Forum, verbose_name = _('Forum')) |
33 | 35 | ||
@@ -46,6 +48,7 @@ class PostAnswer(models.Model): | @@ -46,6 +48,7 @@ class PostAnswer(models.Model): | ||
46 | user = models.ForeignKey(User, verbose_name = _('Autor')) | 48 | user = models.ForeignKey(User, verbose_name = _('Autor')) |
47 | post = models.ForeignKey(Post, verbose_name = _('Post')) | 49 | post = models.ForeignKey(Post, verbose_name = _('Post')) |
48 | message = models.TextField(_('Answer message'), blank = False) | 50 | message = models.TextField(_('Answer message'), blank = False) |
51 | + modification_date = models.DateTimeField(_('Modification Date'), auto_now = True) | ||
49 | answer_date = models.DateTimeField(_('Answer Date'), auto_now_add = True) | 52 | answer_date = models.DateTimeField(_('Answer Date'), auto_now_add = True) |
50 | 53 | ||
51 | class Meta: | 54 | class Meta: |
forum/static/js/forum.js
@@ -15,15 +15,15 @@ function showForum(url, forum_id) { | @@ -15,15 +15,15 @@ function showForum(url, forum_id) { | ||
15 | $('#forumModal').modal(); | 15 | $('#forumModal').modal(); |
16 | } | 16 | } |
17 | 17 | ||
18 | -function getForm(url) { | 18 | +function answer(id, url) { |
19 | $.ajax({ | 19 | $.ajax({ |
20 | url: url, | 20 | url: url, |
21 | success: function(data) { | 21 | success: function(data) { |
22 | - $(".forum_form").html(data); | 22 | + $("#post_"+id).find(".answer_post").html(data); |
23 | } | 23 | } |
24 | }); | 24 | }); |
25 | 25 | ||
26 | - $(".forum_form").show(); | 26 | + $("#post_"+id).find(".answer_post").show(); |
27 | } | 27 | } |
28 | 28 | ||
29 | function showPosts(url, forum) { | 29 | function showPosts(url, forum) { |
forum/templates/post/post_list.html
@@ -2,12 +2,15 @@ | @@ -2,12 +2,15 @@ | ||
2 | 2 | ||
3 | {% if posts|length > 0 %} | 3 | {% if posts|length > 0 %} |
4 | {% for post in posts %} | 4 | {% for post in posts %} |
5 | - <div class="row"> | ||
6 | - <div class="col-sm-12 col-xs-12"> | 5 | + <div class="row"> |
6 | + <div id="post_{{ post.id }}" class="col-sm-12 col-xs-12"> | ||
7 | <h3 class="user-name"> | 7 | <h3 class="user-name"> |
8 | {{ post.user }} | 8 | {{ post.user }} |
9 | - {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} | ||
10 | - <div class="pull-right"> | 9 | + <div class="pull-right"> |
10 | + <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');"> | ||
11 | + <i class="material-icons">reply</i> | ||
12 | + </a> | ||
13 | + {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %} | ||
11 | <div class="btn-group icon-more-horiz"> | 14 | <div class="btn-group icon-more-horiz"> |
12 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 15 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
13 | <i class="material-icons">more_horiz</i> | 16 | <i class="material-icons">more_horiz</i> |
@@ -17,13 +20,14 @@ | @@ -17,13 +20,14 @@ | ||
17 | <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 20 | <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
18 | </ul> | 21 | </ul> |
19 | </div> | 22 | </div> |
20 | - </div> | ||
21 | - {% endif %} | 23 | + {% endif %} |
24 | + </div> | ||
22 | </h3> | 25 | </h3> |
23 | <div class="card-data"> | 26 | <div class="card-data"> |
24 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ post.post_date }}</p> | 27 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ post.post_date }}</p> |
25 | </div> | 28 | </div> |
26 | <p class="comment-text">{{ post.message|linebreaks }}</p> | 29 | <p class="comment-text">{{ post.message|linebreaks }}</p> |
30 | + <div class="answer_post"></div> | ||
27 | </div> | 31 | </div> |
28 | </div> | 32 | </div> |
29 | {% list_post_answer request post %} | 33 | {% list_post_answer request post %} |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +{% load static i18n %} | ||
2 | +{% load widget_tweaks %} | ||
3 | + | ||
4 | +<form method="post" action="#" enctype="multipart/form-data"> | ||
5 | + {% csrf_token %} | ||
6 | + {% for field in form %} | ||
7 | + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | ||
8 | + <div class="input-group"> | ||
9 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
10 | + {% render_field field class='form-control' %} | ||
11 | + <span class="help-block">{{ field.help_text }}</span> | ||
12 | + {% if field.errors %} | ||
13 | + <div class="row"> | ||
14 | + <br /> | ||
15 | + <div class="alert alert-danger alert-dismissible" role="alert"> | ||
16 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
17 | + <span aria-hidden="true">×</span> | ||
18 | + </button> | ||
19 | + <ul> | ||
20 | + {% for error in field.errors %} | ||
21 | + <li>{{ error }}</li> | ||
22 | + {% endfor %} | ||
23 | + </ul> | ||
24 | + </div> | ||
25 | + </div> | ||
26 | + {% endif %} | ||
27 | + <span class="input-group-btn"> | ||
28 | + <button type="button" class="btn btn-fab btn-fab-mini"> | ||
29 | + <i class="material-icons">send</i> | ||
30 | + </button> | ||
31 | + </span> | ||
32 | + </div> | ||
33 | + </div> | ||
34 | + {% endfor %} | ||
35 | + | ||
36 | +</form> | ||
0 | \ No newline at end of file | 37 | \ No newline at end of file |
forum/urls.py
@@ -8,4 +8,5 @@ urlpatterns = [ | @@ -8,4 +8,5 @@ urlpatterns = [ | ||
8 | url(r'^create$', views.CreateForumView.as_view(), name='create'), | 8 | url(r'^create$', views.CreateForumView.as_view(), name='create'), |
9 | url(r'^posts$', views.PostIndex.as_view(), name='posts'), | 9 | url(r'^posts$', views.PostIndex.as_view(), name='posts'), |
10 | url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'), | 10 | url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'), |
11 | + url(r'^reply_post$', views.CreatePostAnswerView.as_view(), name='reply_post'), | ||
11 | ] | 12 | ] |
forum/views.py
@@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin | @@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin | ||
7 | from .models import Forum, Post, PostAnswer | 7 | from .models import Forum, Post, PostAnswer |
8 | from courses.models import Topic | 8 | from courses.models import Topic |
9 | 9 | ||
10 | -from .forms import ForumForm | 10 | +from .forms import ForumForm, PostAnswerForm |
11 | 11 | ||
12 | class ForumIndex(LoginRequiredMixin, generic.ListView): | 12 | class ForumIndex(LoginRequiredMixin, generic.ListView): |
13 | login_url = reverse_lazy("core:home") | 13 | login_url = reverse_lazy("core:home") |
@@ -55,4 +55,10 @@ class PostAnswerIndex(LoginRequiredMixin, generic.ListView): | @@ -55,4 +55,10 @@ class PostAnswerIndex(LoginRequiredMixin, generic.ListView): | ||
55 | 55 | ||
56 | context = PostAnswer.objects.filter(post = post) | 56 | context = PostAnswer.objects.filter(post = post) |
57 | 57 | ||
58 | - return context | ||
59 | \ No newline at end of file | 58 | \ No newline at end of file |
59 | + return context | ||
60 | + | ||
61 | +class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): | ||
62 | + | ||
63 | + template_name = 'post_answers/post_answer_form.html' | ||
64 | + form_class = PostAnswerForm | ||
65 | + success_url = reverse_lazy('forum:index') | ||
60 | \ No newline at end of file | 66 | \ No newline at end of file |