US #71: Watchers

remotes/origin/enhancement/email-actions
David Barragán Merino 2014-03-11 10:02:56 +01:00
parent 4a02935230
commit a631dc7163
4 changed files with 40 additions and 3 deletions

View File

@ -4,7 +4,7 @@ from rest_framework import serializers
from taiga.base.serializers import PickleField, NeighborsSerializerMixin
from taiga.projects.serializers import AttachmentSerializer
from taiga.projects.mixins.notifications.serializers import WatcherValidationSerializerMixin
from . import models
@ -13,7 +13,7 @@ class IssueAttachmentSerializer(AttachmentSerializer):
fields = ("id", "name", "size", "url", "owner", "created_date", "modified_date", )
class IssueSerializer(serializers.ModelSerializer):
class IssueSerializer(WatcherValidationSerializerMixin, serializers.ModelSerializer):
tags = PickleField(required=False)
is_closed = serializers.Field(source="is_closed")
comment = serializers.SerializerMethodField("get_comment")

View File

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from django.db.models.loading import get_model
from rest_framework import serializers
class WatcherValidationSerializerMixin(object):
def validate_watchers(self, attrs, source):
values = set(attrs.get(source, []))
if values:
project = None
if "project" in attrs and attrs["project"]:
if self.object and attrs["project"] == self.object.project.id:
project = self.object.project
else:
project_model = get_model("projects", "Project")
try:
project = project_model.objects.get(project__id=attrs["project"])
except project_model.DoesNotExist:
pass
elif self.object:
project = self.object.project
if len(values) != get_model("projects", "Membership").objects.filter(project=project,
user__in=values).count():
raise serializers.ValidationError("Error, some watcher user is not a member of the project")
return attrs

View File

@ -20,9 +20,9 @@ import reversion
from taiga.base.utils.slug import slugify_uniquely
from taiga.base.utils.dicts import dict_sum
from taiga.projects.userstories.models import UserStory
from taiga.base.domains.models import DomainMember
from taiga.base.users.models import Role
from taiga.projects.userstories.models import UserStory
from . import choices
@ -528,6 +528,15 @@ def membership_post_delete(sender, instance, using, **kwargs):
instance.project.update_role_points()
# On membership object is deleted, update watchers of all objects relation.
@receiver(models.signals.post_delete, sender=Membership,
dispatch_uid='update_watchers_on_membership_post_delete')
def update_watchers_on_membership_post_delete(sender, instance, using, **kwargs):
get_model("userstories", "UserStory").watchers.through.objects.filter(user=instance.user).delete()
get_model("tasks", "Task").watchers.through.objects.filter(user=instance.user).delete()
get_model("issues", "Issue").watchers.through.objects.filter(user=instance.user).delete()
@receiver(models.signals.post_save, sender=Project, dispatch_uid='project_post_save')
def project_post_save(sender, instance, created, **kwargs):
"""