Commit 82e90bd18792dcc5aacfde501684f05de0f57c47
1 parent
61a6e5fd
Exists in
master
and in
5 other branches
Adding answer post creation [Issue: #163]
Showing
8 changed files
with
119 additions
and
32 deletions
Show diff stats
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">×</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">×</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"> | ... | ... |
... | ... | @@ -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 | ... | ... |