Create a revision of the segment
(self, is_revision: bool = False, **extra_attrs: typing.Any)
| 150 | |
| 151 | @transaction.atomic |
| 152 | def clone(self, is_revision: bool = False, **extra_attrs: typing.Any) -> "Segment": |
| 153 | """ |
| 154 | Create a revision of the segment |
| 155 | """ |
| 156 | cloned_segment = deepcopy(self) |
| 157 | cloned_segment.pk = None |
| 158 | cloned_segment.uuid = uuid.uuid4() |
| 159 | cloned_segment.version_of = None # Unset for now |
| 160 | cloned_segment.version = 0 # Unset for now |
| 161 | for attr_name, value in extra_attrs.items(): |
| 162 | setattr(cloned_segment, attr_name, value) |
| 163 | cloned_segment.save() |
| 164 | |
| 165 | cloned_segment.copy_rules_and_conditions_from(self) |
| 166 | |
| 167 | # Handle versioning |
| 168 | version_of = self if is_revision else cloned_segment |
| 169 | cloned_segment.version_of = extra_attrs.get("version_of", version_of) |
| 170 | cloned_segment.version = self.version if is_revision else 1 |
| 171 | Segment.objects.filter(pk=cloned_segment.pk).update( |
| 172 | version_of=cloned_segment.version_of, |
| 173 | version=cloned_segment.version, |
| 174 | ) |
| 175 | |
| 176 | # Increase self version |
| 177 | if is_revision: |
| 178 | self.version = (self.version or 1) + 1 |
| 179 | Segment.objects.filter(pk=self.pk).update(version=self.version) |
| 180 | |
| 181 | return cloned_segment |
| 182 | |
| 183 | def copy_rules_and_conditions_from(self, source_segment: "Segment") -> None: |
| 184 | copy_segment_rules_and_conditions( |