Commit 2d0e0381d3e4d1c4186c6d75e9b1a003d4febb42

Authored by Zambom
1 parent 78fc91e9

Adding general mural page

amadeus/static/css/base/amadeus.css
... ... @@ -925,4 +925,24 @@ li.item .notify_badge {
925 925 padding-right: 0px;
926 926 font-size: 16px !important;
927 927 margin: 7px 0 0 0 !important;
  928 +}
  929 +
  930 +.mural .post_make {
  931 + padding: 10px;
  932 + margin-bottom: 10px;
  933 +}
  934 +.mural .post_make .user-img {
  935 + padding: 0;
  936 +}
  937 +.mural .post_make .post-field {
  938 + padding-right: 0px;
  939 +}
  940 +.mural .post_make .post-field div {
  941 + border-width: 1px;
  942 + border-style: solid;
  943 + padding: 0px 5px;
  944 +}
  945 +.mural .post_make .post-field h4 {
  946 + cursor: text;
  947 + font-style: italic;
928 948 }
929 949 \ No newline at end of file
... ...
amadeus/static/css/base/amadeus_responsive.css
  1 +@media(min-width: 1200px) {
  2 + .mural .post_make .user-img img {
  3 + max-width: 70px;
  4 + max-height: 70px;
  5 + }
  6 +
  7 + .mural .post_make .post-field h4 {
  8 + line-height: 2.6em;
  9 + }
  10 +}
  11 +
1 12 @media(max-width: 1199px) {
2 13 .navbar .navbar-brand {
3 14 padding: 15px;
4 15 }
  16 +
  17 + .mural .post_make .user-img img {
  18 + max-width: 65px;
  19 + max-height: 65px;
  20 + }
  21 +
  22 + .mural .post_make .post-field h4 {
  23 + line-height: 2.3em;
  24 + }
5 25 }
6 26  
7 27 @media(max-width: 768px) {
... ... @@ -42,6 +62,14 @@
42 62 display:none;
43 63 }
44 64  
  65 + .mural .post_make .user-img img {
  66 + max-width: 60px;
  67 + max-height: 60px;
  68 + }
  69 +
  70 + .mural .post_make .post-field h4 {
  71 + line-height: 2em;
  72 + }
45 73 }
46 74  
47 75 @media(min-width: 768px) {
... ... @@ -82,3 +110,14 @@
82 110 margin-top: 6px;
83 111 }
84 112 }
  113 +
  114 +@media(max-width: 680px) {
  115 + .mural .post_make .user-img img {
  116 + max-width: 50px;
  117 + max-height: 50px;
  118 + }
  119 +
  120 + .mural .post_make .post-field h4 {
  121 + line-height: 1.6em;
  122 + }
  123 +}
85 124 \ No newline at end of file
... ...
amadeus/static/css/themes/green.css
... ... @@ -488,6 +488,14 @@ a.add-row {
488 488 color: #333;
489 489 }
490 490  
  491 +.mural .post_make {
  492 + background: #FFFFFF;
  493 +}
  494 +
  495 +.mural .post_make .post-field div {
  496 + border-color: #CCCCCC;
  497 +}
  498 +
