Commit f89a35b28c768cdae6448bcb8ca827f62fef2c2d

Authored by Zambom
1 parent 10885250

Add post creation [Issue: #74]

courses/templates/subject/form_view_teacher.html
... ... @@ -32,16 +32,6 @@
32 32 <div class="modal-body">
33 33 <section>
34 34 <div class="forum_topics"></div>
35   - <div class="form-group">
36   - <div class="input-group">
37   - <textarea type="text" id="addon3a" class="form-control" placeholder="{% trans 'Post a comment...' %}"></textarea>
38   - <span class="input-group-btn">
39   - <button type="button" class="btn btn-fab btn-fab-mini">
40   - <i class="material-icons">send</i>
41   - </button>
42   - </span>
43   - </div>
44   - </div>
45 35 </section>
46 36 </div>
47 37 <div class="modal-footer">
... ...
forum/forms.py
1 1 from django import forms
2 2 from django.utils.translation import ugettext_lazy as _
3   -from .models import Forum, PostAnswer
  3 +from .models import Forum, Post, PostAnswer
4 4  
5 5 class ForumForm(forms.ModelForm):
6 6  
... ... @@ -19,6 +19,19 @@ class ForumForm(forms.ModelForm):
19 19 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
20 20 }
21 21  
  22 +class PostForm(forms.ModelForm):
  23 +
  24 + class Meta:
  25 + model = Post
  26 + fields = ('message', 'forum', )
  27 + labels = {
  28 + 'message': _('Message')
  29 + }
  30 + widgets = {
  31 + 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
  32 + 'forum': forms.HiddenInput(),
  33 + }
  34 +
22 35 class PostAnswerForm(forms.ModelForm):
23 36  
24 37 class Meta:
... ...
forum/static/js/forum.js
... ... @@ -9,6 +9,24 @@ function showForum(url, forum_id) {
9 9 data: {'forum_id': forum_id},
10 10 success: function(data) {
11 11 $(".forum_topics").html(data);
  12 +
  13 + var frm = $('#form_post');
  14 + frm.submit(function () {
  15 + $.ajax({
  16 + type: frm.attr('method'),
  17 + url: frm.attr('action'),
  18 + data: frm.serialize(),
  19 + success: function (data) {
  20 + $("#posts_list").append(data);
  21 + frm[0].reset();
  22 + },
  23 + error: function(data) {
  24 + console.log(frm.serialize());
  25 + console.log('Error');
  26 + }
  27 + });
  28 + return false;
  29 + });
12 30 }
13 31 });
14 32  
... ...
forum/templates/forum/forum_list.html
1 1 {% load i18n permission_tags list_post %}
  2 +{% load widget_tweaks %}
2 3  
3 4 <div class="comments-list">
4 5 <div class="section-heading">
... ... @@ -8,7 +9,45 @@
8 9 </div>
9 10 </div>
10 11  
11   -{% list_posts request forum %}
  12 +<div id="posts_list">
  13 + {% list_posts request forum %}
  14 +</div>
  15 +
  16 +<form id="form_post" method="post" action="{% url 'forum:create_post' %}" enctype="multipart/form-data">
  17 + {% csrf_token %}
  18 + {% for field in form %}
  19 + {% if field.field.widget.input_type == 'hidden' %}
  20 + {% render_field field class='form-control' value=forum.id %}
  21 + {% else %}
  22 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  23 + <div class="input-group">
  24 + {% render_field field class='form-control' placeholder="Post a message" %}
  25 + <span class="help-block">{{ field.help_text }}</span>
  26 + {% if field.errors %}
  27 + <div class="row">
  28 + <br />
  29 + <div class="alert alert-danger alert-dismissible" role="alert">
  30 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  31 + <span aria-hidden="true">&times;</span>
  32 + </button>
  33 + <ul>
  34 + {% for error in field.errors %}
  35 + <li>{{ error }}</li>
  36 + {% endfor %}
  37 + </ul>
  38 + </div>
  39 + </div>
  40 + {% endif %}
  41 + <span class="input-group-btn">
  42 + <button type="submit" class="btn btn-fab btn-fab-mini">
  43 + <i class="material-icons">send</i>
  44 + </button>
  45 + </span>
  46 + </div>
  47 + </div>
  48 + {% endif %}
  49 + {% endfor %}
  50 +</form>
12 51  
13 52 <!--{% if foruns|length > 0 %}
14 53 {% for forum in foruns %}
... ...
forum/templates/post/post_render.html 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +{% load i18n permission_tags %}
  2 +
  3 +<div class="row">
  4 + <div id="post_{{ post.id }}" class="col-sm-12 col-xs-12">
  5 + <h3 class="user-name">
  6 + {{ post.user }}
  7 + <div class="pull-right">
  8 + <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');">
  9 + <i class="material-icons">reply</i>
  10 + </a>
  11 + {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %}
  12 + <div class="btn-group icon-more-horiz">
  13 + <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  14 + <i class="material-icons">more_horiz</i>
  15 + </a>
  16 + <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
  17 + <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li>
  18 + <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li>
  19 + </ul>
  20 + </div>
  21 + {% endif %}
  22 + </div>
  23 + </h3>
  24 + <div class="card-data">
  25 + <p class="comment-date"><i class="fa fa-clock-o"></i> {{ post.post_date }}</p>
  26 + </div>
  27 + <p class="comment-text">{{ post.message|linebreaks }}</p>
  28 + <div class="answer_post"></div>
  29 + </div>
  30 +</div>
0 31 \ No newline at end of file
... ...
forum/templates/post_answers/post_answer_form.html
... ... @@ -25,7 +25,7 @@
25 25 </div>
26 26 {% endif %}
27 27 <span class="input-group-btn">
28   - <button type="button" class="btn btn-fab btn-fab-mini">
  28 + <button type="submit" class="btn btn-fab btn-fab-mini">
29 29 <i class="material-icons">send</i>
30 30 </button>
31 31 </span>
... ...
forum/urls.py
... ... @@ -7,6 +7,8 @@ urlpatterns = [
7 7 url(r'^$', views.ForumIndex.as_view(), name='index'),
8 8 url(r'^create$', views.CreateForumView.as_view(), name='create'),
9 9 url(r'^posts$', views.PostIndex.as_view(), name='posts'),
  10 + url(r'^create_post$', views.CreatePostView.as_view(), name='create_post'),
  11 + url(r'^render+post/([\w_-]+)/$', views.render_post, name='render_post'),
10 12 url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'),
11 13 url(r'^reply_post$', views.CreatePostAnswerView.as_view(), name='reply_post'),
12 14 ]
... ...
forum/views.py
1 1 from django.shortcuts import render, get_object_or_404
2   -from django.core.urlresolvers import reverse_lazy
  2 +from django.core.urlresolvers import reverse, reverse_lazy
3 3 from django.utils.translation import ugettext_lazy as _
4 4 from django.views import generic
5 5 from django.contrib.auth.mixins import LoginRequiredMixin
... ... @@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
7 7 from .models import Forum, Post, PostAnswer
8 8 from courses.models import Topic
9 9  
10   -from .forms import ForumForm, PostAnswerForm
  10 +from .forms import ForumForm, PostForm, PostAnswerForm
11 11  
12 12 class ForumIndex(LoginRequiredMixin, generic.ListView):
13 13 login_url = reverse_lazy("core:home")
... ... @@ -20,6 +20,12 @@ class ForumIndex(LoginRequiredMixin, generic.ListView):
20 20 forum_id = self.request.GET.get('forum_id', 0)
21 21  
22 22 context = Forum.objects.get(id = forum_id)
  23 +
  24 + return context
  25 +
  26 + def get_context_data(self, **kwargs):
  27 + context = super(ForumIndex, self).get_context_data(**kwargs)
  28 + context['form'] = PostForm()
23 29  
24 30 return context
25 31  
... ... @@ -43,6 +49,33 @@ class PostIndex(LoginRequiredMixin, generic.ListView):
43 49  
44 50 return context
45 51  
  52 +class CreatePostView(LoginRequiredMixin, generic.edit.CreateView):
  53 + login_url = reverse_lazy("core:home")
  54 + redirect_field_name = 'next'
  55 +
  56 + form_class = PostForm
  57 +
  58 + def form_valid(self, form):
  59 + self.object = form.save(commit = False)
  60 + self.object.user = self.request.user
  61 +
  62 + self.object.save()
  63 +
  64 + return super(CreatePostView, self).form_valid(form)
  65 +
  66 + def get_success_url(self):
  67 + self.success_url = reverse('forum:render_post', args = (self.object.id, ))
  68 +
  69 + return self.success_url
  70 +
  71 +def render_post(request, post):
  72 + last_post = get_object_or_404(Post, id = post)
  73 +
  74 + context = {}
  75 + context['post'] = last_post
  76 +
  77 + return render(request, "post/post_render.html", context)
  78 +
46 79 class PostAnswerIndex(LoginRequiredMixin, generic.ListView):
47 80 login_url = reverse_lazy("core:home")
48 81 redirect_field_name = 'next'
... ...
requirements.txt
... ... @@ -10,7 +10,6 @@ itsdangerous==0.24
10 10 Jinja2==2.8
11 11 MarkupSafe==0.23
12 12 Pillow==3.3.1
13   -pkg-resources==0.0.0
14 13 pycpfcnpj==1.0.2
15 14 six==1.10.0
16 15 slugify==0.0.1
... ...