Fixed notifications problems

remotes/origin/enhancement/email-actions
Jesús Espino 2014-03-24 12:30:23 +01:00
parent cf4cc209bf
commit d254d04428
7 changed files with 222 additions and 22 deletions

View File

@ -10,7 +10,6 @@ import reversion
class WatcherMixin(models.Model):
NOTIFY_LEVEL_CHOICES = (
("all_owned_projects", _(u"All events on my projects")),
("only_watching", _(u"Only events for objects i watch")),
("only_assigned", _(u"Only events for objects assigned to me")),
("only_owner", _(u"Only events for objects owned by me")),
("no_events", _(u"No events")),
@ -48,11 +47,7 @@ class WatcherMixin(models.Model):
])
def allow_notify_project(self, project):
return self.notify_level == "all_owned_projects" and project.owner.pk == self.pk
def allow_notify_by_me(self, changer):
return (changer.pk != self.pk) or self.notify_changes_by_me
return self.notify_level == "all_owned_projects"
class WatchedMixin(models.Model):
notifiable_fields = []
@ -91,30 +86,30 @@ class WatchedMixin(models.Model):
watchers_by_role = self._get_watchers_by_role()
owner = watchers_by_role.get("owner", None)
if (owner and owner.allow_notify_owned()
and owner.allow_notify_by_me(changer)):
if owner and owner.allow_notify_owned():
watchers_to_notify.add(owner)
assigned_to = watchers_by_role.get("assigned_to", None)
if (assigned_to and assigned_to.allow_notify_assigned_to()
and assigned_to.allow_notify_by_me(changer)):
if assigned_to and assigned_to.allow_notify_assigned_to():
watchers_to_notify.add(assigned_to)
suscribed_watchers = watchers_by_role.get("suscribed_watchers", None)
if suscribed_watchers:
for suscribed_watcher in suscribed_watchers:
if (suscribed_watcher and suscribed_watcher.allow_notify_suscribed()
and suscribed_watcher.allow_notify_by_me(changer)):
if suscribed_watcher and suscribed_watcher.allow_notify_suscribed():
watchers_to_notify.add(suscribed_watcher)
(project, project_owner) = watchers_by_role.get("project_owner", (None, None))
if (project_owner
and project_owner.allow_notify_project(project)
and project_owner.allow_notify_by_me(changer)):
watchers_to_notify.add(project_owner)
project = watchers_by_role.get("project", None)
if project:
for member in project.members.all():
if member and member.allow_notify_project(project):
watchers_to_notify.add(member)
if changer.notify_changes_by_me:
watchers_to_notify.add(changer)
else:
if changer in watchers_to_notify:
watchers_to_notify.remove(changer)
return watchers_to_notify

View File

@ -258,7 +258,7 @@ class Issue(NeighborsMixin, WatchedMixin, BlockedMixin):
"owner": self.owner,
"assigned_to": self.assigned_to,
"suscribed_watchers": self.watchers.all(),
"project_owner": (self.project, self.project.owner),
"project": self.project,
}

View File

@ -123,7 +123,7 @@ class Milestone(WatchedMixin, models.Model):
def _get_watchers_by_role(self):
return {
"owner": self.owner,
"project_owner": (self.project, self.project.owner),
"project": self.project,
}
def closed_points_by_date(self, date):

View File

@ -77,7 +77,7 @@ class Question(WatchedMixin):
"owner": self.owner,
"assigned_to": self.assigned_to,
"suscribed_watchers": self.watchers.all(),
"project_owner": (self.project, self.project.owner),
"project": self.project,
}

View File

@ -91,7 +91,7 @@ class Task(WatchedMixin, BlockedMixin):
"owner": self.owner,
"assigned_to": self.assigned_to,
"suscribed_watchers": self.watchers.all(),
"project_owner": (self.project, self.project.owner),
"project": self.project,
}

View File

