Commit 82e90bd18792dcc5aacfde501684f05de0f57c47

Authored by Zambom
1 parent 61a6e5fd

Adding answer post creation [Issue: #163]

forum/forms.py
... ... @@ -41,10 +41,11 @@ class PostAnswerForm(forms.ModelForm):
41 41  
42 42 class Meta:
43 43 model = PostAnswer
44   - fields = ('message', )
  44 + fields = ('message', 'post', )
45 45 labels = {
46 46 'message': _('Message')
47 47 }
48 48 widgets = {
49 49 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
  50 + 'post': forms.HiddenInput(),
50 51 }
51 52 \ No newline at end of file
... ...
forum/static/js/forum.js
... ... @@ -217,6 +217,26 @@ function answer(id, url) {
217 217 url: url,
218 218 success: function(data) {
219 219 $("#post_"+id).find(".answer_post").html(data);
  220 + $("#post_"+id).find("#id_post").val(id);
  221 +
  222 + var frm = $("#post_"+id).find(".answer_post_form");
  223 + frm.submit(function () {
  224 + $.ajax({
  225 + type: frm.attr('method'),
  226 + url: frm.attr('action'),
  227 + data: frm.serialize(),
  228 + success: function (data) {
  229 + $("#post_"+id).find(".answer_list").append(data);
  230 +
  231 + $("#post_"+id).find(".answer_post").hide();
  232 + },
  233 + error: function(data) {
  234 + console.log(frm.serialize());
  235 + console.log('Error');
  236 + }
  237 + });
  238 + return false;
  239 + });
220 240 }
221 241 });
222 242  
... ...
forum/templates/post/post_list.html
... ... @@ -36,8 +36,10 @@
36 36 <p class="comment-text">{{ post.message|linebreaks }}</p>
37 37 </div>
38 38 <div class="answer_post"></div>
  39 + <div class="answer_list">
  40 + {% list_post_answer request post %}
  41 + </div>
39 42 </div>
40 43 </div>
41   - {% list_post_answer request post %}
42 44 {% endfor %}
43 45 {% endif %}
44 46 \ No newline at end of file
... ...
forum/templates/post_answers/post_answer_form.html
1 1 {% load static i18n %}
2 2 {% load widget_tweaks %}
3 3  
4   -<form method="post" action="#" enctype="multipart/form-data">
  4 +<form class="answer_post_form" method="post" action="{% if answer %}{% else %}{% url 'course:forum:reply_post' %}{% endif %}" enctype="multipart/form-data">
5 5 {% csrf_token %}
6 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>
  7 + {% if field.field.widget.input_type == 'hidden' %}
  8 + {% render_field field class='form-control' %}
  9 + {% else %}
  10 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  11 + <div class="input-group">
  12 + <label for="{{ field.auto_id }}">{{ field.label }}</label>
  13 + {% render_field field class='form-control' %}
  14 + <span class="help-block">{{ field.help_text }}</span>
  15 + {% if field.errors %}
  16 + <div class="row">
  17 + <br />
  18 + <div class="alert alert-danger alert-dismissible" role="alert">
  19 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  20 + <span aria-hidden="true">&times;</span>
  21 + </button>
  22 + <ul>
  23 + {% for error in field.errors %}
  24 + <li>{{ error }}</li>
  25 + {% endfor %}
  26 + </ul>
  27 + </div>
24 28 </div>
25   - </div>
26   - {% endif %}
27   - <span class="input-group-btn">
28   - <button type="submit" class="btn btn-fab btn-fab-mini">
29   - <i class="material-icons">send</i>
30   - </button>
31   - </span>
  29 + {% endif %}
  30 + <span class="input-group-btn">
  31 + <button type="submit" class="btn btn-fab btn-fab-mini">
  32 + <i class="material-icons">send</i>
  33 + </button>
  34 + </span>
  35 + </div>
32 36 </div>
33   - </div>
  37 + {% endif %}
34 38 {% endfor %}
35   -
36 39 </form>
37 40 \ No newline at end of file
... ...
forum/templates/post_answers/post_answer_list.html
... ... @@ -2,11 +2,11 @@
2 2  
3 3 {% if answers|length > 0 %}
4 4 {% for answer in answers %}
5   - <div class="row" style="background-color: #e0e0e0">
  5 + <div id="answer_{{ answer_id }}" class="row" style="background-color: #e0e0e0">
