diff --git a/circle/dashboard/forms.py b/circle/dashboard/forms.py index 4fb8df1..51cd862 100644 --- a/circle/dashboard/forms.py +++ b/circle/dashboard/forms.py @@ -1223,7 +1223,7 @@ class MyProfileForm(forms.ModelForm): class Meta: fields = ('preferred_language', 'email_notifications', - 'use_gravatar', ) + 'desktop_notifications', 'use_gravatar', ) model = Profile @property diff --git a/circle/dashboard/migrations/0004_profile_desktop_notifications.py b/circle/dashboard/migrations/0004_profile_desktop_notifications.py new file mode 100644 index 0000000..98ca121 --- /dev/null +++ b/circle/dashboard/migrations/0004_profile_desktop_notifications.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('dashboard', '0003_message'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='desktop_notifications', + field=models.BooleanField(default=False, help_text='Whether user wants to get desktop notification when an activity has finished and the window is not in focus.', verbose_name='Desktop notifications'), + ), + ] diff --git a/circle/dashboard/models.py b/circle/dashboard/models.py index 75a35f7..7cdff58 100644 --- a/circle/dashboard/models.py +++ b/circle/dashboard/models.py @@ -184,6 +184,10 @@ class Profile(Model): email_notifications = BooleanField( verbose_name=_("Email notifications"), default=True, help_text=_('Whether user wants to get digested email notifications.')) + desktop_notifications = BooleanField( + verbose_name=_("Desktop notifications"), default=False, + help_text=_('Whether user wants to get desktop notification when an ' + 'activity has finished and the window is not in focus.')) smb_password = CharField( max_length=20, verbose_name=_('Samba password'), diff --git a/circle/dashboard/static/dashboard/activity.js b/circle/dashboard/static/dashboard/activity.js index 0e1b80c..e61728c 100644 --- a/circle/dashboard/static/dashboard/activity.js +++ b/circle/dashboard/static/dashboard/activity.js @@ -169,6 +169,9 @@ $(function() { ); } else { in_progress = false; + if(document.hasFocus() === false && userWantNotifications()){ + sendNotification(generateMessageFromLastActivity()); + } if(reload_vm_detail) location.reload(); if(runs > 1) addConnectText(); } @@ -181,6 +184,38 @@ $(function() { } }); +// Notification init +$(function(){ + if(userWantNotifications()) + Notification.requestPermission(); +}); + +function generateMessageFromLastActivity(){ + var ac = $("div.activity").first(); + var error = ac.children(".timeline-icon-failed").length; + var sign = (error === 1) ? "❌ " : "✓ "; + var msg = ac.children("strong").text().replace(/\s+/g, " "); + return sign + msg; +} + +function sendNotification(message) { + var options = { icon: "/static/dashboard/img/favicon.png"}; + if (Notification.permission === "granted") { + var notification = new Notification(message, options); + } + else if (Notification.permission !== "denied") { + Notification.requestPermission(function (permission) { + if (permission === "granted") { + var notification = new Notification(message, options); + } + }); + } +} + +function userWantNotifications(){ + var dn = $("#user-options").data("desktop_notifications"); + return dn === "True"; +} function addConnectText() { var activities = $(".timeline .activity"); @@ -192,7 +227,6 @@ function addConnectText() { } } - String.prototype.hashCode = function() { var hash = 0, i, chr, len; if (this.length === 0) return hash; diff --git a/circle/dashboard/templates/dashboard/_display-name.html b/circle/dashboard/templates/dashboard/_display-name.html index c315f81..6b541d8 100644 --- a/circle/dashboard/templates/dashboard/_display-name.html +++ b/circle/dashboard/templates/dashboard/_display-name.html @@ -14,5 +14,4 @@ ({% trans "username" %}: {{ user.username }}) {% endif %} {% endif %} - {% endif %} diff --git a/circle/dashboard/templates/dashboard/base.html b/circle/dashboard/templates/dashboard/base.html index 3762cbd..3122054 100644 --- a/circle/dashboard/templates/dashboard/base.html +++ b/circle/dashboard/templates/dashboard/base.html @@ -12,6 +12,9 @@ {% block navbar %} {% if request.user.is_authenticated and request.user.pk and not request.token_user %} + + +