| 101 | } |
| 102 | |
| 103 | def duplicate(self, new_owner=None): |
| 104 | try: |
| 105 | with transaction.atomic(): |
| 106 | project = Project.objects.get(pk=self.pk) |
| 107 | project.pk = None |
| 108 | project.name = gettext('Copy of %(task)s') % {'task': self.name} |
| 109 | project.created_at = timezone.now() |
| 110 | if new_owner is not None: |
| 111 | project.owner = new_owner |
| 112 | project.public_id = None |
| 113 | project.public_edit = False |
| 114 | project.public = False |
| 115 | project.save() |
| 116 | project.refresh_from_db() |
| 117 | |
| 118 | for task in self.task_set.all(): |
| 119 | new_task = task.duplicate(set_new_name=False) |
| 120 | if not new_task: |
| 121 | raise Exception("Failed to duplicate {}".format(new_task)) |
| 122 | |
| 123 | # Move/Assign to new duplicate |
| 124 | new_task.project = project |
| 125 | new_task.save() |
| 126 | |
| 127 | return project |
| 128 | except Exception as e: |
| 129 | logger.warning("Cannot duplicate project: {}".format(str(e))) |
| 130 | |
| 131 | return False |
| 132 | |
| 133 | def save(self, *args, **kwargs): |
| 134 | # Assign a public ID if missing and public = True |