Commit e208cd519cfb36d6e9e2e6d4ed9c2215be69ac52
Exists in
master
and in
5 other branches
Merge branch 'dev' of https://github.com/amadeusproject/amadeuslms into dev
Showing
13 changed files
with
255 additions
and
58 deletions
Show diff stats
courses/templates/subject/form_view_teacher.html
@@ -26,25 +26,6 @@ | @@ -26,25 +26,6 @@ | ||
26 | </div> | 26 | </div> |
27 | </div> | 27 | </div> |
28 | 28 | ||
29 | -<div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | ||
30 | - <div class="modal-dialog" role="document"> | ||
31 | - <div class="modal-content"> | ||
32 | - <div class="modal-header"> | ||
33 | - <h4 class="modal-title" id="myModalLabel">{% trans 'Forum' %}</h4> | ||
34 | - </div> | ||
35 | - <div class="modal-body"> | ||
36 | - <section> | ||
37 | - <div class="forum_topics"></div> | ||
38 | - </section> | ||
39 | - </div> | ||
40 | - <div class="modal-footer"> | ||
41 | - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans 'Close' %}</button> | ||
42 | - <button type="button" class="btn btn-primary btn-raised">{% trans 'Save changes' %}</button> | ||
43 | - </div> | ||
44 | - </div> | ||
45 | - </div> | ||
46 | -</div> | ||
47 | - | ||
48 | <div class="modal fade" id="createForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | 29 | <div class="modal fade" id="createForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
49 | <div class="modal-dialog" role="document"> | 30 | <div class="modal-dialog" role="document"> |
50 | <div class="modal-content"> | 31 | <div class="modal-content"> |
forum/forms.py
@@ -41,10 +41,11 @@ class PostAnswerForm(forms.ModelForm): | @@ -41,10 +41,11 @@ class PostAnswerForm(forms.ModelForm): | ||
41 | 41 | ||
42 | class Meta: | 42 | class Meta: |
43 | model = PostAnswer | 43 | model = PostAnswer |
44 | - fields = ('message', ) | 44 | + fields = ('message', 'post', ) |
45 | labels = { | 45 | labels = { |
46 | 'message': _('Message') | 46 | 'message': _('Message') |
47 | } | 47 | } |
48 | widgets = { | 48 | widgets = { |
49 | 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}), | 49 | 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}), |
50 | + 'post': forms.HiddenInput(), | ||
50 | } | 51 | } |
51 | \ No newline at end of file | 52 | \ No newline at end of file |
forum/static/js/forum.js
@@ -89,6 +89,44 @@ function createForum(url, topic) { | @@ -89,6 +89,44 @@ function createForum(url, topic) { | ||
89 | 89 | ||
90 | /* | 90 | /* |
91 | * | 91 | * |
92 | +* Function to load edit forum's form and set the submit function | ||
93 | +* | ||
94 | +*/ | ||
95 | +function editForum(url, forum) { | ||
96 | + $.ajax({ | ||
97 | + url: url, | ||
98 | + data: {'pk': forum}, | ||
99 | + success: function(data) { | ||
100 | + $(".forum_form").html(data); | ||
101 | + //$("#id_topic").val(topic); | ||
102 | + | ||
103 | + $('.date-picker').datepicker(); | ||
104 | + | ||
105 | + var frm = $('#forum_create'); | ||
106 | + frm.submit(function () { | ||
107 | + $.ajax({ | ||
108 | + type: frm.attr('method'), | ||
109 | + url: frm.attr('action'), | ||
110 | + data: frm.serialize(), | ||
111 | + success: function (data) { | ||
112 | + $('.forum_view').html(data); | ||
113 | + | ||
114 | + $("#editForum").modal('hide'); | ||
115 | + }, | ||
116 | + error: function(data) { | ||
117 | + $(".forum_form").html(data.responseText); | ||
118 | + } | ||
119 | + }); | ||
120 | + return false; | ||
121 | + }); | ||
122 | + } | ||
123 | + }); | ||
124 | + | ||
125 | + $("#editForum").modal(); | ||
126 | +} | ||
127 | + | ||
128 | +/* | ||
129 | +* | ||
92 | * Function to delete a forum | 130 | * Function to delete a forum |
93 | * | 131 | * |
94 | */ | 132 | */ |
@@ -174,13 +212,62 @@ function delete_post(url, post) { | @@ -174,13 +212,62 @@ function delete_post(url, post) { | ||
174 | }); | 212 | }); |
175 | } | 213 | } |
176 | 214 | ||
215 | +/* | ||
216 | +* | ||
217 | +* Function to load answer post form and set the submit function | ||
218 | +* | ||
219 | +*/ | ||
177 | function answer(id, url) { | 220 | function answer(id, url) { |
178 | $.ajax({ | 221 | $.ajax({ |
179 | url: url, | 222 | url: url, |
180 | success: function(data) { | 223 | success: function(data) { |
181 | $("#post_"+id).find(".answer_post").html(data); | 224 | $("#post_"+id).find(".answer_post").html(data); |
225 | + $("#post_"+id).find("#id_post").val(id); | ||
226 | + | ||
227 | + var frm = $("#post_"+id).find(".answer_post_form"); | ||
228 | + frm.submit(function () { | ||
229 | + $.ajax({ | ||
230 | + type: frm.attr('method'), | ||
231 | + url: frm.attr('action'), | ||
232 | + data: frm.serialize(), | ||
233 | + success: function (data) { | ||
234 | + $("#post_"+id).find(".answer_list").append(data); | ||
235 | + | ||
236 | + $("#post_"+id).find(".answer_post").hide(); | ||
237 | + }, | ||
238 | + error: function(data) { | ||
239 | + console.log(frm.serialize()); | ||
240 | + console.log('Error'); | ||
241 | + } | ||
242 | + }); | ||
243 | + return false; | ||
244 | + }); | ||
182 | } | 245 | } |
183 | }); | 246 | }); |
184 | 247 | ||
185 | $("#post_"+id).find(".answer_post").show(); | 248 | $("#post_"+id).find(".answer_post").show(); |
249 | +} | ||
250 | + | ||
251 | +/* | ||
252 | +* | ||
253 | +* Function to delete an answer | ||
254 | +* | ||
255 | +*/ | ||
256 | +function delete_answer(url, answer, message) { | ||
257 | + alertify.confirm(message, function(){ | ||
258 | + var csrftoken = getCookie('csrftoken'); | ||
259 | + | ||
260 | + $.ajax({ | ||
261 | + method: 'post', | ||
262 | + beforeSend: function (request) { | ||
263 | + request.setRequestHeader('X-CSRFToken', csrftoken); | ||
264 | + }, | ||
265 | + url: url, | ||
266 | + success: function(data) { | ||
267 | + alertify.alert('Amadeus', data, function(){ | ||
268 | + $("#answer_"+answer).remove(); | ||
269 | + }); | ||
270 | + } | ||
271 | + }); | ||
272 | + }); | ||
186 | } | 273 | } |
187 | \ No newline at end of file | 274 | \ No newline at end of file |
forum/templates/forum/forum_form.html
1 | {% load static i18n %} | 1 | {% load static i18n %} |
2 | {% load widget_tweaks %} | 2 | {% load widget_tweaks %} |
3 | 3 | ||
4 | -<form id="forum_create" method="post" action="{% url 'course:forum:create' %}" enctype="multipart/form-data"> | 4 | +<form id="forum_create" method="post" action="{% if forum %}{% url 'course:forum:update' forum.id %}{% else %}{% url 'course:forum:create' %}{% endif %}" enctype="multipart/form-data"> |
5 | {% csrf_token %} | 5 | {% csrf_token %} |
6 | {% for field in form %} | 6 | {% for field in form %} |
7 | <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | 7 | <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> |
forum/templates/forum/forum_view.html
@@ -41,7 +41,7 @@ | @@ -41,7 +41,7 @@ | ||
41 | </div> | 41 | </div> |
42 | <div class="panel-body"> | 42 | <div class="panel-body"> |
43 | <ul class="nav nav-pills nav-stacked"> | 43 | <ul class="nav nav-pills nav-stacked"> |
44 | - <li><a href="javascript:edit_forum('{% url 'course:forum:index' %}', '{{ forum.id }}')">{% trans 'Edit' %}</a></li> | 44 | + <li><a href="javascript:editForum('{% url 'course:forum:update' forum.id %}', '{{ forum.id }}')">{% trans 'Edit' %}</a></li> |
45 | <li><a href="javascript:delete_forum('{% url 'course:forum:delete' forum.id %}', '{{ forum.id }}', '{% trans "Are you sure you want to delete this forum?" %}', '{% url 'course:view_subject' forum.topic.subject.slug %}')">{% trans 'Delete' %}</a></li> | 45 | <li><a href="javascript:delete_forum('{% url 'course:forum:delete' forum.id %}', '{{ forum.id }}', '{% trans "Are you sure you want to delete this forum?" %}', '{% url 'course:view_subject' forum.topic.subject.slug %}')">{% trans 'Delete' %}</a></li> |
46 | </ul> | 46 | </ul> |
47 | </div> | 47 | </div> |
@@ -53,7 +53,7 @@ | @@ -53,7 +53,7 @@ | ||
53 | <div class="row panel panel-default"> | 53 | <div class="row panel panel-default"> |
54 | <div class="panel-body"> | 54 | <div class="panel-body"> |
55 | <div class="comments-list"> | 55 | <div class="comments-list"> |
56 | - <div class="section-heading"> | 56 | + <div class="section-heading forum_view"> |
57 | <h1>{{ forum }}</h1> | 57 | <h1>{{ forum }}</h1> |
58 | <h4><b>{% trans 'Description' %}:</b> {{ forum.description }}</h4> | 58 | <h4><b>{% trans 'Description' %}:</b> {{ forum.description }}</h4> |
59 | <h4><b>{% trans 'Opened in' %}:</b> {{ forum.create_date }}</h4> | 59 | <h4><b>{% trans 'Opened in' %}:</b> {{ forum.create_date }}</h4> |
@@ -103,6 +103,25 @@ | @@ -103,6 +103,25 @@ | ||
103 | </div> | 103 | </div> |
104 | </div> | 104 | </div> |
105 | </div> | 105 | </div> |
106 | + <!-- Modal to show Forum edit form --> | ||
107 | + <div class="modal fade" id="editForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | ||
108 | + <div class="modal-dialog" role="document"> | ||
109 | + <div class="modal-content"> | ||
110 | + <div class="modal-header"> | ||
111 | + <h4 class="modal-title" id="myModalLabel">{% trans 'Forum' %}</h4> | ||
112 | + </div> | ||
113 | + <div class="modal-body"> | ||
114 | + <section> | ||
115 | + <div class="forum_form"></div> | ||
116 | + </section> | ||
117 | + </div> | ||
118 | + <div class="modal-footer"> | ||
119 | + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans 'Close' %}</button> | ||
120 | + <button type="button" onclick="$('#forum_create').submit();" class="btn btn-primary btn-raised">{% trans 'Update' %}</button> | ||
121 | + </div> | ||
122 | + </div> | ||
123 | + </div> | ||
124 | + </div> | ||
106 | {% endblock %} | 125 | {% endblock %} |
107 | 126 | ||
108 | {% block rightbar %} | 127 | {% block rightbar %} |
@@ -114,4 +133,4 @@ | @@ -114,4 +133,4 @@ | ||
114 | 133 | ||
115 | </div> | 134 | </div> |
116 | </div> | 135 | </div> |
117 | -{% endblock rightbar %} | ||
118 | \ No newline at end of file | 136 | \ No newline at end of file |
137 | +{% endblock rightbar %} |
forum/templates/post/post_list.html
@@ -36,8 +36,10 @@ | @@ -36,8 +36,10 @@ | ||
36 | <p class="comment-text">{{ post.message|linebreaks }}</p> | 36 | <p class="comment-text">{{ post.message|linebreaks }}</p> |
37 | </div> | 37 | </div> |
38 | <div class="answer_post"></div> | 38 | <div class="answer_post"></div> |
39 | + <div class="answer_list"> | ||
40 | + {% list_post_answer request post %} | ||
41 | + </div> | ||
39 | </div> | 42 | </div> |
40 | </div> | 43 | </div> |
41 | - {% list_post_answer request post %} | ||
42 | {% endfor %} | 44 | {% endfor %} |
43 | {% endif %} | 45 | {% endif %} |
44 | \ No newline at end of file | 46 | \ No newline at end of file |
forum/templates/post_answers/post_answer_form.html
1 | {% load static i18n %} | 1 | {% load static i18n %} |
2 | {% load widget_tweaks %} | 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 | {% csrf_token %} | 5 | {% csrf_token %} |
6 | {% for field in form %} | 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 | </div> | 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 | </div> | 36 | </div> |
33 | - </div> | 37 | + {% endif %} |
34 | {% endfor %} | 38 | {% endfor %} |
35 | - | ||
36 | </form> | 39 | </form> |
37 | \ No newline at end of file | 40 | \ No newline at end of file |
forum/templates/post_answers/post_answer_list.html
@@ -2,11 +2,11 @@ | @@ -2,11 +2,11 @@ | ||
2 | 2 | ||
3 | {% if answers|length > 0 %} | 3 | {% if answers|length > 0 %} |
4 | {% for answer in answers %} | 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 | <div class="col-sm-12 col-xs-12"> | 6 | <div class="col-sm-12 col-xs-12"> |
7 | <h3 class="user-name"> | 7 | <h3 class="user-name"> |
8 | {{ answer.user }} | 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 | <div class="pull-right"> | 10 | <div class="pull-right"> |
11 | <div class="btn-group icon-more-horiz"> | 11 | <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"> | 12 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | </a> | 14 | </a> |
15 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 15 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> |
16 | <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | 16 | <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
17 | - <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 17 | + <li><a href="javascript:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
18 | </ul> | 18 | </ul> |
19 | </div> | 19 | </div> |
20 | </div> | 20 | </div> |
@@ -0,0 +1,26 @@ | @@ -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:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><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 | \ No newline at end of file | 27 | \ No newline at end of file |
forum/urls.py
@@ -6,8 +6,10 @@ from . import views | @@ -6,8 +6,10 @@ from . import views | ||
6 | urlpatterns = [ | 6 | urlpatterns = [ |
7 | url(r'^$', views.ForumIndex.as_view(), name='index'), | 7 | url(r'^$', views.ForumIndex.as_view(), name='index'), |
8 | url(r'^create/$', views.CreateForumView.as_view(), name='create'), | 8 | url(r'^create/$', views.CreateForumView.as_view(), name='create'), |
9 | + url(r'^update/(?P<pk>[\w_-]+)/$', views.UpdateForumView.as_view(), name='update'), | ||
9 | url(r'^delete/(?P<pk>[\w_-]+)/$', views.ForumDeleteView.as_view(), name='delete'), | 10 | url(r'^delete/(?P<pk>[\w_-]+)/$', views.ForumDeleteView.as_view(), name='delete'), |
10 | url(r'^render_forum/([\w_-]+)/$', views.render_forum, name='render_forum'), | 11 | url(r'^render_forum/([\w_-]+)/$', views.render_forum, name='render_forum'), |
12 | + url(r'^render_edit_forum/([\w_-]+)/$', views.render_edit_forum, name='render_edit_forum'), | ||
11 | url(r'^forum_deleted/$', views.forum_deleted, name='deleted_forum'), | 13 | url(r'^forum_deleted/$', views.forum_deleted, name='deleted_forum'), |
12 | url(r'^create_post/$', views.CreatePostView.as_view(), name='create_post'), | 14 | url(r'^create_post/$', views.CreatePostView.as_view(), name='create_post'), |
13 | url(r'^update_post/(?P<pk>[\w_-]+)/$', views.PostUpdateView.as_view(), name='update_post'), | 15 | url(r'^update_post/(?P<pk>[\w_-]+)/$', views.PostUpdateView.as_view(), name='update_post'), |
@@ -16,5 +18,8 @@ urlpatterns = [ | @@ -16,5 +18,8 @@ urlpatterns = [ | ||
16 | url(r'^post_deleted/$', views.post_deleted, name='deleted_post'), | 18 | url(r'^post_deleted/$', views.post_deleted, name='deleted_post'), |
17 | url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'), | 19 | url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'), |
18 | url(r'^reply_post/$', views.CreatePostAnswerView.as_view(), name='reply_post'), | 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'), | ||
22 | + url(r'^delete_post_answer/(?P<pk>[\w_-]+)/$', views.PostAnswerDeleteView.as_view(), name='delete_answer'), | ||
23 | + url(r'^post_answer_deleted/$', views.answer_deleted, name='deleted_answer'), | ||
19 | url(r'^(?P<slug>[\w_-]+)/$', views.ForumDetailView.as_view(), name='view'), | 24 | url(r'^(?P<slug>[\w_-]+)/$', views.ForumDetailView.as_view(), name='view'), |
20 | ] | 25 | ] |
forum/views.py
@@ -10,6 +10,10 @@ from courses.models import Topic | @@ -10,6 +10,10 @@ from courses.models import Topic | ||
10 | 10 | ||
11 | from .forms import ForumForm, PostForm, PostAnswerForm | 11 | from .forms import ForumForm, PostForm, PostAnswerForm |
12 | 12 | ||
13 | +""" | ||
14 | + Forum Section | ||
15 | +""" | ||
16 | + | ||
13 | class ForumIndex(LoginRequiredMixin, generic.ListView): | 17 | class ForumIndex(LoginRequiredMixin, generic.ListView): |
14 | login_url = reverse_lazy("core:home") | 18 | login_url = reverse_lazy("core:home") |
15 | redirect_field_name = 'next' | 19 | redirect_field_name = 'next' |
@@ -50,6 +54,30 @@ def render_forum(request, forum): | @@ -50,6 +54,30 @@ def render_forum(request, forum): | ||
50 | 54 | ||
51 | return HttpResponse(str(reverse_lazy('course:forum:view', args = (), kwargs = {'slug': last_forum.slug})) + '-' + str(forum) + '-' + str(last_forum.name)) | 55 | return HttpResponse(str(reverse_lazy('course:forum:view', args = (), kwargs = {'slug': last_forum.slug})) + '-' + str(forum) + '-' + str(last_forum.name)) |
52 | 56 | ||
57 | +class UpdateForumView(LoginRequiredMixin, generic.UpdateView): | ||
58 | + login_url = reverse_lazy("core:home") | ||
59 | + redirect_field_name = 'next' | ||
60 | + | ||
61 | + template_name = 'forum/forum_form.html' | ||
62 | + form_class = ForumForm | ||
63 | + model = Forum | ||
64 | + | ||
65 | + def form_invalid(self, form): | ||
66 | + return self.render_to_response(self.get_context_data(form = form), status = 400) | ||
67 | + | ||
68 | + def get_success_url(self): | ||
69 | + self.success_url = reverse('course:forum:render_edit_forum', args = (self.object.id, )) | ||
70 | + | ||
71 | + return self.success_url | ||
72 | + | ||
73 | +def render_edit_forum(request, forum): | ||
74 | + last_forum = get_object_or_404(Forum, id = forum) | ||
75 | + context = { | ||
76 | + 'forum': last_forum | ||
77 | + } | ||
78 | + | ||
79 | + return render(request, 'forum/render_forum.html', context) | ||
80 | + | ||
53 | class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): | 81 | class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): |
54 | login_url = reverse_lazy("core:home") | 82 | login_url = reverse_lazy("core:home") |
55 | redirect_field_name = 'next' | 83 | redirect_field_name = 'next' |
@@ -79,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView): | @@ -79,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView): | ||
79 | 107 | ||
80 | return context | 108 | return context |
81 | 109 | ||
110 | +""" | ||
111 | + Post Section | ||
112 | +""" | ||
113 | + | ||
82 | class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | 114 | class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): |
83 | login_url = reverse_lazy("core:home") | 115 | login_url = reverse_lazy("core:home") |
84 | redirect_field_name = 'next' | 116 | redirect_field_name = 'next' |
@@ -130,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): | @@ -130,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): | ||
130 | def post_deleted(request): | 162 | def post_deleted(request): |
131 | return HttpResponse(_("Post deleted successfully.")) | 163 | return HttpResponse(_("Post deleted successfully.")) |
132 | 164 | ||
165 | + | ||
166 | + | ||
167 | +""" | ||
168 | + Post Answer Section | ||
169 | +""" | ||
170 | + | ||
133 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): | 171 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): |
134 | login_url = reverse_lazy("core:home") | 172 | login_url = reverse_lazy("core:home") |
135 | redirect_field_name = 'next' | 173 | redirect_field_name = 'next' |
@@ -150,4 +188,35 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): | @@ -150,4 +188,35 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): | ||
150 | 188 | ||
151 | template_name = 'post_answers/post_answer_form.html' | 189 | template_name = 'post_answers/post_answer_form.html' |
152 | form_class = PostAnswerForm | 190 | form_class = PostAnswerForm |
153 | - success_url = reverse_lazy('course:forum:index') | ||
154 | \ No newline at end of file | 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) | ||
213 | + | ||
214 | +class PostAnswerDeleteView(LoginRequiredMixin, generic.DeleteView): | ||
215 | + login_url = reverse_lazy("core:home") | ||
216 | + redirect_field_name = 'next' | ||
217 | + | ||
218 | + model = PostAnswer | ||
219 | + pk_url_kwarg = 'pk' | ||
220 | + success_url = reverse_lazy('course:forum:deleted_answer') | ||
221 | + | ||
222 | +def answer_deleted(request): | ||
223 | + return HttpResponse(_("Post answer deleted successfully.")) | ||
155 | \ No newline at end of file | 224 | \ No newline at end of file |
requirements.txt