Commit ed90db29fef6d4370802020766241402bda83bcb
1 parent
6f82ec2d
Exists in
master
and in
3 other branches
Adding notifications count badge
Showing
11 changed files
with
126 additions
and
32 deletions
Show diff stats
amadeus/context_processors.py
1 | +from datetime import datetime | ||
2 | + | ||
1 | from themes.models import Themes | 3 | from themes.models import Themes |
4 | +from notifications.models import Notification | ||
2 | 5 | ||
3 | def theme(request): | 6 | def theme(request): |
4 | context = {} | 7 | context = {} |
@@ -7,4 +10,13 @@ def theme(request): | @@ -7,4 +10,13 @@ def theme(request): | ||
7 | 10 | ||
8 | context['theme'] = theme | 11 | context['theme'] = theme |
9 | 12 | ||
13 | + return context | ||
14 | + | ||
15 | +def notifies(request): | ||
16 | + context = {} | ||
17 | + | ||
18 | + notifications = Notification.objects.filter(creation_date = datetime.now()).count() | ||
19 | + | ||
20 | + context['notifications_count'] = notifications | ||
21 | + | ||
10 | return context | 22 | return context |
11 | \ No newline at end of file | 23 | \ No newline at end of file |
amadeus/settings.py
@@ -103,6 +103,7 @@ TEMPLATES = [ | @@ -103,6 +103,7 @@ TEMPLATES = [ | ||
103 | 'django.contrib.auth.context_processors.auth', | 103 | 'django.contrib.auth.context_processors.auth', |
104 | 'django.contrib.messages.context_processors.messages', | 104 | 'django.contrib.messages.context_processors.messages', |
105 | 'amadeus.context_processors.theme', | 105 | 'amadeus.context_processors.theme', |
106 | + 'amadeus.context_processors.notifies', | ||
106 | ], | 107 | ], |
107 | }, | 108 | }, |
108 | }, | 109 | }, |
@@ -171,7 +172,7 @@ STATICFILES_DIRS = [ | @@ -171,7 +172,7 @@ STATICFILES_DIRS = [ | ||
171 | ] | 172 | ] |
172 | 173 | ||
173 | CRON_CLASSES = [ | 174 | CRON_CLASSES = [ |
174 | - 'notifications.cron.Test' | 175 | + 'notifications.cron.Notify' |
175 | ] | 176 | ] |
176 | 177 | ||
177 | #SECURITY | 178 | #SECURITY |
amadeus/static/css/base/amadeus.css
@@ -30,36 +30,28 @@ a:focus { | @@ -30,36 +30,28 @@ a:focus { | ||
30 | 30 | ||
31 | .users-cloud .small a { | 31 | .users-cloud .small a { |
32 | font-size: 1.25em; | 32 | font-size: 1.25em; |
33 | - color: #2E8B57; | ||
34 | } | 33 | } |
35 | 34 | ||
36 | 35 | ||
37 | .users-cloud .big a { | 36 | .users-cloud .big a { |
38 | font-size: 2.25em; | 37 | font-size: 2.25em; |
39 | - color: #6B8E23; | ||
40 | } | 38 | } |
41 | 39 | ||
42 | .users-cloud .medium a { | 40 | .users-cloud .medium a { |
43 | font-size: 1.75em; | 41 | font-size: 1.75em; |
44 | - color: #66CDAA; | ||
45 | } | 42 | } |
46 | 43 | ||
47 | .users-cloud .tiny a { | 44 | .users-cloud .tiny a { |
48 | font-size: 0.75em; | 45 | font-size: 0.75em; |
49 | - color: #654321; | ||
50 | } | 46 | } |
51 | .users-cloud a { | 47 | .users-cloud a { |
52 | text-decoration: none; | 48 | text-decoration: none; |
53 | } | 49 | } |
54 | 50 | ||
55 | -#search-results-title{ | ||
56 | - color: #BDBDBD; | ||
57 | -} | ||
58 | - | ||
59 | .div-users-cloud{ | 51 | .div-users-cloud{ |
60 | - height: 100%; | ||
61 | - margin-left: -10px; | ||
62 | - width: 100%; | 52 | + height: 100%; |
53 | + margin-left: -10px; | ||
54 | + width: 100%; | ||
63 | } | 55 | } |
64 | 56 | ||
65 | .my-subjects-title { | 57 | .my-subjects-title { |
@@ -590,11 +582,6 @@ a:focus { | @@ -590,11 +582,6 @@ a:focus { | ||
590 | .subscribe-subject { | 582 | .subscribe-subject { |
591 | border:none; | 583 | border:none; |
592 | } | 584 | } |
593 | - | ||
594 | -.no-subscribe-btn{ | ||
595 | - background-color: #BDBDBD !important; | ||
596 | - color: #F5F5F5 !important; | ||
597 | -} | ||
598 | /* subjects app ends */ | 585 | /* subjects app ends */ |
599 | 586 | ||
600 | /* Themes */ | 587 | /* Themes */ |
@@ -827,4 +814,24 @@ a.add-row { | @@ -827,4 +814,24 @@ a.add-row { | ||
827 | 814 | ||
828 | .add_resource ul { | 815 | .add_resource ul { |
829 | width: 100%; | 816 | width: 100%; |
817 | +} | ||
818 | + | ||
819 | +.action_icon { | ||
820 | + position: relative; | ||
821 | +} | ||
822 | + | ||
823 | +li.item .notify_badge { | ||
824 | + top: 0px; | ||
825 | + right: 0px; | ||
826 | +} | ||
827 | + | ||
828 | +.notify_badge { | ||
829 | + position: absolute; | ||
830 | + right: 4px; | ||
831 | + top: -5px; | ||
832 | + width: 1.9rem; | ||
833 | + line-height: 1.9rem; | ||
834 | + font-size: 0.9rem; | ||
835 | + border-radius: 50%; | ||
836 | + padding: 0px; | ||
830 | } | 837 | } |
831 | \ No newline at end of file | 838 | \ No newline at end of file |
amadeus/static/css/themes/green.css
@@ -397,6 +397,35 @@ a.add-row { | @@ -397,6 +397,35 @@ a.add-row { | ||
397 | background-color: initial !important; | 397 | background-color: initial !important; |
398 | } | 398 | } |
399 | 399 | ||
400 | +.notify_badge { | ||
401 | + background-color: #FF0000 !important; | ||
402 | +} | ||
403 | + | ||
404 | +#search-results-title{ | ||
405 | + color: #BDBDBD; | ||
406 | +} | ||
407 | + | ||
408 | +.users-cloud .small a { | ||
409 | + color: #2E8B57; | ||
410 | +} | ||
411 | + | ||
412 | +.users-cloud .big a { | ||
413 | + color: #6B8E23; | ||
414 | +} | ||
415 | + | ||
416 | +.users-cloud .medium a { | ||
417 | + color: #66CDAA; | ||
418 | +} | ||
419 | + | ||
420 | +.users-cloud .tiny a { | ||
421 | + color: #654321; | ||
422 | +} | ||
423 | + | ||
424 | +.no-subscribe-btn{ | ||
425 | + background-color: #BDBDBD !important; | ||
426 | + color: #F5F5F5 !important; | ||
427 | +} | ||
428 | + | ||
400 | @media(max-width: 768px) { | 429 | @media(max-width: 768px) { |
401 | .navbar .navbar-nav .dropdown .dropdown-menu li > a { | 430 | .navbar .navbar-nav .dropdown .dropdown-menu li > a { |
402 | color: #333333 !important; | 431 | color: #333333 !important; |
amadeus/templates/base.html
@@ -160,8 +160,13 @@ | @@ -160,8 +160,13 @@ | ||
160 | <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Messages" %}"> | 160 | <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Messages" %}"> |
161 | <i class="fa fa-envelope-o" aria-hidden="true"></i> | 161 | <i class="fa fa-envelope-o" aria-hidden="true"></i> |
162 | </li> | 162 | </li> |
163 | - <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Pendencias" %}"> | ||
164 | - <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | 163 | + <li class="item action_icon" data-toggle="tooltip" data-placement="right" title="{% trans "Pendencias" %}"> |
164 | + <a href=""> | ||
165 | + <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | ||
166 | + {% if notifications_count > 0 %} | ||
167 | + <span class="badge notify_badge">{% if notifications_count > 99 %} +99 {% else %} {{ notifications_count }} {% endif %}</span> | ||
168 | + {% endif %} | ||
169 | + </a> | ||
165 | </li> | 170 | </li> |
166 | <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Analytics" %}"> | 171 | <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Analytics" %}"> |
167 | <i class="fa fa-bar-chart" aria-hidden="true"></i> | 172 | <i class="fa fa-bar-chart" aria-hidden="true"></i> |
@@ -204,8 +209,13 @@ | @@ -204,8 +209,13 @@ | ||
204 | <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Messages" %}"> | 209 | <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Messages" %}"> |
205 | <i class="fa fa-envelope-o" aria-hidden="true"></i> | 210 | <i class="fa fa-envelope-o" aria-hidden="true"></i> |
206 | </li> | 211 | </li> |
207 | - <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Pendencias" %}"> | ||
208 | - <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | 212 | + <li class="item action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Pendencias" %}"> |
213 | + <a href=""> | ||
214 | + <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | ||
215 | + {% if notifications_count > 0 %} | ||
216 | + <span class="badge notify_badge">{% if notifications_count > 99 %} +99 {% else %} {{ notifications_count }} {% endif %}</span> | ||
217 | + {% endif %} | ||
218 | + </a> | ||
209 | </li> | 219 | </li> |
210 | <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Analytics" %}"> | 220 | <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Analytics" %}"> |
211 | <i class="fa fa-bar-chart" aria-hidden="true"></i> | 221 | <i class="fa fa-bar-chart" aria-hidden="true"></i> |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +from django import template | ||
2 | +from datetime import datetime | ||
3 | + | ||
4 | +from notifications.models import Notification | ||
5 | + | ||
6 | +register = template.Library() | ||
7 | + | ||
8 | +@register.inclusion_tag('subjects/badge.html') | ||
9 | +def notifies_cat_number(category): | ||
10 | + context = {} | ||
11 | + | ||
12 | + context['number'] = Notification.objects.filter(task__resource__topic__subject__category = category, creation_date = datetime.now()).count() | ||
13 | + | ||
14 | + return context | ||
0 | \ No newline at end of file | 15 | \ No newline at end of file |
notifications/cron.py
@@ -3,7 +3,7 @@ from django_cron import CronJobBase, Schedule | @@ -3,7 +3,7 @@ from django_cron import CronJobBase, Schedule | ||
3 | 3 | ||
4 | from .utils import set_notifications | 4 | from .utils import set_notifications |
5 | 5 | ||
6 | -class Test(CronJobBase): | 6 | +class Notify(CronJobBase): |
7 | RUN_EVERY_MINS = 1 # every minute | 7 | RUN_EVERY_MINS = 1 # every minute |
8 | 8 | ||
9 | schedule = Schedule(run_every_mins=RUN_EVERY_MINS) | 9 | schedule = Schedule(run_every_mins=RUN_EVERY_MINS) |
subjects/templates/subjects/list.html
1 | {% extends 'categories/home.html' %} | 1 | {% extends 'categories/home.html' %} |
2 | 2 | ||
3 | {% load static i18n pagination %} | 3 | {% load static i18n pagination %} |
4 | -{% load django_bootstrap_breadcrumbs subject_counter %} | 4 | +{% load django_bootstrap_breadcrumbs subject_counter category_counters %} |
5 | 5 | ||
6 | {% block javascript%} | 6 | {% block javascript%} |
7 | {{ block.super }} | 7 | {{ block.super }} |
@@ -79,10 +79,14 @@ | @@ -79,10 +79,14 @@ | ||
79 | <a href="javascript:delete_course.get('{% url 'categories:delete' category.slug %}?view=index','#category','#modal_course')" aria-hidden="true"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li> | 79 | <a href="javascript:delete_course.get('{% url 'categories:delete' category.slug %}?view=index','#category','#modal_course')" aria-hidden="true"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li> |
80 | </ul> | 80 | </ul> |
81 | {% endif %} | 81 | {% endif %} |
82 | - <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a> | ||
83 | - <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a> | ||
84 | - <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a> | ||
85 | - <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a> | 82 | + |
83 | + <a href="" class="pull-right action_icon"><i class="fa fa-bar-chart" aria-hidden="true"></i></a> | ||
84 | + <a href="" class="pull-right action_icon"> | ||
85 | + <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | ||
86 | + {% notifies_cat_number category %} | ||
87 | + </a> | ||
88 | + <a href="" class="pull-right action_icon"><i class="fa fa-envelope-o" aria-hidden="true"></i></a> | ||
89 | + <a href="" class="pull-right action_icon"><i class="fa fa-list" aria-hidden="true"></i></a> | ||
86 | </div> | 90 | </div> |
87 | </div> | 91 | </div> |
88 | </div> | 92 | </div> |
subjects/templates/subjects/subject_card.html
@@ -36,10 +36,13 @@ | @@ -36,10 +36,13 @@ | ||
36 | 36 | ||
37 | 37 | ||
38 | 38 | ||
39 | - <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a> | ||
40 | - <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a> | ||
41 | - <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a> | ||
42 | - <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a> | 39 | + <a href="" class="pull-right action_icon"><i class="fa fa-bar-chart" aria-hidden="true"></i></a> |
40 | + <a href="" class="pull-right action_icon"> | ||
41 | + <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | ||
42 | + {% notifies_number subject %} | ||
43 | + </a> | ||
44 | + <a href="" class="pull-right action_icon"><i class="fa fa-envelope-o" aria-hidden="true"></i></a> | ||
45 | + <a href="" class="pull-right action_icon"><i class="fa fa-list" aria-hidden="true"></i></a> | ||
43 | </div> | 46 | </div> |
44 | </div> | 47 | </div> |
45 | </div> | 48 | </div> |
subjects/templatetags/subject_counter.py
1 | -from django import template | ||
2 | import datetime | 1 | import datetime |
2 | +from django import template | ||
3 | +from django.db.models import Q | ||
4 | + | ||
5 | +from notifications.models import Notification | ||
6 | + | ||
3 | register = template.Library() | 7 | register = template.Library() |
4 | 8 | ||
5 | @register.filter(name = 'subject_count') | 9 | @register.filter(name = 'subject_count') |
@@ -15,6 +19,13 @@ def subject_count(category, user): | @@ -15,6 +19,13 @@ def subject_count(category, user): | ||
15 | 19 | ||
16 | return total | 20 | return total |
17 | 21 | ||
22 | +@register.inclusion_tag('subjects/badge.html') | ||
23 | +def notifies_number(subject): | ||
24 | + context = {} | ||
25 | + | ||
26 | + context['number'] = Notification.objects.filter(task__resource__topic__subject = subject, creation_date = datetime.datetime.now()).count() | ||
27 | + | ||
28 | + return context | ||
18 | 29 | ||
19 | @register.filter(name = 'aftertoday') | 30 | @register.filter(name = 'aftertoday') |
20 | def after_today(date): | 31 | def after_today(date): |