491 499 @media(max-width: 768px) {
492 500 .navbar .navbar-nav .dropdown .dropdown-menu li > a {
493 501 color: #333333 !important;
... ...
amadeus/templates/base.html
... ... @@ -179,8 +179,10 @@
179 179 <i class="fa fa-graduation-cap" aria-hidden="true"></i>
180 180 </a>
181 181 </li>
182   - <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Timeline" %}">
183   - <i class="fa fa-list" aria-hidden="true" ></i>
  182 + <li class="item {{ mural_menu_active }}" data-toggle="tooltip" data-placement="right" title="{% trans "Timeline" %}">
  183 + <a href="{% url 'mural:manage_general' %}">
  184 + <i class="fa fa-list" aria-hidden="true" ></i>
  185 + </a>
184 186 </li>
185 187 <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Messages" %}">
186 188 <i class="fa fa-envelope-o" aria-hidden="true"></i>
... ... @@ -228,8 +230,10 @@
228 230 <i class="fa fa-graduation-cap" aria-hidden="true"></i>
229 231 </a>
230 232 </li>
231   - <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Timeline" %}">
232   - <i class="fa fa-list" aria-hidden="true" ></i>
  233 + <li class="item {{ mural_menu_active }}" data-toggle="tooltip" data-placement="top" title="{% trans "Timeline" %}">
  234 + <a href="{% url 'mural:manage_general' %}"
  235 + <i class="fa fa-list" aria-hidden="true" ></i>
  236 + </a>
233 237 </li>
234 238 <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Messages" %}">
235 239 <i class="fa fa-envelope-o" aria-hidden="true"></i>
... ...
amadeus/urls.py
... ... @@ -29,6 +29,7 @@ urlpatterns = [
29 29 url(r'^subjects/', include('subjects.urls', namespace = 'subjects')),
30 30 url(r'^groups/', include('students_group.urls', namespace = 'groups')),
31 31 url(r'^topics/', include('topics.urls', namespace = 'topics')),
  32 + url(r'^mural/', include('mural.urls', namespace = 'mural')),
32 33 url(r'^webpages/', include('webpage.urls', namespace = 'webpages')),
33 34 url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')),
34 35 url(r'^file_links/', include('file_link.urls', namespace = 'file_links')),
... ...
mural/migrations/0002_muralvisualizations.py 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2017-02-03 21:56
  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 + dependencies = [
  13 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  14 + ('mural', '0001_initial'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.CreateModel(
  19 + name='MuralVisualizations',
  20 + fields=[
  21 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  22 + ('viewed', models.BooleanField(default=False, verbose_name='Viewed')),
  23 + ('comment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='visualization_comment', to='mural.Comment', verbose_name='Comment')),
  24 + ('post', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='visualization_post', to='mural.Mural', verbose_name='Post')),
  25 + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='visualization_user', to=settings.AUTH_USER_MODEL, verbose_name='User')),
  26 + ],
  27 + ),
  28 + ]
... ...
mural/models.py
... ... @@ -39,4 +39,10 @@ class Comment(models.Model):
39 39 post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'comment_post')
40 40 user = models.ForeignKey(User, verbose_name = _('User'), related_name = "comment_user", null = True)
41 41 create_date = models.DateTimeField(_('Create Date'), auto_now_add = True)
42   - last_update = models.DateTimeField(_('Last Update'), auto_now = True)
43 42 \ No newline at end of file
  43 + last_update = models.DateTimeField(_('Last Update'), auto_now = True)
  44 +
  45 +class MuralVisualizations(models.Model):
  46 + viewed = models.BooleanField(_('Viewed'), default = False)
  47 + post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'visualization_post', null = True)
  48 + comment = models.ForeignKey(Comment, verbose_name = _('Comment'), related_name = 'visualization_comment', null = True)
  49 + user = models.ForeignKey(User, verbose_name = _('User'), related_name = "visualization_user", null = True)
44 50 \ No newline at end of file
... ...
mural/templates/mural/list.html 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% load static i18n pagination %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +
  6 +{% block breadcrumbs %}
  7 + {{ block.super }}
  8 +
  9 + {% trans 'Mural: General' as general %}
  10 +
  11 + {% breadcrumb general 'mural:manage_general' %}
  12 +{% endblock %}
  13 +
  14 +{% block content %}
  15 + <div id="core-subjects-options-div">
  16 + <ul class="core-subjects-options">
  17 + <a href="{% url 'mural:manage_general' %}"><li class="active">{% trans "General" %} ({{ totals.general }})</li></a>
  18 + <a href=""><li>{% trans "Per Category" %} ({{ totals.category }})</li></a>
  19 + <a href=""><li>{% trans "Per Subject" %} ({{ totals.subject }})</li></a>
  20 + </ul>
  21 + </div>
  22 +
  23 + <div class="col-md-12 cards-content mural">
  24 + <div class="col-md-9 col-sm-9 col-xs-9">
  25 + <div class="row post_make">
  26 + <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 user-img">
  27 + <img src="{{ request.user.image_url }}" class="img-responsive" />
  28 + </div>
  29 + <div class="col-lg-11 col-md-11 col-sm-11 col-xs-11 post-field">
  30 + <div>
  31 + <h4>{% trans 'Wish to make a new post?' %}</h4>
  32 + </div>
  33 + </div>
  34 + </div>
  35 +
  36 + {% if posts.count > 0 %}
  37 + {% else %}
  38 + <div class="text-center no-subjects">
  39 + <i class="fa fa-list"></i>
  40 + <h4>{% trans 'There are no posts in this mural yet.' %}</h4>
  41 + </div>
  42 + {% endif %}
  43 + </div>
  44 + <div class="col-md-3 col-sm-3 col-xs-3">
  45 + </div>
  46 + </div>
  47 +{% endblock %}
