Commit 92de728a479266b988b8ab4f46d1b64352114dbe

Authored by Zambom
1 parent fc50841e

Adding form to reply post [Issue: #73]

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
forum/migrations/0004_auto_20160928_1558.py 0 → 100644
@@ -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 %}
forum/templates/post_answers/post_answer_form.html 0 → 100644
@@ -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">&times;</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
@@ -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