Compare commits

...

2 Commits

Author SHA1 Message Date
NarayanBavisetti
28ece2946f chore: updated issue version with model method 2024-12-01 21:00:54 +05:30
NarayanBavisetti
9461163a9b chore: issue description history 2024-11-30 15:30:58 +05:30
4 changed files with 86 additions and 15 deletions

View File

@@ -60,7 +60,7 @@ from plane.utils.user_timezone_converter import user_timezone_converter
from plane.bgtasks.recent_visited_task import recent_visited_task
from plane.utils.global_paginator import paginate
from plane.bgtasks.webhook_task import model_activity
from plane.bgtasks.issue_version_task import issue_version_task
class IssueListEndpoint(BaseAPIView):
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST])
@@ -653,6 +653,9 @@ class IssueViewSet(BaseViewSet):
slug=slug,
origin=request.META.get("HTTP_ORIGIN"),
)
issue_version_task.delay(
issue_id=pk, existing_instance=current_instance, user_id=request.user.id
)
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

View File

@@ -0,0 +1,69 @@
# Python imports
import json
# Django imports
from django.utils import timezone
# Third party imports
from celery import shared_task
# Module imports
from plane.db.models import Issue, IssueVersion
from plane.utils.exception_logger import log_exception
@shared_task
def issue_version_task(
issue_id,
existing_instance,
user_id,
):
try:
# Get the current instance
current_instance = (
json.loads(existing_instance) if existing_instance is not None else {}
)
# Get the issue
issue = Issue.objects.get(id=issue_id)
# Create a version if description_html is updated
if current_instance.get("description_html") != issue.description_html:
# Fetch the latest issue version
issue_version = (
IssueVersion.objects.filter(issue_id=issue_id)
.order_by("-last_saved_at")
.first()
)
# Get the latest issue version if it exists and is owned by the user
if (
issue_version
and str(issue_version.owned_by) == str(user_id)
and (timezone.now() - issue_version.last_saved_at).total_seconds()
<= 600
):
issue_version.description = issue.description
issue_version.description_html = issue.description_html
issue_version.description_binary = issue.description_binary
issue_version.description_stripped = issue.description_stripped
issue_version.last_saved_at = timezone.now()
issue_version.save(
update_fields=[
"description",
"description_html",
"description_binary",
"description_stripped",
"last_saved_at",
]
)
else:
# Create a new issue version
IssueVersion.log_issue_version(issue, user_id)
return
except Issue.DoesNotExist:
return
except Exception as e:
log_exception(e)
return

View File

@@ -41,6 +41,7 @@ from .issue import (
IssueSequence,
IssueSubscriber,
IssueVote,
IssueVersion,
)
from .module import Module, ModuleIssue, ModuleLink, ModuleMember, ModuleUserProperties
from .notification import EmailNotificationLog, Notification, UserNotificationPreference
@@ -53,7 +54,6 @@ from .project import (
ProjectMemberInvite,
ProjectPublicMember,
)
from .deploy_board import DeployBoard
from .session import Session
from .social_connection import SocialLoginConnection
from .state import State
@@ -68,7 +68,6 @@ from .workspace import (
WorkspaceTheme,
WorkspaceUserProperties,
)
from .importer import Importer
from .page import Page, PageLog, PageLabel

View File

@@ -9,7 +9,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models, transaction
from django.utils import timezone
from django.db.models import Q
from django import apps
from django.apps import apps
# Module imports
from plane.utils.html_processor import strip_tags
@@ -738,7 +738,7 @@ class IssueVersion(ProjectBaseModel):
Log the issue version
"""
Module = apps.get_model("db.Module")
ModuleIssue = apps.get_model("db.ModuleIssue")
CycleIssue = apps.get_model("db.CycleIssue")
cycle_issue = CycleIssue.objects.filter(
@@ -747,10 +747,10 @@ class IssueVersion(ProjectBaseModel):
cls.objects.create(
issue=issue,
parent=issue.parent,
state=issue.state,
point=issue.point,
estimate_point=issue.estimate_point,
project_id=issue.project_id,
parent=issue.parent_id,
state=issue.state_id,
estimate_point=issue.estimate_point_id,
name=issue.name,
description=issue.description,
description_html=issue.description_html,
@@ -767,12 +767,12 @@ class IssueVersion(ProjectBaseModel):
external_source=issue.external_source,
external_id=issue.external_id,
type=issue.type,
last_saved_at=issue.last_saved_at,
assignees=issue.assignees,
labels=issue.labels,
cycle=cycle_issue.cycle if cycle_issue else None,
modules=Module.objects.filter(issue=issue).values_list(
"id", flat=True
last_saved_at=timezone.now(),
assignees=list(issue.assignees.values_list("id", flat=True)),
labels=list(issue.labels.values_list("id", flat=True)),
cycle=cycle_issue.cycle_id if cycle_issue else None,
modules=list(ModuleIssue.objects.filter(issue=issue).values_list(
"id", flat=True)
),
owned_by=user,
)