From 885b0fdf9dcf1c16cbf7a425808812150d801583 Mon Sep 17 00:00:00 2001
From: Sebastian Castro <sebastian.castro@protonmail.com>
Date: Thu, 22 Aug 2019 13:27:49 +0200
Subject: [PATCH] Element import: prevent import if mapping is not filled

prevent auto match if latitude and longitude is empty
---
 .../Controller/Admin/ImportAdminController.php         | 10 +++++++++-
 .../Services/ElementImportOneService.php               |  8 +++++---
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/Biopen/GeoDirectoryBundle/Controller/Admin/ImportAdminController.php b/src/Biopen/GeoDirectoryBundle/Controller/Admin/ImportAdminController.php
index 4ba8ccabb..756e65c7d 100755
--- a/src/Biopen/GeoDirectoryBundle/Controller/Admin/ImportAdminController.php
+++ b/src/Biopen/GeoDirectoryBundle/Controller/Admin/ImportAdminController.php
@@ -15,7 +15,9 @@ class ImportAdminController extends Controller
     $result = $this->get('biopen.element_import')->collectData($object);
 
     $showUrl = $this->admin->generateUrl('showData', ['id' => $object->getId()]);
-    if (count($result) > 0)
+    if (!in_array("name",array_values($object->getOntologyMapping())))
+      $this->addFlash('sonata_flash_error', "Avant de lire les données, vous devez d'abords remplir le tableau de correspondance des champs. Renseignez au moins le Titre de la fiche");
+    else if (count($result) > 0)
       $this->addFlash('sonata_flash_success', "Les données ont été chargées avec succès.</br>Voici le résultat obtenu pour le premier élément à importer :<pre>" . print_r($result[0], true) . '</pre>' . "<a href='$showUrl'>Voir toutes les données</a>");
     else
       $this->addFlash('sonata_flash_error', "Erreur pendant le chargement des données, le résultat est vide");
@@ -41,6 +43,12 @@ class ImportAdminController extends Controller
   {
     $object = $this->admin->getSubject();
 
+    if (!in_array("name",array_values($object->getOntologyMapping()))) {
+      $this->addFlash('sonata_flash_error', "Avant d'importer les données, vous devez d'abords remplir le tableau de correspondance des champs. Renseignez au moins le Titre de la fiche");
+      $url = $this->admin->generateUrl('edit', ['id' => $object->getId()]);
+      return $this->redirect($url);
+    }
+
     $object->setCurrState(ImportState::Started);
     $object->setCurrMessage("En attente...");
     $em = $this->get('doctrine_mongodb')->getManager();
diff --git a/src/Biopen/GeoDirectoryBundle/Services/ElementImportOneService.php b/src/Biopen/GeoDirectoryBundle/Services/ElementImportOneService.php
index 0e194824e..1f0d5fa12 100755
--- a/src/Biopen/GeoDirectoryBundle/Services/ElementImportOneService.php
+++ b/src/Biopen/GeoDirectoryBundle/Services/ElementImportOneService.php
@@ -56,9 +56,11 @@ class ElementImportOneService
 		// adds missings fields instead of checking if each field is set before accessing
 		$missingFields = array_diff($this->coreFields, array_keys($row));
     foreach ($missingFields as $missingField) {
-      $row[$missingField] = "";
+      $row[$missingField] = ($missingField == 'categories') ? [] : "";
     }
 
+    $element = null;
+
 		if ($row['id'])
 		{
 			if (in_array($row['id'], $import->getIdsToIgnore())) return;
@@ -66,7 +68,7 @@ class ElementImportOneService
 			$qb->field('source')->references($import);
 			$qb->field('oldId')->equals("" . $row['id']);
 			$element = $qb->getQuery()->getSingleResult();
-		} else {
+		} else if (strlen($row['name']) > 0 && strlen($row['latitude']) > 0 && strlen($row['longitude']) > 0) {
 			$qb = $this->em->createQueryBuilder('BiopenGeoDirectoryBundle:Element');
 			$qb->field('source')->references($import);
 			$qb->field('name')->equals($row['name']);
@@ -75,7 +77,7 @@ class ElementImportOneService
 			$element = $qb->getQuery()->getSingleResult();
 		}
 
-		if ($element) // if element with this Id already exists
+		if ($element) // if the element already exists, we update it
 		{
 			$updatedAtField = $import->getFieldToCheckElementHaveBeenUpdated();
 			// if updated date hasn't change, nothing to do
-- 
GitLab