@ -0,0 +1,205 @@
# -*- coding: utf-8 -*-
import json
from django import test
from django.core.urlresolvers import reverse
from django.core import mail
from django.db.models import get_model
from taiga.base.users.tests import create_user
from taiga.projects.models import Project, Membership
from taiga.projects.issues.tests import create_issue
from taiga.projects.tasks.tests import create_task
from . import create_project, add_membership
class AllProjectEventsNotificationsTestCase(test.TestCase):
fixtures = ["initial_domains.json"]
def setUp(self):
self.user1 = create_user(1)
self.user2 = create_user(2)
self.user3 = create_user(3)
self.user4 = create_user(4)
self.user5 = create_user(5)
self.user1.notify_level = "all_owned_projects"
self.user1.save()
self.user2.notify_level = "all_owned_projects"
self.user2.save()
self.user3.notify_level = "all_owned_projects"
self.user3.save()
self.user4.notify_level = "all_owned_projects"
self.user4.save()
self.user5.notify_level = "all_owned_projects"
self.user5.save()
self.project1 = create_project(1, self.user1)
add_membership(self.project1, self.user1, "back")
add_membership(self.project1, self.user2, "back")
add_membership(self.project1, self.user3, "back")
add_membership(self.project1, self.user4, "back")
add_membership(self.project1, self.user5, "back")
def test_issue(self):
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user2, self.user3, self.user4, self.user5]
self.assertEqual(notified,set(expected_notified))
issue.delete()
def test_issue_with_owner_notification(self):
self.user1.notify_changes_by_me = True
self.user1.save()
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user1, self.user2, self.user3, self.user4, self.user5]
self.assertEqual(notified,set(expected_notified))
issue.delete()
self.user1.notify_changes_by_me = False
self.user1.save()
class OnlyAssigendNotificationsTestCase(test.TestCase):
fixtures = ["initial_domains.json"]
def setUp(self):
self.user1 = create_user(1)
self.user2 = create_user(2)
self.user3 = create_user(3)
self.user4 = create_user(4)
self.user5 = create_user(5)
self.user1.notify_level = "only_assigned"
self.user1.save()
self.user2.notify_level = "only_assigned"
self.user2.save()
self.user3.notify_level = "only_assigned"
self.user3.save()
self.user4.notify_level = "only_assigned"
self.user4.save()
self.user5.notify_level = "only_assigned"
self.user5.save()
self.project1 = create_project(1, self.user1)
add_membership(self.project1, self.user1, "back")
add_membership(self.project1, self.user2, "back")
add_membership(self.project1, self.user3, "back")
add_membership(self.project1, self.user4, "back")
add_membership(self.project1, self.user5, "back")
def test_issue(self):
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = []
self.assertEqual(notified,set(expected_notified))
issue.assigned_to = self.user1
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = []
self.assertEqual(notified,set(expected_notified))
issue.assigned_to = self.user2
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user2]
self.assertEqual(notified,set(expected_notified))
issue.delete()
def test_issue_with_owner_notification(self):
self.user1.notify_changes_by_me = True
self.user1.save()
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user1]
self.assertEqual(notified,set(expected_notified))
issue.assigned_to = self.user1
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user1]
self.assertEqual(notified,set(expected_notified))
issue.assigned_to = self.user2
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user1, self.user2]
self.assertEqual(notified,set(expected_notified))
issue.delete()
self.user1.notify_changes_by_me = False
self.user1.save()
class OnlyOwnerNotificationsTestCase(test.TestCase):
fixtures = ["initial_domains.json"]
def setUp(self):
self.user1 = create_user(1)
self.user2 = create_user(2)
self.user3 = create_user(3)
self.user4 = create_user(4)
self.user5 = create_user(5)
self.user1.notify_level = "only_owner"
self.user1.save()
self.user2.notify_level = "only_owner"
self.user2.save()
self.user3.notify_level = "only_owner"
self.user3.save()
self.user4.notify_level = "only_owner"
self.user4.save()
self.user5.notify_level = "only_owner"
self.user5.save()
self.project1 = create_project(1, self.user1)
add_membership(self.project1, self.user1, "back")
add_membership(self.project1, self.user2, "back")
add_membership(self.project1, self.user3, "back")
add_membership(self.project1, self.user4, "back")
add_membership(self.project1, self.user5, "back")
def test_issue(self):
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user2)
expected_notified = [self.user1]
self.assertEqual(notified,set(expected_notified))
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = []
self.assertEqual(notified,set(expected_notified))
issue.owner = self.user2
notified = issue.get_watchers_to_notify(self.user2)
expected_notified = []
self.assertEqual(notified,set(expected_notified))
issue.delete()
def test_issue_with_owner_notification(self):
self.user1.notify_changes_by_me = True
self.user1.save()
issue = create_issue(1, self.user1, self.project1)
notified = issue.get_watchers_to_notify(self.user2)
expected_notified = [self.user1]
self.assertEqual(notified,set(expected_notified))
notified = issue.get_watchers_to_notify(self.user1)
expected_notified = [self.user1]
self.assertEqual(notified,set(expected_notified))
issue.owner = self.user2
notified = issue.get_watchers_to_notify(self.user2)
expected_notified = []
self.assertEqual(notified,set(expected_notified))
issue.delete()
self.user1.notify_changes_by_me = False
self.user1.save()

View File

@ -155,7 +155,7 @@ class UserStory(NeighborsMixin, WatchedMixin, BlockedMixin, models.Model):
"owner": self.owner,
"assigned_to": self.assigned_to,
"suscribed_watchers": self.watchers.all(),
"project_owner": (self.project, self.project.owner),
"project": self.project,
}