0 48 \ No newline at end of file
... ...
mural/urls.py
... ... @@ -0,0 +1,6 @@
  1 +from django.conf.urls import url
  2 +from . import views
  3 +
  4 +urlpatterns = [
  5 + url(r'^$', views.GeneralIndex.as_view(), name='manage_general'),
  6 +]
0 7 \ No newline at end of file
... ...
mural/views.py
1   -from django.shortcuts import render
  1 +from django.shortcuts import get_object_or_404, redirect, render
  2 +from django.views import generic
  3 +from django.contrib import messages
  4 +from django.http import JsonResponse
  5 +from django.core.urlresolvers import reverse, reverse_lazy
  6 +from django.utils.translation import ugettext_lazy as _
  7 +from django.contrib.auth.mixins import LoginRequiredMixin
  8 +from django.db.models import Q, Count
2 9  
3   -# Create your views here.
  10 +from .models import GeneralPost, CategoryPost, SubjectPost, MuralVisualizations
  11 +
  12 +class GeneralIndex(LoginRequiredMixin, generic.ListView):
  13 + login_url = reverse_lazy("users:login")
  14 + redirect_field_name = 'next'
  15 +
  16 + template_name = 'mural/list.html'
  17 + model = GeneralPost
  18 + context_object_name = "posts"
  19 + paginate_by = 10
  20 +
  21 + totals = {}
  22 +
  23 + def get_queryset(self):
  24 + user = self.request.user
  25 +
  26 + general = GeneralPost.objects.all()
  27 +
  28 + self.totals['general'] = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & (Q(post__generalpost__isnull = False) | Q(comment__post__generalpost__isnull = False))).distinct().count()
  29 + self.totals['category'] = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & (Q(post__categorypost__space__coordinators = user) | Q(comment__post__categorypost__space__coordinators = user) | Q(post__categorypost__space__subject_category__professor = user) | Q(post__categorypost__space__subject_category__students = user) | Q(comment__post__categorypost__space__subject_category__professor = user) | Q(comment__post__categorypost__space__subject_category__students = user))).distinct().count()
  30 + self.totals['subject'] = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & (Q(post__subjectpost__space__professor = user) | Q(comment__post__subjectpost__space__professor = user) | Q(post__subjectpost__space__students = user) | Q(comment__post__subjectpost__space__students = user))).distinct().count()
  31 +
  32 + return general
  33 +
  34 + def get_context_data(self, **kwargs):
  35 + context = super(GeneralIndex, self).get_context_data(**kwargs)
  36 +
  37 + context['title'] = _('Mural')
  38 + context['totals'] = self.totals
  39 + context['mural_menu_active'] = 'subjects_menu_active'
  40 +
  41 + return context
... ...
requirements.txt
... ... @@ -35,4 +35,6 @@ whitenoise==3.2.2
35 35 django-session-security==2.4.0
36 36 django-cron==0.5.0
37 37 django-crontab==0.7.1
38   -python-dateutil==2.6.0
39 38 \ No newline at end of file
  39 +python-dateutil==2.6.0
  40 +channels==1.0.3
  41 +asgi_redis==1.0.0
40 42 \ No newline at end of file
... ...