1515from plane .utils .html_processor import strip_tags
1616from plane .db .mixins import SoftDeletionManager
1717from plane .utils .exception_logger import log_exception
18+ from .base import BaseModel
1819from .project import ProjectBaseModel
1920
2021
@@ -660,24 +661,18 @@ def __str__(self):
660661
661662
662663class IssueVersion (ProjectBaseModel ):
663- issue = models .ForeignKey (
664- "db.Issue" , on_delete = models .CASCADE , related_name = "versions"
665- )
666664 PRIORITY_CHOICES = (
667665 ("urgent" , "Urgent" ),
668666 ("high" , "High" ),
669667 ("medium" , "Medium" ),
670668 ("low" , "Low" ),
671669 ("none" , "None" ),
672670 )
671+
673672 parent = models .UUIDField (blank = True , null = True )
674673 state = models .UUIDField (blank = True , null = True )
675674 estimate_point = models .UUIDField (blank = True , null = True )
676675 name = models .CharField (max_length = 255 , verbose_name = "Issue Name" )
677- description = models .JSONField (blank = True , default = dict )
678- description_html = models .TextField (blank = True , default = "<p></p>" )
679- description_stripped = models .TextField (blank = True , null = True )
680- description_binary = models .BinaryField (null = True )
681676 priority = models .CharField (
682677 max_length = 30 ,
683678 choices = PRIORITY_CHOICES ,
@@ -686,22 +681,36 @@ class IssueVersion(ProjectBaseModel):
686681 )
687682 start_date = models .DateField (null = True , blank = True )
688683 target_date = models .DateField (null = True , blank = True )
684+ assignees = ArrayField (models .UUIDField (), blank = True , default = list )
689685 sequence_id = models .IntegerField (default = 1 , verbose_name = "Issue Sequence ID" )
686+ labels = ArrayField (models .UUIDField (), blank = True , default = list )
690687 sort_order = models .FloatField (default = 65535 )
691688 completed_at = models .DateTimeField (null = True )
692689 archived_at = models .DateField (null = True )
693690 is_draft = models .BooleanField (default = False )
694691 external_source = models .CharField (max_length = 255 , null = True , blank = True )
695692 external_id = models .CharField (max_length = 255 , blank = True , null = True )
696693 type = models .UUIDField (blank = True , null = True )
697- last_saved_at = models .DateTimeField (default = timezone .now )
698- owned_by = models .UUIDField ()
699- assignees = ArrayField (models .UUIDField (), blank = True , default = list )
700- labels = ArrayField (models .UUIDField (), blank = True , default = list )
701694 cycle = models .UUIDField (null = True , blank = True )
702695 modules = ArrayField (models .UUIDField (), blank = True , default = list )
703- properties = models .JSONField (default = dict )
704- meta = models .JSONField (default = dict )
696+ properties = models .JSONField (default = dict ) # issue properties
697+ meta = models .JSONField (default = dict ) # issue meta
698+ last_saved_at = models .DateTimeField (default = timezone .now )
699+
700+ issue = models .ForeignKey (
701+ "db.Issue" , on_delete = models .CASCADE , related_name = "versions"
702+ )
703+ activity = models .ForeignKey (
704+ "db.IssueActivity" ,
705+ on_delete = models .SET_NULL ,
706+ null = True ,
707+ related_name = "versions" ,
708+ )
709+ owned_by = models .ForeignKey (
710+ settings .AUTH_USER_MODEL ,
711+ on_delete = models .CASCADE ,
712+ related_name = "issue_versions" ,
713+ )
705714
706715 class Meta :
707716 verbose_name = "Issue Version"
@@ -721,36 +730,86 @@ def log_issue_version(cls, issue, user):
721730
722731 Module = apps .get_model ("db.Module" )
723732 CycleIssue = apps .get_model ("db.CycleIssue" )
733+ IssueAssignee = apps .get_model ("db.IssueAssignee" )
734+ IssueLabel = apps .get_model ("db.IssueLabel" )
724735
725736 cycle_issue = CycleIssue .objects .filter (issue = issue ).first ()
726737
727738 cls .objects .create (
728739 issue = issue ,
729- parent = issue .parent ,
730- state = issue .state ,
731- point = issue .point ,
732- estimate_point = issue .estimate_point ,
740+ parent = issue .parent_id ,
741+ state = issue .state_id ,
742+ estimate_point = issue .estimate_point_id ,
733743 name = issue .name ,
734- description = issue .description ,
735- description_html = issue .description_html ,
736- description_stripped = issue .description_stripped ,
737- description_binary = issue .description_binary ,
738744 priority = issue .priority ,
739745 start_date = issue .start_date ,
740746 target_date = issue .target_date ,
747+ assignees = list (
748+ IssueAssignee .objects .filter (issue = issue ).values_list (
749+ "assignee_id" , flat = True
750+ )
751+ ),
741752 sequence_id = issue .sequence_id ,
753+ labels = list (
754+ IssueLabel .objects .filter (issue = issue ).values_list (
755+ "label_id" , flat = True
756+ )
757+ ),
742758 sort_order = issue .sort_order ,
743759 completed_at = issue .completed_at ,
744760 archived_at = issue .archived_at ,
745761 is_draft = issue .is_draft ,
746762 external_source = issue .external_source ,
747763 external_id = issue .external_id ,
748- type = issue .type ,
749- last_saved_at = issue .last_saved_at ,
750- assignees = issue .assignees ,
751- labels = issue .labels ,
752- cycle = cycle_issue .cycle if cycle_issue else None ,
753- modules = Module .objects .filter (issue = issue ).values_list ("id" , flat = True ),
764+ type = issue .type_id ,
765+ cycle = cycle_issue .cycle_id if cycle_issue else None ,
766+ modules = list (
767+ Module .objects .filter (issue = issue ).values_list ("id" , flat = True )
768+ ),
769+ properties = {},
770+ meta = {},
771+ last_saved_at = timezone .now (),
772+ owned_by = user ,
773+ )
774+ return True
775+ except Exception as e :
776+ log_exception (e )
777+ return False
778+
779+
780+ class IssueDescriptionVersion (ProjectBaseModel ):
781+ issue = models .ForeignKey (
782+ "db.Issue" , on_delete = models .CASCADE , related_name = "description_versions"
783+ )
784+ description_binary = models .BinaryField (null = True )
785+ description_html = models .TextField (blank = True , default = "<p></p>" )
786+ description_stripped = models .TextField (blank = True , null = True )
787+ description_json = models .JSONField (default = dict , blank = True )
788+ last_saved_at = models .DateTimeField (default = timezone .now )
789+ owned_by = models .ForeignKey (
790+ settings .AUTH_USER_MODEL ,
791+ on_delete = models .CASCADE ,
792+ related_name = "issue_description_versions" ,
793+ )
794+
795+ class Meta :
796+ verbose_name = "Issue Description Version"
797+ verbose_name_plural = "Issue Description Versions"
798+ db_table = "issue_description_versions"
799+
800+ @classmethod
801+ def log_issue_description_version (cls , issue , user ):
802+ try :
803+ """
804+ Log the issue description version
805+ """
806+ cls .objects .create (
807+ issue = issue ,
808+ description_binary = issue .description_binary ,
809+ description_html = issue .description_html ,
810+ description_stripped = issue .description_stripped ,
811+ description_json = issue .description ,
812+ last_saved_at = timezone .now (),
754813 owned_by = user ,
755814 )
756815 return True
0 commit comments