Commit fe5eaf5b3911c4e5031471b43b814b21c98baffb
Exists in
master
and in
5 other branches
Merge
Showing
15 changed files
with
363 additions
and
63 deletions
Show diff stats
... | ... | @@ -0,0 +1,16 @@ |
1 | +import os | |
2 | + | |
3 | +DEBUG = True | |
4 | + | |
5 | +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
6 | + | |
7 | +DATABASES = { | |
8 | + 'default': { | |
9 | + 'ENGINE': 'django.db.backends.postgresql', | |
10 | + 'NAME': 'amadeus', | |
11 | + 'USER': 'amadeus_admin', | |
12 | + 'PASSWORD': 'amadeus', | |
13 | + 'HOST': '127.0.0.1', | |
14 | + 'PORT': '5432', | |
15 | + } | |
16 | +} | |
0 | 17 | \ No newline at end of file | ... | ... |
courses/templates/subject/form_view_teacher.html
... | ... | @@ -26,25 +26,6 @@ |
26 | 26 | </div> |
27 | 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 | 29 | <div class="modal fade" id="createForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
49 | 30 | <div class="modal-dialog" role="document"> |
50 | 31 | <div class="modal-content"> | ... | ... |
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
... | ... | @@ -69,7 +69,7 @@ function createForum(url, topic) { |
69 | 69 | console.log(data); |
70 | 70 | data = data.split('-'); |
71 | 71 | |
72 | - $('.foruns_list').append("<a id='forum_"+data[1]+"' href='javascript:showForum("+data[0]+","+data[1]+")'>"+data[2]+"<br /></a>"); | |
72 | + $('.foruns_list').append("<a id='forum_"+data[1]+"' href='"+data[0]+"'>"+data[2]+"<br /></a>"); | |
73 | 73 | |
74 | 74 | $("#createForum").modal('hide'); |
75 | 75 | |
... | ... | @@ -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 | 130 | * Function to delete a forum |
93 | 131 | * |
94 | 132 | */ |
... | ... | @@ -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 | 220 | function answer(id, url) { |
178 | 221 | $.ajax({ |
179 | 222 | url: url, |
180 | 223 | success: function(data) { |
181 | 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 | 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 | 274 | \ No newline at end of file | ... | ... |
forum/templates/forum/forum_form.html
1 | 1 | {% load static i18n %} |
2 | 2 | {% load widget_tweaks %} |
3 | 3 | |
4 | -<form id="forum_create" method="post" action="{% url '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 | 5 | {% csrf_token %} |
6 | 6 | {% for field in form %} |
7 | 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 | 41 | </div> |
42 | 42 | <div class="panel-body"> |
43 | 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 | 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 | 46 | </ul> |
47 | 47 | </div> |
... | ... | @@ -53,7 +53,7 @@ |
53 | 53 | <div class="row panel panel-default"> |
54 | 54 | <div class="panel-body"> |
55 | 55 | <div class="comments-list"> |
56 | - <div class="section-heading"> | |
56 | + <div class="section-heading forum_view"> | |
57 | 57 | <h1>{{ forum }}</h1> |
58 | 58 | <h4><b>{% trans 'Description' %}:</b> {{ forum.description }}</h4> |
59 | 59 | <h4><b>{% trans 'Opened in' %}:</b> {{ forum.create_date }}</h4> |
... | ... | @@ -103,6 +103,25 @@ |
103 | 103 | </div> |
104 | 104 | </div> |
105 | 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 | 125 | {% endblock %} |
107 | 126 | |
108 | 127 | {% block rightbar %} |
... | ... | @@ -114,4 +133,4 @@ |
114 | 133 | |
115 | 134 | </div> |
116 | 135 | </div> |
117 | -{% endblock rightbar %} | |
118 | 136 | \ No newline at end of file |
137 | +{% endblock rightbar %} | ... | ... |
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"> |
... | ... | @@ -14,7 +14,7 @@ |
14 | 14 | </a> |
15 | 15 | <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> |
16 | 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 | 18 | </ul> |
19 | 19 | </div> |
20 | 20 | </div> | ... | ... |
... | ... | @@ -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 | 27 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,90 @@ |
1 | +from django.test import TestCase, Client | |
2 | + | |
3 | +from django.core.urlresolvers import reverse | |
4 | +from rolepermissions.shortcuts import assign_role | |
5 | + | |
6 | +from users.models import User | |
7 | +from courses.models import Category, Course, Subject, Topic | |
8 | +from forum.models import Forum | |
9 | + | |
10 | +class ForumDetailViewTestCase (TestCase): | |
11 | + | |
12 | + def setUp(self): | |
13 | + self.client = Client() | |
14 | + | |
15 | + self.user = User.objects.create_user( | |
16 | + username = 'test', | |
17 | + email = 'testing@amadeus.com', | |
18 | + is_staff = True, | |
19 | + is_active = True, | |
20 | + password = 'testing' | |
21 | + ) | |
22 | + assign_role(self.user, 'system_admin') | |
23 | + | |
24 | + self.category = Category.objects.create( | |
25 | + name = 'Category test', | |
26 | + slug = 'category_test' | |
27 | + ) | |
28 | + self.category.save() | |
29 | + | |
30 | + self.course = Course.objects.create( | |
31 | + name = 'Course Test', | |
32 | + slug = 'course_test', | |
33 | + max_students = 50, | |
34 | + init_register_date = '2016-08-26', | |
35 | + end_register_date = '2016-10-01', | |
36 | + init_date = '2016-10-05', | |
37 | + end_date = '2017-10-05', | |
38 | + category = self.category | |
39 | + ) | |
40 | + self.course.save() | |
41 | + | |
42 | + self.subject = Subject.objects.create( | |
43 | + name = 'Subject Test', | |
44 | + slug='subject-test', | |
45 | + description = "description of the subject test", | |
46 | + visible = True, | |
47 | + course = self.course, | |
48 | + init_date = '2016-10-05', | |
49 | + end_date = '2017-10-05', | |
50 | + ) | |
51 | + self.subject.save() | |
52 | + | |
53 | + self.topic = Topic.objects.create( | |
54 | + name = 'Topic Test', | |
55 | + description = "description of the topic test", | |
56 | + subject = self.subject, | |
57 | + owner = self.user, | |
58 | + ) | |
59 | + self.topic.save() | |
60 | + | |
61 | + self.forum = Forum.objects.create( | |
62 | + topic=self.topic, | |
63 | + name = 'forum test', | |
64 | + slug='forum-test', | |
65 | + description = 'description of the forum test', | |
66 | + create_date = '2016-10-02', | |
67 | + modification_date = '2016-10-03', | |
68 | + limit_date = '2017-10-05', | |
69 | + ) | |
70 | + self.forum.save() | |
71 | + | |
72 | + self.url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) | |
73 | + | |
74 | + def test_view_ok (self): | |
75 | + self.client.login(username='test', password='testing') | |
76 | + | |
77 | + response = self.client.get(self.url) | |
78 | + self.assertEquals(response.status_code, 200) | |
79 | + self.assertTemplateUsed(response, 'forum/forum_view.html') | |
80 | + | |
81 | + def test_context(self): | |
82 | + self.client.login(username='test', password='testing') | |
83 | + | |
84 | + response = self.client.get(self.url) | |
85 | + | |
86 | + self.assertTrue('form' in response.context) | |
87 | + self.assertTrue('forum' in response.context) | |
88 | + self.assertTrue('title' in response.context) | |
89 | + | |
90 | + | ... | ... |
forum/urls.py
... | ... | @@ -6,8 +6,10 @@ from . import views |
6 | 6 | urlpatterns = [ |
7 | 7 | url(r'^$', views.ForumIndex.as_view(), name='index'), |
8 | 8 | url(r'^create/$', views.CreateForumView.as_view(), name='create'), |
9 | + url(r'^update/(?P<pk>[\w_-]+)/$', views.UpdateForumView.as_view(), name='update'), | |
9 | 10 | url(r'^delete/(?P<pk>[\w_-]+)/$', views.ForumDeleteView.as_view(), name='delete'), |
10 | 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 | 13 | url(r'^forum_deleted/$', views.forum_deleted, name='deleted_forum'), |
12 | 14 | url(r'^create_post/$', views.CreatePostView.as_view(), name='create_post'), |
13 | 15 | url(r'^update_post/(?P<pk>[\w_-]+)/$', views.PostUpdateView.as_view(), name='update_post'), |
... | ... | @@ -16,5 +18,8 @@ urlpatterns = [ |
16 | 18 | url(r'^post_deleted/$', views.post_deleted, name='deleted_post'), |
17 | 19 | url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'), |
18 | 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 | 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 | 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' |
... | ... | @@ -41,7 +45,6 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): |
41 | 45 | return self.render_to_response(self.get_context_data(form = form), status = 400) |
42 | 46 | |
43 | 47 | def get_success_url(self): |
44 | - print("Pass") | |
45 | 48 | self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) |
46 | 49 | |
47 | 50 | return self.success_url |
... | ... | @@ -49,7 +52,31 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): |
49 | 52 | def render_forum(request, forum): |
50 | 53 | last_forum = get_object_or_404(Forum, id = forum) |
51 | 54 | |
52 | - return HttpResponse(str(reverse_lazy('course:forum:index')) + '-' + 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)) | |
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) | |
53 | 80 | |
54 | 81 | class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): |
55 | 82 | login_url = reverse_lazy("core:home") |
... | ... | @@ -80,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView): |
80 | 107 | |
81 | 108 | return context |
82 | 109 | |
110 | +""" | |
111 | + Post Section | |
112 | +""" | |
113 | + | |
83 | 114 | class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): |
84 | 115 | login_url = reverse_lazy("core:home") |
85 | 116 | redirect_field_name = 'next' |
... | ... | @@ -131,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): |
131 | 162 | def post_deleted(request): |
132 | 163 | return HttpResponse(_("Post deleted successfully.")) |
133 | 164 | |
165 | + | |
166 | + | |
167 | +""" | |
168 | + Post Answer Section | |
169 | +""" | |
170 | + | |
134 | 171 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): |
135 | 172 | login_url = reverse_lazy("core:home") |
136 | 173 | redirect_field_name = 'next' |
... | ... | @@ -151,4 +188,35 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): |
151 | 188 | |
152 | 189 | template_name = 'post_answers/post_answer_form.html' |
153 | 190 | form_class = PostAnswerForm |
154 | - success_url = reverse_lazy('course:forum:index') | |
155 | 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.")) | |
156 | 224 | \ No newline at end of file | ... | ... |
requirements.txt
... | ... | @@ -10,12 +10,9 @@ django-role-permissions==1.2.1 |
10 | 10 | django-s3direct==0.4.2 |
11 | 11 | django-widget-tweaks==1.4.1 |
12 | 12 | djangorestframework==3.4.6 |
13 | -itsdangerous==0.24 | |
14 | 13 | Jinja2==2.8 |
15 | 14 | MarkupSafe==0.23 |
16 | 15 | Pillow==3.3.1 |
17 | 16 | psycopg2==2.6.2 |
18 | 17 | pycpfcnpj==1.0.2 |
19 | -six==1.10.0 | |
20 | -slugify==0.0.1 | |
21 | -Werkzeug==0.11.11 | |
18 | +six==1.10.0 | |
22 | 19 | \ No newline at end of file | ... | ... |