diff --git a/src/Services/ImportExportSystem/EntityImporter.php b/src/Services/ImportExportSystem/EntityImporter.php index cecab12d..3513be5f 100644 --- a/src/Services/ImportExportSystem/EntityImporter.php +++ b/src/Services/ImportExportSystem/EntityImporter.php @@ -57,6 +57,7 @@ class EntityImporter /** * Creates many entries at once, based on a (text) list of name. * The created entities are not persisted to database yet, so you have to do it yourself. + * It returns all entities in the hierachy chain (even if they are already persisted). * * @template T of AbstractNamedDBElement * @param string $lines The list of names seperated by \n @@ -132,32 +133,35 @@ class EntityImporter //We can only use the getNewEntityFromPath function, if the repository is a StructuralDBElementRepository if ($repo instanceof StructuralDBElementRepository) { $entities = $repo->getNewEntityFromPath($new_path); - $entity = end($entities); - if ($entity === false) { + if ($entities === []) { throw new InvalidArgumentException('getNewEntityFromPath returned an empty array!'); } } else { //Otherwise just create a new entity $entity = new $class_name; $entity->setName($name); + $entities = [$entity]; } //Validate entity - $tmp = $this->validator->validate($entity); - //If no error occured, write entry to DB: - if (0 === count($tmp)) { - $valid_entities[] = $entity; - } else { //Otherwise log error - $errors[] = [ - 'entity' => $entity, - 'violations' => $tmp, - ]; + foreach ($entities as $entity) { + $tmp = $this->validator->validate($entity); + //If no error occured, write entry to DB: + if (0 === count($tmp)) { + $valid_entities[] = $entity; + } else { //Otherwise log error + $errors[] = [ + 'entity' => $entity, + 'violations' => $tmp, + ]; + } } $last_element = $entity; } - return $valid_entities; + //Only return objects once + return array_values(array_unique($valid_entities)); } /** diff --git a/tests/Services/ImportExportSystem/EntityImporterTest.php b/tests/Services/ImportExportSystem/EntityImporterTest.php index 31859b6a..5fb6f696 100644 --- a/tests/Services/ImportExportSystem/EntityImporterTest.php +++ b/tests/Services/ImportExportSystem/EntityImporterTest.php @@ -75,8 +75,8 @@ class EntityImporterTest extends WebTestCase $em = self::getContainer()->get(EntityManagerInterface::class); $parent = $em->find(AttachmentType::class, 1); $results = $this->service->massCreation($lines, AttachmentType::class, $parent, $errors); - $this->assertCount(3, $results); - $this->assertSame($parent, $results[0]->getParent()); + $this->assertCount(4, $results); + $this->assertSame("Test 1", $results[1]->getName()); //Test for addition of existing elements $errors = []; @@ -113,6 +113,31 @@ EOT; } + public function testMassCreationArrow(): void + { + $input = << Test1.1 + Test1 -> Test1.2 + Test2 -> Test2.1 + Test1 + Test1.3 + EOT; + + $errors = []; + $results = $this->service->massCreation($input, AttachmentType::class, null, $errors); + + //We have 6 elements, and 0 errors + $this->assertCount(0, $errors); + $this->assertCount(6, $results); + + $this->assertEquals('Test1', $results[0]->getName()); + $this->assertEquals('Test1.1', $results[1]->getName()); + $this->assertEquals('Test1.2', $results[2]->getName()); + $this->assertEquals('Test2', $results[3]->getName()); + $this->assertEquals('Test2.1', $results[4]->getName()); + $this->assertEquals('Test1.3', $results[5]->getName()); + } + public function testMassCreationNested(): void { $input = <<assertCount(0, $errors); - $this->assertCount(7, $results); + $this->assertCount(8, $results); - $element1 = $results[0]; - $element11 = $results[1]; - $element111 = $results[2]; - $element112 = $results[3]; - $element12 = $results[4]; - $element121 = $results[5]; - $element2 = $results[6]; + $element1 = $results[1]; + $element11 = $results[2]; + $element111 = $results[3]; + $element112 = $results[4]; + $element12 = $results[5]; + $element121 = $results[6]; + $element2 = $results[7]; $this->assertSame('Test 1', $element1->getName()); $this->assertSame('Test 1.1', $element11->getName()); diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index e974d34a..e1828d1f 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -242,7 +242,7 @@ part.info.timetravel_hint - This is how the part appeared before %timestamp%. <i>Please note that this feature is experimental, so the info may not be correct.</i> + Please note that this feature is experimental, so the info may not be correct.]]> @@ -731,10 +731,10 @@ user.edit.tfa.disable_tfa_message - This will disable <b>all active two-factor authentication methods of the user</b> and delete the <b>backup codes</b>! -<br> -The user will have to set up all two-factor authentication methods again and print new backup codes! <br><br> -<b>Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!</b> + all active two-factor authentication methods of the user and delete the backup codes! +
+The user will have to set up all two-factor authentication methods again and print new backup codes!

+Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!]]>
@@ -885,9 +885,9 @@ The user will have to set up all two-factor authentication methods again and pri entity.delete.message - This can not be undone! -<br> -Sub elements will be moved upwards. + +Sub elements will be moved upwards.]]> @@ -1441,7 +1441,7 @@ Sub elements will be moved upwards. homepage.github.text - Source, downloads, bug reports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a> + GitHub project page]]> @@ -1463,7 +1463,7 @@ Sub elements will be moved upwards. homepage.help.text - Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> + GitHub page]]> @@ -1705,7 +1705,7 @@ Sub elements will be moved upwards. email.pw_reset.fallback - If this does not work for you, go to <a href="%url%">%url%</a> and enter the following info + %url% and enter the following info]]> @@ -1735,7 +1735,7 @@ Sub elements will be moved upwards. email.pw_reset.valid_unit %date% - The reset token will be valid until <i>%date%</i>. + %date%.]]> @@ -3578,8 +3578,8 @@ Sub elements will be moved upwards. tfa_google.disable.confirm_message - If you disable the Authenticator App, all backup codes will be deleted, so you may need to reprint them.<br> -Also note that without two-factor authentication, your account is no longer as well protected against attackers! + +Also note that without two-factor authentication, your account is no longer as well protected against attackers!]]> @@ -3599,7 +3599,7 @@ Also note that without two-factor authentication, your account is no longer as w tfa_google.step.download - Download an authenticator app (e.g. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> oder <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>) + Google Authenticator oder FreeOTP Authenticator)]]> @@ -3841,8 +3841,8 @@ Also note that without two-factor authentication, your account is no longer as w tfa_trustedDevices.explanation - When checking the second factor, the current computer can be marked as trustworthy, so no more two-factor checks on this computer are needed. -If you have done this incorrectly or if a computer is no longer trusted, you can reset the status of <i>all </i>computers here. + all computers here.]]> @@ -5313,7 +5313,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can label_options.lines_mode.help - If you select Twig here, the content field is interpreted as Twig template. See <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig documentation</a> and <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a> for more information. + Twig documentation and Wiki for more information.]]> @@ -7157,12 +7157,15 @@ Exampletown mass_creation.lines.placeholder - Element 1 + +Element 3 + +Element 1 -> Element 1.1 +Element 1 -> Element 1.2]]> @@ -9388,25 +9391,25 @@ Element 3 filter.parameter_value_constraint.operator.< - Typ. Value < + filter.parameter_value_constraint.operator.> - Typ. Value > + ]]> filter.parameter_value_constraint.operator.<= - Typ. Value <= + filter.parameter_value_constraint.operator.>= - Typ. Value >= + =]]> @@ -9514,7 +9517,7 @@ Element 3 parts_list.search.searching_for - Searching parts with keyword <b>%keyword%</b> + %keyword%]]> @@ -10174,13 +10177,13 @@ Element 3 project.builds.number_of_builds_possible - You have enough stocked to build <b>%max_builds%</b> builds of this project. + %max_builds% builds of this project.]]> project.builds.check_project_status - The current project status is <b>"%project_status%"</b>. You should check if you really want to build the project with this status! + "%project_status%". You should check if you really want to build the project with this status!]]> @@ -10282,7 +10285,7 @@ Element 3 entity.select.add_hint - Use -> to create nested structures, e.g. "Node 1->Node 1.1" + to create nested structures, e.g. "Node 1->Node 1.1"]]> @@ -10306,13 +10309,13 @@ Element 3 homepage.first_steps.introduction - Your database is still empty. You might want to read the <a href="%url%">documentation</a> or start to creating the following data structures: + documentation or start to creating the following data structures:]]> homepage.first_steps.create_part - Or you can directly <a href="%url%">create a new part</a>. + create a new part.]]> @@ -10324,7 +10327,7 @@ Element 3 homepage.forum.text - For questions about Part-DB use the <a href="%href%" class="link-external" target="_blank">discussion forum</a> + discussion forum]]> @@ -10978,7 +10981,7 @@ Element 3 parts.import.help_documentation - See the <a href="%link%">documentation</a> for more information on the file format. + documentation for more information on the file format.]]> @@ -11158,7 +11161,7 @@ Element 3 part.filter.lessThanDesired - In stock less than desired (total amount < min. amount) + @@ -11970,13 +11973,13 @@ Please note, that you can not impersonate a disabled user. If you try you will g part.merge.confirm.title - Do you really want to merge <b>%other%</b> into <b>%target%</b>? + %other% into %target%?]]> part.merge.confirm.message - <b>%other%</b> will be deleted, and the part will be saved with the shown information. + %other% will be deleted, and the part will be saved with the shown information.]]>