Skip to content

Commit d625575

Browse files
authored
Merge pull request #3706 from betagouv/import-purchases-bug
🐛 Permet d'importer des fichier sans `local_definition`
2 parents 0c1fbe4 + 8a8d459 commit d625575

3 files changed

Lines changed: 40 additions & 6 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
canteen siret,description,fournisseur,date,prix HT,famille,caractéristiques
2+
82399356058716,"Pommes, rouges",Le bon traiteur ,2022-05-02,90.11, PRODUITS_LAITIERS ,"BIO"
3+
82399356058716,"Pommes, vertes",Le bon traiteur ,2022-05-03,910.11, PRODUITS_LAITIERS ,"BIO"

api/tests/test_import_purchases.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,26 @@ def test_import_good_purchases(self):
4646
filehash_md5 = hashlib.md5(filebytes).hexdigest()
4747
self.assertEqual(Purchase.objects.first().import_source, filehash_md5)
4848

49+
@authenticate
50+
def test_import_with_no_local_definition(self):
51+
"""
52+
Tests that can import a file without local definition
53+
"""
54+
CanteenFactory.create(siret="82399356058716", managers=[authenticate.user])
55+
with open("./api/tests/files/good_purchase_import_no_local_def.csv") as purchase_file:
56+
response = self.client.post(reverse("import_purchases"), {"file": purchase_file})
57+
self.assertEqual(response.status_code, status.HTTP_200_OK)
58+
self.assertEqual(Purchase.objects.count(), 2)
59+
purchase = Purchase.objects.filter(description="Pommes, rouges").first()
60+
self.assertEqual(purchase.canteen.siret, "82399356058716")
61+
self.assertEqual(purchase.description, "Pommes, rouges")
62+
self.assertEqual(purchase.provider, "Le bon traiteur")
63+
self.assertEqual(purchase.price_ht, Decimal("90.11"))
64+
self.assertEqual(purchase.date, date(2022, 5, 2))
65+
self.assertEqual(purchase.family, Purchase.Family.PRODUITS_LAITIERS)
66+
self.assertEqual(purchase.characteristics, [Purchase.Characteristic.BIO])
67+
self.assertEqual(purchase.local_definition, None)
68+
4969
@authenticate
5070
def test_import_purchases_different_separators(self):
5171
"""

api/views/purchaseimport.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,7 @@ def _create_purchase_for_canteen(self, siret, row):
190190
family = row.pop(0)
191191
characteristics = row.pop(0)
192192
characteristics = [c.strip() for c in characteristics.split(",")]
193-
local_definition = row.pop(0)
194-
if "LOCAL" in characteristics and not local_definition:
195-
raise ValidationError(
196-
{"local_definition": "La définition de local est obligatoire pour les produits locaux"}
197-
)
193+
local_definition = ImportPurchasesView._get_local_definition(row, characteristics)
198194

199195
purchase = Purchase(
200196
canteen=canteen,
@@ -204,12 +200,27 @@ def _create_purchase_for_canteen(self, siret, row):
204200
price_ht=price,
205201
family=family.strip(),
206202
characteristics=characteristics,
207-
local_definition=local_definition.strip(),
203+
local_definition=local_definition,
208204
import_source=self.tmp_id,
209205
)
210206
purchase.full_clean()
211207
self.purchases.append(purchase)
212208

209+
# Factored out because _create_purchase_for_canteen was too complex for flake8 validation
210+
@staticmethod
211+
def _get_local_definition(row, characteristics):
212+
local_definition = None
213+
if "LOCAL" in characteristics:
214+
try:
215+
local_definition = row.pop(0)
216+
if not local_definition:
217+
raise IndexError
218+
except IndexError:
219+
raise ValidationError(
220+
{"local_definition": "La définition de local est obligatoire pour les produits locaux"}
221+
)
222+
return local_definition.strip() if local_definition else None
223+
213224
def _get_success_response(self):
214225
return JsonResponse(
215226
{

0 commit comments

Comments
 (0)