diff --git a/cookbook/helper/open_data_importer.py b/cookbook/helper/open_data_importer.py index 72f35108..938c2c76 100644 --- a/cookbook/helper/open_data_importer.py +++ b/cookbook/helper/open_data_importer.py @@ -110,8 +110,8 @@ class OpenDataImporter: for f in Food.objects.filter(space=self.request.space).filter(name__in=identifier_list).values_list('id', 'name', 'plural_name'): existing_objects_flat.append(f[1]) existing_objects_flat.append(f[2]) - existing_objects['name'] = f - existing_objects['plural_name'] = f + existing_objects[f[1]] = f + existing_objects[f[2]] = f self._update_slug_cache(Unit, 'unit') self._update_slug_cache(FoodPropertyType, 'property') @@ -159,7 +159,7 @@ class OpenDataImporter: update_field_list = ['open_data_slug', ] update_list.append(Food(id=existing_food_id, open_data_slug=k, )) - foods = Food.load_bulk(insert_list, None) + Food.load_bulk(insert_list, None) Food.objects.bulk_update(update_list, update_field_list) self._update_slug_cache(Food, 'food') @@ -187,7 +187,7 @@ class OpenDataImporter: FoodProperty.objects.bulk_create(food_property_list, ignore_conflicts=True, unique_fields=('space', 'food', 'property_type',)) Automation.objects.bulk_create(alias_list, ignore_conflicts=True, unique_fields=('space', 'param_1', 'param_2',)) - return foods + return insert_list + update_list def import_conversion(self): datatype = 'conversion' diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 2db84440..2d6581a2 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1428,9 +1428,7 @@ class ImportOpenData(APIView): return Response(metadata) def post(self, request, *args, **kwargs): - # serializer load data ? # TODO validate data - # TODO add option to handle merging of existing data (merge, override, ignore) print(request.data) selected_version = request.data['selected_version'] selected_datatypes = request.data['selected_datatypes'] diff --git a/vue/src/apps/SpaceManageView/SpaceManageView.vue b/vue/src/apps/SpaceManageView/SpaceManageView.vue index 18f9ad95..3c962e8a 100644 --- a/vue/src/apps/SpaceManageView/SpaceManageView.vue +++ b/vue/src/apps/SpaceManageView/SpaceManageView.vue @@ -51,14 +51,14 @@ {{ us.user.username }} @@ -90,14 +90,14 @@ {{ il.email }} @@ -164,6 +164,15 @@ +
+
+

{{ $t('Open_Data_Import') }}

+ +
+ +
+ +

{{ $t('Delete') }}

@@ -198,6 +207,7 @@ import GenericMultiselect from "@/components/GenericMultiselect"; import GenericModalForm from "@/components/Modals/GenericModalForm"; import axios from "axios"; import VueClipboard from 'vue-clipboard2' +import OpenDataImportComponent from "@/components/OpenDataImportComponent.vue"; Vue.use(VueClipboard) @@ -206,7 +216,7 @@ Vue.use(BootstrapVue) export default { name: "SpaceManageView", mixins: [ResolveUrlMixin, ToastMixin, ApiMixin], - components: {GenericMultiselect, GenericModalForm}, + components: {GenericMultiselect, GenericModalForm, OpenDataImportComponent}, data() { return { ACTIVE_SPACE_ID: window.ACTIVE_SPACE_ID, @@ -239,7 +249,7 @@ export default { if (link) { content = localStorage.BASE_PATH + this.resolveDjangoUrl('view_invite', inviteLink.uuid) } - this.$copyText(content) + this.$copyText(content) }, loadInviteLinks: function () { let apiFactory = new ApiApiFactory() diff --git a/vue/src/apps/TestView/TestView.vue b/vue/src/apps/TestView/TestView.vue index a5f2e388..f7265afd 100644 --- a/vue/src/apps/TestView/TestView.vue +++ b/vue/src/apps/TestView/TestView.vue @@ -1,47 +1,41 @@ @@ -53,6 +47,7 @@ import {BootstrapVue} from "bootstrap-vue" import "bootstrap-vue/dist/bootstrap-vue.css" import {ApiMixin, resolveDjangoUrl, StandardToasts} from "@/utils/utils"; import axios from "axios"; +import BetaWarning from "@/components/BetaWarning.vue"; Vue.use(BootstrapVue) @@ -61,12 +56,14 @@ Vue.use(BootstrapVue) export default { name: "TestView", mixins: [ApiMixin], - components: {}, + components: {BetaWarning}, data() { return { metadata: undefined, selected_version: undefined, - response_data: undefined, + update_existing: true, + use_metric: true, + import_count: undefined, } }, mounted() { @@ -80,12 +77,18 @@ export default { }, methods: { doImport: function () { - axios.post(resolveDjangoUrl('api_import_open_data'), {'selected_version': this.selected_version, 'selected_datatypes': this.metadata.datatypes}).then(r => { + axios.post(resolveDjangoUrl('api_import_open_data'), { + 'selected_version': this.selected_version, + 'selected_datatypes': this.metadata.datatypes, + 'update_existing': this.update_existing, + 'use_metric': this.use_metric, + }).then(r => { StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE) + this.import_count = r.data }).catch(err => { StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err) }) - } + }, }, } diff --git a/vue/src/components/OpenDataImportComponent.vue b/vue/src/components/OpenDataImportComponent.vue new file mode 100644 index 00000000..ebb3e8b2 --- /dev/null +++ b/vue/src/components/OpenDataImportComponent.vue @@ -0,0 +1,94 @@ + + + + diff --git a/vue/src/locales/en.json b/vue/src/locales/en.json index 355860c4..6d73e13f 100644 --- a/vue/src/locales/en.json +++ b/vue/src/locales/en.json @@ -78,6 +78,13 @@ "reusable_help_text": "Should the invite link be usable for more than one user.", "open_data_help_text": "The Tandoor Open Data project provides community contributed data for Tandoor. This field is filled automatically when importing it and allows updates in the future.", "Open_Data_Slug": "Open Data Slug", + "Open_Data_Import": "Open Data Import", + "Data_Import_Info": "Enhance your Space by importing a community curated list of foods, units and more to improve your recipe collection.", + "Update_Existing_Data": "Update Existing Data", + "Use_Metric": "Use Metric Units", + "Learn_More": "Learn More", + "Datatype": "Datatype", + "Number of Objects": "Number of Objects", "Add_Step": "Add Step", "Keywords": "Keywords", "Books": "Books", @@ -163,6 +170,8 @@ "merge_title": "Merge {type}", "move_title": "Move {type}", "Food": "Food", + "Property": "Property", + "Conversion": "Conversion", "Original_Text": "Original Text", "Recipe_Book": "Recipe Book", "del_confirmation_tree": "Are you sure that you want to delete {source} and all of it's children?",