From 33d048e6234c8fa9ce68672650225db5e77d3090 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Thu, 4 May 2023 08:43:36 +0200 Subject: [PATCH] improve importer --- cookbook/helper/open_data_importer.py | 23 +++++++++++++++++-- ...onversion_f_unique_conversion_per_space.py | 17 ++++++++++++++ cookbook/models.py | 5 ++++ cookbook/views/api.py | 1 + 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 cookbook/migrations/0193_unitconversion_f_unique_conversion_per_space.py diff --git a/cookbook/helper/open_data_importer.py b/cookbook/helper/open_data_importer.py index ea1544c97..3a441fbbc 100644 --- a/cookbook/helper/open_data_importer.py +++ b/cookbook/helper/open_data_importer.py @@ -1,6 +1,6 @@ from django.db.models import Q -from cookbook.models import Unit, SupermarketCategory, FoodProperty, FoodPropertyType, Supermarket, SupermarketCategoryRelation, Food, Automation +from cookbook.models import Unit, SupermarketCategory, FoodProperty, FoodPropertyType, Supermarket, SupermarketCategoryRelation, Food, Automation, UnitConversion class OpenDataImporter: @@ -172,6 +172,25 @@ class OpenDataImporter: created_by=self.request.user, )) - FoodProperty.objects.bulk_create(food_property_list) + FoodProperty.objects.bulk_create(food_property_list, ignore_conflicts=True, unique_fields=('space', 'food', 'property_type')) Automation.objects.bulk_create(alias_list) return len(insert_list) + + def import_conversion(self): + datatype = 'conversion' + + insert_list = [] + for k in list(self.data[datatype].keys()): + insert_list.append(UnitConversion( + base_amount=self.data[datatype][k]['base_amount'], + base_unit_id=self.slug_id_cache['unit'][self.data[datatype][k]['base_unit']], + converted_amount=self.data[datatype][k]['converted_amount'], + converted_unit_id=self.slug_id_cache['unit'][self.data[datatype][k]['converted_unit']], + food_id=self.slug_id_cache['food'][self.data[datatype][k]['food']], + open_data_slug=k, + space=self.request.space, + created_by=self.request.user, + )) + + UnitConversion.objects.bulk_create(insert_list, ignore_conflicts=True, unique_fields=('space', 'base_unit', 'converted_unit', 'food', 'open_data_slug')) + return len(insert_list) diff --git a/cookbook/migrations/0193_unitconversion_f_unique_conversion_per_space.py b/cookbook/migrations/0193_unitconversion_f_unique_conversion_per_space.py new file mode 100644 index 000000000..9c964285a --- /dev/null +++ b/cookbook/migrations/0193_unitconversion_f_unique_conversion_per_space.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.7 on 2023-05-04 05:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0192_remove_foodpropertytype_fdc_id_and_more'), + ] + + operations = [ + migrations.AddConstraint( + model_name='unitconversion', + constraint=models.UniqueConstraint(fields=('space', 'base_unit', 'converted_unit', 'food'), name='f_unique_conversion_per_space'), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index a3088afcc..e3109330a 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -678,6 +678,11 @@ class UnitConversion(ExportModelOperationsMixin('unit_conversion'), models.Model def __str__(self): return f'{self.base_amount} {self.base_unit} -> {self.converted_amount} {self.converted_unit} {self.food}' + class Meta: + constraints = [ + models.UniqueConstraint(fields=['space', 'base_unit', 'converted_unit', 'food'], name='f_unique_conversion_per_space') + ] + class Ingredient(ExportModelOperationsMixin('ingredient'), models.Model, PermissionModelMixin): # delete method on Food and Unit checks if they are part of a Recipe, if it is raises a ProtectedError instead of cascading the delete diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 294be97a2..8e04d0ab0 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1444,6 +1444,7 @@ class ImportOpenData(APIView): data_importer.import_property() data_importer.import_supermarket() data_importer.import_food() # TODO pass metric parameter + data_importer.import_conversion() return Response({ 'test': ''