Updating stimaations properly when removing a points value
parent
392e10a057
commit
d27abf91ac
|
@ -33,7 +33,7 @@ from taiga.base.utils.slug import slugify_uniquely
|
||||||
from taiga.projects.mixins.ordering import BulkUpdateOrderMixin
|
from taiga.projects.mixins.ordering import BulkUpdateOrderMixin
|
||||||
from taiga.projects.mixins.on_destroy import MoveOnDestroyMixin
|
from taiga.projects.mixins.on_destroy import MoveOnDestroyMixin
|
||||||
|
|
||||||
from taiga.projects.userstories.models import UserStory
|
from taiga.projects.userstories.models import UserStory, RolePoints
|
||||||
from taiga.projects.tasks.models import Task
|
from taiga.projects.tasks.models import Task
|
||||||
from taiga.projects.issues.models import Issue
|
from taiga.projects.issues.models import Issue
|
||||||
from taiga.permissions import service as permissions_service
|
from taiga.permissions import service as permissions_service
|
||||||
|
@ -277,7 +277,7 @@ class ProjectViewSet(ModelCrudViewSet):
|
||||||
## Custom values for selectors
|
## Custom values for selectors
|
||||||
######################################################
|
######################################################
|
||||||
|
|
||||||
class PointsViewSet(ModelCrudViewSet, BulkUpdateOrderMixin):
|
class PointsViewSet(MoveOnDestroyMixin, ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
model = models.Points
|
model = models.Points
|
||||||
serializer_class = serializers.PointsSerializer
|
serializer_class = serializers.PointsSerializer
|
||||||
permission_classes = (permissions.PointsPermission,)
|
permission_classes = (permissions.PointsPermission,)
|
||||||
|
@ -286,7 +286,9 @@ class PointsViewSet(ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
bulk_update_param = "bulk_points"
|
bulk_update_param = "bulk_points"
|
||||||
bulk_update_perm = "change_points"
|
bulk_update_perm = "change_points"
|
||||||
bulk_update_order_action = services.bulk_update_points_order
|
bulk_update_order_action = services.bulk_update_points_order
|
||||||
|
move_on_destroy_related_class = RolePoints
|
||||||
|
move_on_destroy_related_field = "points"
|
||||||
|
move_on_destroy_project_default_field = "default_points"
|
||||||
|
|
||||||
class UserStoryStatusViewSet(MoveOnDestroyMixin, ModelCrudViewSet, BulkUpdateOrderMixin):
|
class UserStoryStatusViewSet(MoveOnDestroyMixin, ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
model = models.UserStoryStatus
|
model = models.UserStoryStatus
|
||||||
|
|
|
@ -32,12 +32,11 @@ class MoveOnDestroyMixin:
|
||||||
return super().destroy(request, *args, **kwargs)
|
return super().destroy(request, *args, **kwargs)
|
||||||
|
|
||||||
obj = self.get_object_or_none()
|
obj = self.get_object_or_none()
|
||||||
move_item = get_object_or_404(self.model, project=obj.project, id=move_to)
|
move_item = get_object_or_404(self.model, id=move_to)
|
||||||
|
|
||||||
self.check_permissions(request, 'destroy', obj)
|
self.check_permissions(request, 'destroy', obj)
|
||||||
|
|
||||||
qs = self.move_on_destroy_related_class.objects.filter(project=obj.project,
|
qs = self.move_on_destroy_related_class.objects.filter(**{self.move_on_destroy_related_field: obj})
|
||||||
**{self.move_on_destroy_related_field: obj})
|
|
||||||
qs.update(**{self.move_on_destroy_related_field: move_item})
|
qs.update(**{self.move_on_destroy_related_field: move_item})
|
||||||
|
|
||||||
if getattr(obj.project, self.move_on_destroy_project_default_field) == obj:
|
if getattr(obj.project, self.move_on_destroy_project_default_field) == obj:
|
||||||
|
|
|
@ -48,6 +48,9 @@ class RolePoints(models.Model):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{}: {}".format(self.role.name, self.points.name)
|
return "{}: {}".format(self.role.name, self.points.name)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def project(self):
|
||||||
|
return self.user_story.project
|
||||||
|
|
||||||
class UserStory(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.Model):
|
class UserStory(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, models.Model):
|
||||||
ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
|
ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
|
||||||
|
|
|
@ -3,6 +3,7 @@ from taiga.base.utils import json
|
||||||
from taiga.projects.services import stats as stats_services
|
from taiga.projects.services import stats as stats_services
|
||||||
from taiga.projects.history.services import take_snapshot
|
from taiga.projects.history.services import take_snapshot
|
||||||
from taiga.permissions.permissions import ANON_PERMISSIONS
|
from taiga.permissions.permissions import ANON_PERMISSIONS
|
||||||
|
from taiga.projects.models import Project
|
||||||
|
|
||||||
from .. import factories as f
|
from .. import factories as f
|
||||||
|
|
||||||
|
@ -252,3 +253,27 @@ def test_anon_permissions_generation_when_making_project_public(client):
|
||||||
anon_permissions = list(map(lambda perm: perm[0], ANON_PERMISSIONS))
|
anon_permissions = list(map(lambda perm: perm[0], ANON_PERMISSIONS))
|
||||||
assert set(anon_permissions).issubset(set(response.data["anon_permissions"]))
|
assert set(anon_permissions).issubset(set(response.data["anon_permissions"]))
|
||||||
assert set(anon_permissions).issubset(set(response.data["public_permissions"]))
|
assert set(anon_permissions).issubset(set(response.data["public_permissions"]))
|
||||||
|
|
||||||
|
|
||||||
|
def test_destroy_point_and_reassign(client):
|
||||||
|
project = f.ProjectFactory.create()
|
||||||
|
f.MembershipFactory.create(project=project, user=project.owner, is_owner=True)
|
||||||
|
p1 = f.PointsFactory(project=project)
|
||||||
|
project.default_points = p1
|
||||||
|
project.save()
|
||||||
|
p2 = f.PointsFactory(project=project)
|
||||||
|
user_story = f.UserStoryFactory.create(project=project)
|
||||||
|
rp1 = f.RolePointsFactory.create(user_story=user_story, points=p1)
|
||||||
|
|
||||||
|
url = reverse("points-detail", args=[p1.pk]) + "?moveTo={}".format(p2.pk)
|
||||||
|
|
||||||
|
client.login(project.owner)
|
||||||
|
|
||||||
|
assert user_story.role_points.all()[0].points.id == p1.id
|
||||||
|
assert project.default_points.id == p1.id
|
||||||
|
|
||||||
|
response = client.delete(url)
|
||||||
|
|
||||||
|
assert user_story.role_points.all()[0].points.id == p2.id
|
||||||
|
project = Project.objects.get(id=project.id)
|
||||||
|
assert project.default_points.id == p2.id
|
||||||
|
|
Loading…
Reference in New Issue