Commit e376ec1c65c67f85074a8c4cb258aecb7391b193

Authored by Zambom
1 parent fc0ed422

Adding posts visualization [Issue: #73]

amadeus/settings.py
@@ -47,7 +47,7 @@ INSTALLED_APPS = [ @@ -47,7 +47,7 @@ INSTALLED_APPS = [
47 'app', 47 'app',
48 'courses', 48 'courses',
49 'users', 49 'users',
50 - # 'forum', 50 + 'forum',
51 ] 51 ]
52 52
53 MIDDLEWARE_CLASSES = [ 53 MIDDLEWARE_CLASSES = [
core/static/css/base/amadeus.css
@@ -271,3 +271,29 @@ a.alert_message:hover{color : grey} @@ -271,3 +271,29 @@ a.alert_message:hover{color : grey}
271 .accordion_list { 271 .accordion_list {
272 background: #e0e0e0; 272 background: #e0e0e0;
273 } 273 }
  274 +
  275 +.forum_collapse {
  276 + color: #000;
  277 +}
  278 +.forum_collapse:hover, .forum_collapse:focus {
  279 + text-decoration: none;
  280 + color: #000;
  281 +}
  282 +
  283 +.timeline.post {
  284 + border-top-left-radius: 8px;
  285 + border-top-right-radius: 8px;
  286 + padding-bottom: 0px;
  287 + -webkit-padding-start: 0px !important;
  288 + width: 100%;
  289 +}
  290 +.timeline.post li {
  291 + padding: 10px;
  292 + border-bottom: 1px solid #fff;
  293 +}
  294 +.timeline.post li:last-child {
  295 + border: none;
  296 +}
  297 +.timeline.post h3 {
  298 + margin-top: 5px;
  299 +}
274 \ No newline at end of file 300 \ No newline at end of file
courses/templates/subject/form_view_teacher.html
@@ -27,6 +27,25 @@ @@ -27,6 +27,25 @@
27 27
28 $(".forum_form").show(); 28 $(".forum_form").show();
29 } 29 }
  30 +
  31 + var postsUrl = '{% url "forum:posts" %}';
  32 + var formPostsUrl = '';
  33 +
  34 + function showPosts(forum) {
  35 + if ($("#collapse" + forum).hasClass('in')) {
  36 + $("#collapse" + forum).collapse('hide');
  37 + } else {
  38 + $.ajax({
  39 + url: postsUrl,
  40 + data: {'forum': forum},
  41 + success: function(data) {
  42 + $("#collapse" + forum).find(".well").html(data);
  43 + }
  44 + });
  45 +
  46 + $("#collapse" + forum).collapse('show');
  47 + }
  48 + }
30 </script> 49 </script>
31 {% endblock %} 50 {% endblock %}
32 51
forum/admin.py
1 from django.contrib import admin 1 from django.contrib import admin
2 2
3 -# Register your models here. 3 +from .models import Forum, Post, PostAnswer
  4 +
  5 +class ForumAdmin(admin.ModelAdmin):
  6 + list_display = ['name', 'slug']
  7 + search_fields = ['name', 'slug']
  8 +
  9 +class PostAdmin(admin.ModelAdmin):
  10 + list_display = ['user', 'forum']
  11 + search_fields = ['user', 'forum']
  12 +
  13 +class PostAnswerAdmin(admin.ModelAdmin):
  14 + list_display = ['user', 'post', 'answer_date']
  15 + search_fields = ['user']
  16 +
  17 +admin.site.register(Forum, ForumAdmin)
  18 +admin.site.register(Post, PostAdmin)
  19 +admin.site.register(PostAnswer, PostAnswerAdmin)
4 \ No newline at end of file 20 \ No newline at end of file
forum/forms.py
@@ -6,13 +6,13 @@ class ForumForm(forms.ModelForm): @@ -6,13 +6,13 @@ class ForumForm(forms.ModelForm):
6 6
7 class Meta: 7 class Meta:
8 model = Forum 8 model = Forum
9 - fields = ('title', 'description') 9 + fields = ('name', 'description')
10 labels = { 10 labels = {
11 - 'title': _('Title'), 11 + 'name': _('Title'),
12 'description': _('Description') 12 'description': _('Description')
13 } 13 }
14 help_texts = { 14 help_texts = {
15 - 'title': _('Forum title'), 15 + 'name': _('Forum title'),
16 'description': _('What is this forum about?') 16 'description': _('What is this forum about?')
17 } 17 }
18 widgets = { 18 widgets = {
forum/migrations/0001_initial.py 0 → 100644
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-22 20:41
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.conf import settings
  6 +from django.db import migrations, models
  7 +import django.db.models.deletion
  8 +
  9 +
  10 +class Migration(migrations.Migration):
  11 +
  12 + initial = True
  13 +
  14 + dependencies = [
  15 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  16 + ('courses', '0001_initial'),
  17 + ]
  18 +
  19 + operations = [
  20 + migrations.CreateModel(
  21 + name='Forum',
  22 + fields=[
  23 + ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),
  24 + ('title', models.CharField(max_length=100, verbose_name='Title')),
  25 + ('description', models.TextField(blank=True, verbose_name='Description')),
  26 + ],
  27 + options={
  28 + 'verbose_name': 'Forum',
  29 + 'verbose_name_plural': 'Foruns',
  30 + },
  31 + bases=('courses.activity',),
  32 + ),
  33 + migrations.CreateModel(
  34 + name='Post',
  35 + fields=[
  36 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  37 + ('message', models.TextField(verbose_name='Post message')),
  38 + ('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')),
  39 + ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum')),
  40 + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
  41 + ],
  42 + options={
  43 + 'verbose_name': 'Post',
  44 + 'verbose_name_plural': 'Posts',
  45 + },
  46 + ),
  47 + migrations.CreateModel(
  48 + name='PostAnswer',
  49 + fields=[
  50 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  51 + ('message', models.TextField(verbose_name='Answer message')),
  52 + ('answer_date', models.DateTimeField(auto_now_add=True, verbose_name='Answer Date')),
  53 + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')),
  54 + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
  55 + ],
  56 + options={
  57 + 'verbose_name': 'Post Answer',
  58 + 'verbose_name_plural': 'Post Answers',
  59 + },
  60 + ),
  61 + ]
forum/migrations/0002_remove_forum_title.py 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-22 20:43
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('forum', '0001_initial'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.RemoveField(
  16 + model_name='forum',
  17 + name='title',
  18 + ),
  19 + ]
forum/migrations/__init__.py 0 → 100644
forum/models.py
@@ -34,7 +34,7 @@ class Post(models.Model): @@ -34,7 +34,7 @@ class Post(models.Model):
34 verbose_name_plural = _('Posts') 34 verbose_name_plural = _('Posts')
35 35
36 def __str__(self): 36 def __str__(self):
37 - return ''.join([self.user.name, " / ", self.post_date]) 37 + return ''.join([self.user.name, " / ", str(self.post_date)])
38 38
39 """ 39 """
40 It represents an answer to a forum's post 40 It represents an answer to a forum's post
forum/templates/forum_list.html
@@ -2,10 +2,16 @@ @@ -2,10 +2,16 @@
2 2
3 {% if foruns|length > 0 %} 3 {% if foruns|length > 0 %}
4 {% for forum in foruns %} 4 {% for forum in foruns %}
5 - <div class="page-header">  
6 - <h1 id="timeline">{{ forum }}</h1>  
7 - <b>Descricao: </b>{{ forum.description }}<p>  
8 - <b>Abertura: </b>{{ forum.create_date }} 5 + <a class="forum_collapse" role="button" href="javascript: showPosts('{{ forum.slug }}')" aria-expanded="false">
  6 + <div class="page-header">
  7 + <h1 id="timeline">{{ forum }}</h1>
  8 + <b>{% trans 'Description' %}: </b>{{ forum.description }}<p>
  9 + <b>{% trans 'Created in' %}: </b>{{ forum.create_date }}
  10 + </div>
  11 + </a>
  12 + <div class="collapse" id="collapse{{ forum.slug }}">
  13 + <div class="well">
  14 + </div>
9 </div> 15 </div>
10 {% endfor %} 16 {% endfor %}
11 {% else %} 17 {% else %}
@@ -13,39 +19,3 @@ @@ -13,39 +19,3 @@
13 <p>{% trans 'No forum created yet.' %}</p> 19 <p>{% trans 'No forum created yet.' %}</p>
14 </div> 20 </div>
15 {% endif %} 21 {% endif %}
16 -<!-- <ul class="timeline">  
17 - <li>  
18 - <div class="timeline-badge">  
19 - <img id="logo" src="https://uxdesign-html-japm94.c9users.io/atividades-amadeus/uxdesign-html/img/topo-amadeus.png">  
20 - </div>  
21 - <p></p>  
22 - <div class="timeline-panel">  
23 - <div class="timeline-heading">  
24 - <h4 class="timeline-title">Python is insteresting</h4>  
25 - <p><small class="text-muted"><i class="glyphicon glyphicon-time"></i> 11 hours ago by </small>Carlos </p>  
26 - </div>  
27 - <div class="timeline-body">  
28 - <p>Who knows how working a String in python?</p>  
29 - </div>  
30 - <hr>  
31 - <i class="fa fa-pencil-square-o fa-2x" aria-hidden="true"></i>  
32 - </div>  
33 - </li>  
34 - <li>  
35 - <div class="timeline-badge">  
36 - <img id="logo" src="https://uxdesign-html-japm94.c9users.io/atividades-amadeus/uxdesign-html/img/topo-amadeus.png">  
37 - </div>  
38 - <p></p>  
39 - <div class="timeline-panel">  
40 - <div class="timeline-heading">  
41 - <h4 class="timeline-title">Ruby's doubt</h4>  
42 - <p><small class="text-muted"><i class="glyphicon glyphicon-time"></i> 5 hours ago by </small>Jurandi</p>  
43 - </div>  
44 - <div class="timeline-body">  
45 - <p>How works the Gems?</p>  
46 - </div>  
47 - <hr>  
48 - <i class="fa fa-pencil-square-o fa-2x" aria-hidden="true"></i>  
49 - </div>  
50 - </li>  
51 -</ul> -->  
52 \ No newline at end of file 22 \ No newline at end of file
forum/templates/post_answer_list.html 0 → 100644
forum/templates/post_list.html 0 → 100644
@@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
  1 +{% load i18n %}
  2 +
  3 +{% if posts|length > 0 %}
  4 + <ul class="timeline post">
  5 + {% for post in posts %}
  6 + <li>
  7 + <div class="timeline-panel">
  8 + <div class="row">
  9 + <div class="col-xs-2 col-sm-2 col-md-2">
  10 + <img class="img-responsive img-rounded" src="{{ post.user.image_url }}" />
  11 + </div>
  12 + <div class="col-xs-10 col-sm-10 col-md-10">
  13 + <div class="timeline-heading">
  14 + <h3> {{ post.user }}</h3>
  15 + </div>
  16 + <div class="timeline-body">
  17 + <p><em>{{ post.message|linebreaks }}</em></p>
  18 + </div>
  19 + <hr>
  20 + <small class="text-muted">
  21 + <span class="pull-right">
  22 + <i class="glyphicon glyphicon-time"></i> {{ post.post_date|timesince }}
  23 + {% trans ' ago' %}
  24 + </span>
  25 + </small>
  26 + </div>
  27 + </div>
  28 + </div>
  29 + </li>
  30 + {% endfor %}
  31 + </ul>
  32 +{% else %}
  33 + <p>{% trans 'No posts were made yet.' %}</p>
  34 +{% endif %}
0 \ No newline at end of file 35 \ No newline at end of file
@@ -6,4 +6,5 @@ from . import views @@ -6,4 +6,5 @@ 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'^posts$', views.PostIndex.as_view(), name='posts'),
9 ] 10 ]
forum/views.py
@@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
4 from django.views import generic 4 from django.views import generic
5 from django.contrib.auth.mixins import LoginRequiredMixin 5 from django.contrib.auth.mixins import LoginRequiredMixin
6 6
7 -from .models import Forum 7 +from .models import Forum, Post
8 from courses.models import Topic 8 from courses.models import Topic
9 9
10 from .forms import ForumForm 10 from .forms import ForumForm
@@ -27,4 +27,18 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): @@ -27,4 +27,18 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView):
27 27
28 template_name = 'forum_form.html' 28 template_name = 'forum_form.html'
29 form_class = ForumForm 29 form_class = ForumForm
30 - success_url = reverse_lazy('forum:index')  
31 \ No newline at end of file 30 \ No newline at end of file
  31 + success_url = reverse_lazy('forum:index')
  32 +
  33 +class PostIndex(LoginRequiredMixin, generic.ListView):
  34 + login_url = reverse_lazy("core:home")
  35 + redirect_field_name = 'next'
  36 +
  37 + template_name = "post_list.html"
  38 + context_object_name = 'posts'
  39 +
  40 + def get_queryset(self):
  41 + forum = get_object_or_404(Forum, slug = self.request.GET.get('forum', ''))
  42 +
  43 + context = Post.objects.filter(forum = forum)
  44 +
  45 + return context
32 \ No newline at end of file 46 \ No newline at end of file