6 6 <div class="col-sm-12 col-xs-12">
7 7 <h3 class="user-name">
8 8 {{ answer.user }}
9   - {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == answer.user %}
  9 + {% if request.user|has_role:'system_admin' or request.user == answer.user %}
10 10 <div class="pull-right">
11 11 <div class="btn-group icon-more-horiz">
12 12 <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
... ...
forum/templates/post_answers/post_answer_render.html 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +{% load i18n permission_tags %}
  2 +
  3 +<div id="answer_{{ answer_id }}" class="row" style="background-color: #e0e0e0">
  4 + <div class="col-sm-12 col-xs-12">
  5 + <h3 class="user-name">
  6 + {{ answer.user }}
  7 + {% if request.user|has_role:'system_admin' or request.user == answer.user %}
  8 + <div class="pull-right">
  9 + <div class="btn-group icon-more-horiz">
  10 + <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  11 + <i class="material-icons">more_horiz</i>
  12 + </a>
  13 + <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
  14 + <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li>
  15 + <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li>
  16 + </ul>
  17 + </div>
  18 + </div>
  19 + {% endif %}
  20 + </h3>
  21 + <div class="card-data">
  22 + <p class="comment-date"><i class="fa fa-clock-o"></i> {{ answer.answer_date|timesince }} {% trans 'ago' %}</p>
  23 + </div>
  24 + <p class="comment-text">{{ answer.message|linebreaks }}</p>
  25 + </div>
  26 +</div>
0 27 \ No newline at end of file
... ...
forum/urls.py
... ... @@ -18,5 +18,6 @@ urlpatterns = [
18 18 url(r'^post_deleted/$', views.post_deleted, name='deleted_post'),
19 19 url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'),
20 20 url(r'^reply_post/$', views.CreatePostAnswerView.as_view(), name='reply_post'),
  21 + url(r'^render_post_answer/([\w_-]+)/$', views.render_post_answer, name='render_post_answer'),
21 22 url(r'^(?P<slug>[\w_-]+)/$', views.ForumDetailView.as_view(), name='view'),
22 23 ]
... ...
forum/views.py
... ... @@ -10,6 +10,10 @@ from courses.models import Topic
10 10  
11 11 from .forms import ForumForm, PostForm, PostAnswerForm
12 12  
  13 +"""
  14 + Forum Section
  15 +"""
  16 +
13 17 class ForumIndex(LoginRequiredMixin, generic.ListView):
14 18 login_url = reverse_lazy("core:home")
15 19 redirect_field_name = 'next'
... ... @@ -103,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView):
103 107  
104 108 return context
105 109  
  110 +"""
  111 + Post Section
  112 +"""
  113 +
106 114 class CreatePostView(LoginRequiredMixin, generic.edit.CreateView):
107 115 login_url = reverse_lazy("core:home")
108 116 redirect_field_name = 'next'
... ... @@ -154,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView):
154 162 def post_deleted(request):
155 163 return HttpResponse(_("Post deleted successfully."))
156 164  
  165 +
  166 +
  167 +"""
  168 + Post Answer Section
  169 +"""
  170 +
157 171 class PostAnswerIndex(LoginRequiredMixin, generic.ListView):
158 172 login_url = reverse_lazy("core:home")
159 173 redirect_field_name = 'next'
... ... @@ -174,4 +188,24 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView):
174 188  
175 189 template_name = 'post_answers/post_answer_form.html'
176 190 form_class = PostAnswerForm
177   - success_url = reverse_lazy('course:forum:index')
178 191 \ No newline at end of file
  192 +
  193 + def form_valid(self, form):
  194 + self.object = form.save(commit = False)
  195 + self.object.user = self.request.user
  196 +
  197 + self.object.save()
  198 +
  199 + return super(CreatePostAnswerView, self).form_valid(form)
  200 +
  201 + def get_success_url(self):
  202 + self.success_url = reverse('course:forum:render_post_answer', args = (self.object.id, ))
  203 +
  204 + return self.success_url
  205 +
  206 +def render_post_answer(request, answer):
  207 + last_answer = get_object_or_404(PostAnswer, id = answer)
  208 +
  209 + context = {}
  210 + context['answer'] = last_answer
  211 +
  212 + return render(request, "post_answers/post_answer_render.html", context)
179 213 \ No newline at end of file
... ...