Commit e376ec1c65c67f85074a8c4cb258aecb7391b193

Authored by Zambom
1 parent fc0ed422

Adding posts visualization [Issue: #73]

amadeus/settings.py
... ... @@ -47,7 +47,7 @@ INSTALLED_APPS = [
47 47 'app',
48 48 'courses',
49 49 'users',
50   - # 'forum',
  50 + 'forum',
51 51 ]
52 52  
53 53 MIDDLEWARE_CLASSES = [
... ...
core/static/css/base/amadeus.css
... ... @@ -271,3 +271,29 @@ a.alert_message:hover{color : grey}
271 271 .accordion_list {
272 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 300 \ No newline at end of file
... ...
courses/templates/subject/form_view_teacher.html
... ... @@ -27,6 +27,25 @@
27 27  
28 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 49 </script>
31 50 {% endblock %}
32 51  
... ...
forum/admin.py
1 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 20 \ No newline at end of file
... ...
forum/forms.py
... ... @@ -6,13 +6,13 @@ class ForumForm(forms.ModelForm):
6 6  
7 7 class Meta:
8 8 model = Forum
9   - fields = ('title', 'description')
  9 + fields = ('name', 'description')
10 10 labels = {
11   - 'title': _('Title'),
  11 + 'name': _('Title'),
12 12 'description': _('Description')
13 13 }
14 14 help_texts = {
15   - 'title': _('Forum title'),
  15 + 'name': _('Forum title'),
16 16 'description': _('What is this forum about?')
17 17 }
18 18 widgets = {
... ...
forum/migrations/0001_initial.py 0 → 100644
... ... @@ -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 @@
  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 34 verbose_name_plural = _('Posts')
35 35  
36 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 40 It represents an answer to a forum's post
... ...
forum/templates/forum_list.html
... ... @@ -2,10 +2,16 @@
2 2  
3 3 {% if foruns|length > 0 %}
4 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 15 </div>
10 16 {% endfor %}
11 17 {% else %}
... ... @@ -13,39 +19,3 @@
13 19 <p>{% trans 'No forum created yet.' %}</p>
14 20 </div>
15 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 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 @@
  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 35 \ No newline at end of file
... ...
forum/urls.py
... ... @@ -6,4 +6,5 @@ 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'^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 4 from django.views import generic
5 5 from django.contrib.auth.mixins import LoginRequiredMixin
6 6  
7   -from .models import Forum
  7 +from .models import Forum, Post
8 8 from courses.models import Topic
9 9  
10 10 from .forms import ForumForm
... ... @@ -27,4 +27,18 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView):
27 27  
28 28 template_name = 'forum_form.html'
29 29 form_class = ForumForm
30   - success_url = reverse_lazy('forum:index')
31 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 46 \ No newline at end of file
... ...