Commit 59532809 by Dudás Ádám

Merge branch 'issue_444' into 'master'

Send a notification when an activity has finished and the window not in focus

Issue: #444

See merge request !366
parents 68dc757d b26bfcad
...@@ -1223,7 +1223,7 @@ class MyProfileForm(forms.ModelForm): ...@@ -1223,7 +1223,7 @@ class MyProfileForm(forms.ModelForm):
class Meta: class Meta:
fields = ('preferred_language', 'email_notifications', fields = ('preferred_language', 'email_notifications',
'use_gravatar', ) 'desktop_notifications', 'use_gravatar', )
model = Profile model = Profile
@property @property
......
# -*- 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'),
),
]
...@@ -184,6 +184,10 @@ class Profile(Model): ...@@ -184,6 +184,10 @@ class Profile(Model):
email_notifications = BooleanField( email_notifications = BooleanField(
verbose_name=_("Email notifications"), default=True, verbose_name=_("Email notifications"), default=True,
help_text=_('Whether user wants to get digested email notifications.')) 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( smb_password = CharField(
max_length=20, max_length=20,
verbose_name=_('Samba password'), verbose_name=_('Samba password'),
......
...@@ -169,6 +169,9 @@ $(function() { ...@@ -169,6 +169,9 @@ $(function() {
); );
} else { } else {
in_progress = false; in_progress = false;
if(document.hasFocus() === false && userWantNotifications()){
sendNotification(generateMessageFromLastActivity());
}
if(reload_vm_detail) location.reload(); if(reload_vm_detail) location.reload();
if(runs > 1) addConnectText(); if(runs > 1) addConnectText();
} }
...@@ -181,6 +184,38 @@ $(function() { ...@@ -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() { function addConnectText() {
var activities = $(".timeline .activity"); var activities = $(".timeline .activity");
...@@ -192,7 +227,6 @@ function addConnectText() { ...@@ -192,7 +227,6 @@ function addConnectText() {
} }
} }
String.prototype.hashCode = function() { String.prototype.hashCode = function() {
var hash = 0, i, chr, len; var hash = 0, i, chr, len;
if (this.length === 0) return hash; if (this.length === 0) return hash;
......
...@@ -14,5 +14,4 @@ ...@@ -14,5 +14,4 @@
({% trans "username" %}: {{ user.username }}) ({% trans "username" %}: {{ user.username }})
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
{% block navbar %} {% block navbar %}
{% if request.user.is_authenticated and request.user.pk and not request.token_user %} {% if request.user.is_authenticated and request.user.pk and not request.token_user %}
<span id="user-options" data-desktop_notifications="{{ request.user.profile.desktop_notifications }}"><span>
<ul class="nav navbar-nav navbar-right" id="dashboard-menu"> <ul class="nav navbar-nav navbar-right" id="dashboard-menu">
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
{% if ADMIN_ENABLED %} {% if ADMIN_ENABLED %}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment