US #71: Watchers
parent
4a02935230
commit
a631dc7163
|
@ -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")
|
||||
|
|
|
@ -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
|
|
@ -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):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue