diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index 17ec0c60d..28602dc71 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -216,29 +216,35 @@ class Issue(ProjectBaseModel): with connection.cursor() as cursor: # Get an exclusive lock using the project ID as the lock key cursor.execute("SELECT pg_advisory_xact_lock(%s)", [lock_key]) + try: + # Get the last sequence for the project + last_sequence = IssueSequence.objects.filter( + project=self.project + ).aggregate(largest=models.Max("sequence"))["largest"] + self.sequence_id = last_sequence + 1 if last_sequence else 1 + # Strip the html tags using html parser + self.description_stripped = ( + None + if ( + self.description_html == "" or self.description_html is None + ) + else strip_tags(self.description_html) + ) + largest_sort_order = Issue.objects.filter( + project=self.project, state=self.state + ).aggregate(largest=models.Max("sort_order"))["largest"] + if largest_sort_order is not None: + self.sort_order = largest_sort_order + 10000 - # Get the last sequence for the project - last_sequence = IssueSequence.objects.filter( - project=self.project - ).aggregate(largest=models.Max("sequence"))["largest"] - self.sequence_id = last_sequence + 1 if last_sequence else 1 - # Strip the html tags using html parser - self.description_stripped = ( - None - if (self.description_html == "" or self.description_html is None) - else strip_tags(self.description_html) - ) - largest_sort_order = Issue.objects.filter( - project=self.project, state=self.state - ).aggregate(largest=models.Max("sort_order"))["largest"] - if largest_sort_order is not None: - self.sort_order = largest_sort_order + 10000 + super(Issue, self).save(*args, **kwargs) - super(Issue, self).save(*args, **kwargs) - - IssueSequence.objects.create( - issue=self, sequence=self.sequence_id, project=self.project - ) + IssueSequence.objects.create( + issue=self, sequence=self.sequence_id, project=self.project + ) + finally: + # Release the lock + with connection.cursor() as cursor: + cursor.execute("SELECT pg_advisory_unlock(%s)", [lock_key]) else: # Strip the html tags using html parser self.description_stripped = (