Errors on unique constraints on creation
parent
c1fe365ab8
commit
4ae4c40ba8
|
@ -474,6 +474,11 @@ class EpicStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "status"
|
move_on_destroy_related_field = "status"
|
||||||
move_on_destroy_project_default_field = "default_epic_status"
|
move_on_destroy_project_default_field = "default_epic_status"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("epic-status-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class UserStoryStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -491,6 +496,11 @@ class UserStoryStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "status"
|
move_on_destroy_related_field = "status"
|
||||||
move_on_destroy_project_default_field = "default_us_status"
|
move_on_destroy_project_default_field = "default_us_status"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("epic-user-story-status-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class PointsViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class PointsViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -508,6 +518,11 @@ class PointsViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "points"
|
move_on_destroy_related_field = "points"
|
||||||
move_on_destroy_project_default_field = "default_points"
|
move_on_destroy_project_default_field = "default_points"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("points-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class TaskStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -525,6 +540,11 @@ class TaskStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "status"
|
move_on_destroy_related_field = "status"
|
||||||
move_on_destroy_project_default_field = "default_task_status"
|
move_on_destroy_project_default_field = "default_task_status"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("task-status-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class SeverityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class SeverityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -542,6 +562,11 @@ class SeverityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "severity"
|
move_on_destroy_related_field = "severity"
|
||||||
move_on_destroy_project_default_field = "default_severity"
|
move_on_destroy_project_default_field = "default_severity"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("severity-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class PriorityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class PriorityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -558,6 +583,11 @@ class PriorityViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "priority"
|
move_on_destroy_related_field = "priority"
|
||||||
move_on_destroy_project_default_field = "default_priority"
|
move_on_destroy_project_default_field = "default_priority"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("priority-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class IssueTypeViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -574,6 +604,11 @@ class IssueTypeViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "type"
|
move_on_destroy_related_field = "type"
|
||||||
move_on_destroy_project_default_field = "default_issue_type"
|
move_on_destroy_project_default_field = "default_issue_type"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("issue-type-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
class IssueStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
ModelCrudViewSet, BulkUpdateOrderMixin):
|
ModelCrudViewSet, BulkUpdateOrderMixin):
|
||||||
|
@ -590,6 +625,12 @@ class IssueStatusViewSet(MoveOnDestroyMixin, BlockedByProjectMixin,
|
||||||
move_on_destroy_related_field = "status"
|
move_on_destroy_related_field = "status"
|
||||||
move_on_destroy_project_default_field = "default_issue_status"
|
move_on_destroy_project_default_field = "default_issue_status"
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("issue-status-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
######################################################
|
######################################################
|
||||||
## Project Template
|
## Project Template
|
||||||
|
|
|
@ -37,6 +37,7 @@ from . import models
|
||||||
from . import permissions
|
from . import permissions
|
||||||
from . import utils as milestones_utils
|
from . import utils as milestones_utils
|
||||||
|
|
||||||
|
from django_pglocks import advisory_lock
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,6 +54,11 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin,
|
||||||
)
|
)
|
||||||
queryset = models.Milestone.objects.all()
|
queryset = models.Milestone.objects.all()
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
project_id = request.DATA.get("project", 0)
|
||||||
|
with advisory_lock("milestone-creation-{}".format(project_id)):
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
res = super().list(request, *args, **kwargs)
|
res = super().list(request, *args, **kwargs)
|
||||||
self._add_taiga_info_headers()
|
self._add_taiga_info_headers()
|
||||||
|
|
|
@ -27,7 +27,6 @@ from django.utils.functional import cached_property
|
||||||
from taiga.base.utils.slug import slugify_uniquely
|
from taiga.base.utils.slug import slugify_uniquely
|
||||||
from taiga.base.utils.dicts import dict_sum
|
from taiga.base.utils.dicts import dict_sum
|
||||||
from taiga.projects.notifications.mixins import WatchedModelMixin
|
from taiga.projects.notifications.mixins import WatchedModelMixin
|
||||||
from django_pglocks import advisory_lock
|
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
import datetime
|
import datetime
|
||||||
|
@ -83,11 +82,8 @@ class Milestone(WatchedModelMixin, models.Model):
|
||||||
if not self._importing or not self.modified_date:
|
if not self._importing or not self.modified_date:
|
||||||
self.modified_date = timezone.now()
|
self.modified_date = timezone.now()
|
||||||
if not self.slug:
|
if not self.slug:
|
||||||
with advisory_lock("milestone-creation-{}".format(self.project_id)):
|
self.slug = slugify_uniquely(self.name, self.__class__)
|
||||||
self.slug = slugify_uniquely(self.name, self.__class__)
|
super().save(*args, **kwargs)
|
||||||
super().save(*args, **kwargs)
|
|
||||||
else:
|
|
||||||
super().save(*args, **kwargs)
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def cached_user_stories(self):
|
def cached_user_stories(self):
|
||||||
|
|
Loading…
Reference in New Issue