Duplicate attachments & external links during task duplication & importing

This commit is contained in:
mundry 2023-03-25 03:48:32 +01:00 committed by GitHub
parent 39d78cf424
commit 59a4c7f73b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 62 additions and 4 deletions

View File

@ -199,10 +199,15 @@ abstract class FileModel extends Base
$this->fireDestructionEvent($file_id);
$file = $this->getById($file_id);
$this->objectStorage->remove($file['path']);
if ($file['is_image'] == 1) {
$this->objectStorage->remove($this->getThumbnailPath($file['path']));
// Only remove files from disk attached to a single task.
$multiple_tasks_count = $this->db->table($this->getTable())->eq('path', $file['path'])->count();
if ($multiple_tasks_count === 1) {
$this->objectStorage->remove($file['path']);
if ($file['is_image'] == 1) {
$this->objectStorage->remove($this->getThumbnailPath($file['path']));
}
}
return $this->db->table($this->getTable())->eq('id', $file['id'])->remove();

View File

@ -31,6 +31,24 @@ class TaskProjectDuplicationModel extends TaskDuplicationModel
if ($new_task_id !== false) {
$this->tagDuplicationModel->duplicateTaskTagsToAnotherProject($task_id, $new_task_id, $project_id);
$this->taskLinkModel->create($new_task_id, $task_id, 4);
$attachments = $this->taskFileModel->getAll($task_id);
$externalLinks = $this->taskExternalLinkModel->getAll($task_id);
foreach ($attachments as $attachment) {
$this->taskFileModel->create($new_task_id, $attachment['name'], $attachment['path'], $attachment['size']);
}
foreach ($externalLinks as $externalLink) {
$this->taskExternalLinkModel->create([
'task_id' => $new_task_id,
'creator_id' => $externalLink['creator_id'],
'dependency' => $externalLink['dependency'],
'title' => $externalLink['title'],
'link_type' => $externalLink['link_type'],
'url' => $externalLink['url'],
]);
}
}
$hook_values = [ 'source_task_id' => $task_id, 'destination_task_id' => $new_task_id];

View File

@ -13,6 +13,12 @@ class TaskDuplicateAnotherProjectTest extends Base
{
public function testSuccess()
{
$this->container['externalLinkManager'] = $this
->getMockBuilder('Kanboard\Core\ExternalLink\ExternalLinkManager')
->setConstructorArgs(array($this->container))
->setMethods(['push'])
->getMock();
$projectModel = new ProjectModel($this->container);
$taskCreationModel = new TaskCreationModel($this->container);
$taskFinderModel = new TaskFinderModel($this->container);

View File

@ -498,6 +498,12 @@ class ProjectDuplicationModelTest extends Base
public function testCloneProjectWithTasks()
{
$this->container['externalLinkManager'] = $this
->getMockBuilder('Kanboard\Core\ExternalLink\ExternalLinkManager')
->setConstructorArgs(array($this->container))
->setMethods(['push'])
->getMock();
$projectModel = new ProjectModel($this->container);
$projectDuplicationModel = new ProjectDuplicationModel($this->container);
$taskCreationModel = new TaskCreationModel($this->container);
@ -522,6 +528,12 @@ class ProjectDuplicationModelTest extends Base
public function testCloneProjectWithSwimlanesAndTasks()
{
$this->container['externalLinkManager'] = $this
->getMockBuilder('Kanboard\Core\ExternalLink\ExternalLinkManager')
->setConstructorArgs(array($this->container))
->setMethods(['push'])
->getMock();
$projectModel = new ProjectModel($this->container);
$projectDuplicationModel = new ProjectDuplicationModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
@ -572,6 +584,12 @@ class ProjectDuplicationModelTest extends Base
public function testCloneProjectWithTags()
{
$this->container['externalLinkManager'] = $this
->getMockBuilder('Kanboard\Core\ExternalLink\ExternalLinkManager')
->setConstructorArgs(array($this->container))
->setMethods(['push'])
->getMock();
$projectModel = new ProjectModel($this->container);
$projectDuplicationModel = new ProjectDuplicationModel($this->container);
$taskCreationModel = new TaskCreationModel($this->container);

View File

@ -435,7 +435,7 @@ class TaskFileModelTest extends Base
$this->assertEquals(2, $fileModel->create(1, 'test', 'tmp/foo', 10));
$this->container['objectStorage']
->expects($this->exactly(2))
->expects($this->exactly(1))
->method('remove')
->with('tmp/foo');

View File

@ -17,6 +17,17 @@ use Kanboard\Model\UserModel;
class TaskProjectDuplicationModelTest extends Base
{
protected function setUp(): void
{
parent::setUp();
$this->container['externalLinkManager'] = $this
->getMockBuilder('Kanboard\Core\ExternalLink\ExternalLinkManager')
->setConstructorArgs(array($this->container))
->setMethods(['push'])
->getMock();
}
public function testDuplicateAnotherProject()
{
$taskProjectDuplicationModel = new TaskProjectDuplicationModel($this->container);