Commit 2d0e0381d3e4d1c4186c6d75e9b1a003d4febb42
1 parent
78fc91e9
Exists in
master
and in
3 other branches
Adding general mural page
Showing
11 changed files
with
207 additions
and
8 deletions
Show diff stats
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')), | ... | ... |
| ... | ... | @@ -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 | ... | ... |
| ... | ... | @@ -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
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 | ... | ... |