Commit fe5eaf5b3911c4e5031471b43b814b21c98baffb

Authored by ailsoncgt
2 parents 1db785ec d715495d

Merge

amadeus/local_settings.py.example 0 → 100644
... ... @@ -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/forum/render_forum.html 0 → 100644
... ... @@ -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 6 \ No newline at end of file
... ...
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">
... ... @@ -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>
... ...
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: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
... ...
forum/tests/test_view_forum.py 0 → 100644
... ... @@ -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
... ...