Commit fe5eaf5b3911c4e5031471b43b814b21c98baffb

Authored by ailsoncgt
2 parents 1db785ec d715495d

Merge

amadeus/local_settings.py.example 0 → 100644
@@ -0,0 +1,16 @@ @@ -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 \ No newline at end of file 17 \ No newline at end of file
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
@@ -69,7 +69,7 @@ function createForum(url, topic) { @@ -69,7 +69,7 @@ function createForum(url, topic) {
69 console.log(data); 69 console.log(data);
70 data = data.split('-'); 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 $("#createForum").modal('hide'); 74 $("#createForum").modal('hide');
75 75
@@ -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 '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/forum/render_forum.html 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +{% load i18n %}
  2 +
  3 +<h1>{{ forum }}</h1>
  4 +<h4><b>{% trans 'Description' %}:</b> {{ forum.description }}</h4>
  5 +<h4><b>{% trans 'Opened in' %}:</b> {{ forum.create_date }}</h4>
0 \ No newline at end of file 6 \ No newline at end of file
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">&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 </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>
forum/templates/post_answers/post_answer_render.html 0 → 100644
@@ -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/tests/test_view_forum.py 0 → 100644
@@ -0,0 +1,90 @@ @@ -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 +
@@ -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'
@@ -41,7 +45,6 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): @@ -41,7 +45,6 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView):
41 return self.render_to_response(self.get_context_data(form = form), status = 400) 45 return self.render_to_response(self.get_context_data(form = form), status = 400)
42 46
43 def get_success_url(self): 47 def get_success_url(self):
44 - print("Pass")  
45 self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) 48 self.success_url = reverse('course:forum:render_forum', args = (self.object.id, ))
46 49
47 return self.success_url 50 return self.success_url
@@ -49,7 +52,31 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): @@ -49,7 +52,31 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView):
49 def render_forum(request, forum): 52 def render_forum(request, forum):
50 last_forum = get_object_or_404(Forum, id = forum) 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 class ForumDeleteView(LoginRequiredMixin, generic.DeleteView): 81 class ForumDeleteView(LoginRequiredMixin, generic.DeleteView):
55 login_url = reverse_lazy("core:home") 82 login_url = reverse_lazy("core:home")
@@ -80,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView): @@ -80,6 +107,10 @@ class ForumDetailView(LoginRequiredMixin, generic.DetailView):
80 107
81 return context 108 return context
82 109
  110 +"""
  111 + Post Section
  112 +"""
  113 +
83 class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): 114 class CreatePostView(LoginRequiredMixin, generic.edit.CreateView):
84 login_url = reverse_lazy("core:home") 115 login_url = reverse_lazy("core:home")
85 redirect_field_name = 'next' 116 redirect_field_name = 'next'
@@ -131,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView): @@ -131,6 +162,12 @@ class PostDeleteView(LoginRequiredMixin, generic.DeleteView):
131 def post_deleted(request): 162 def post_deleted(request):
132 return HttpResponse(_("Post deleted successfully.")) 163 return HttpResponse(_("Post deleted successfully."))
133 164
  165 +
  166 +
  167 +"""
  168 + Post Answer Section
  169 +"""
  170 +
134 class PostAnswerIndex(LoginRequiredMixin, generic.ListView): 171 class PostAnswerIndex(LoginRequiredMixin, generic.ListView):
135 login_url = reverse_lazy("core:home") 172 login_url = reverse_lazy("core:home")
136 redirect_field_name = 'next' 173 redirect_field_name = 'next'
@@ -151,4 +188,35 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView): @@ -151,4 +188,35 @@ class CreatePostAnswerView(LoginRequiredMixin, generic.edit.CreateView):
151 188
152 template_name = 'post_answers/post_answer_form.html' 189 template_name = 'post_answers/post_answer_form.html'
153 form_class = PostAnswerForm 190 form_class = PostAnswerForm
154 - success_url = reverse_lazy('course:forum:index')  
155 \ 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."))
156 \ No newline at end of file 224 \ No newline at end of file
requirements.txt
@@ -10,12 +10,9 @@ django-role-permissions==1.2.1 @@ -10,12 +10,9 @@ django-role-permissions==1.2.1
10 django-s3direct==0.4.2 10 django-s3direct==0.4.2
11 django-widget-tweaks==1.4.1 11 django-widget-tweaks==1.4.1
12 djangorestframework==3.4.6 12 djangorestframework==3.4.6
13 -itsdangerous==0.24  
14 Jinja2==2.8 13 Jinja2==2.8
15 MarkupSafe==0.23 14 MarkupSafe==0.23
16 Pillow==3.3.1 15 Pillow==3.3.1
17 psycopg2==2.6.2 16 psycopg2==2.6.2
18 pycpfcnpj==1.0.2 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 \ No newline at end of file 19 \ No newline at end of file