From 698f791920d5781597b85e13ba8575add4b57e5c Mon Sep 17 00:00:00 2001 From: aarizona Date: Wed, 29 May 2024 12:25:36 +0300 Subject: [PATCH] add external elements query --- back/.env.example | 5 +++ back/api/settings.py | 9 ++++-- back/inventory/views.py | 55 ++++++++++++++++++++++++++++++++ front/pages/organization/new.vue | 47 +++++++++++++++++++++------ poetry.lock | 17 +++++++++- pyproject.toml | 1 + 6 files changed, 121 insertions(+), 13 deletions(-) create mode 100644 back/.env.example diff --git a/back/.env.example b/back/.env.example new file mode 100644 index 0000000..f8f7abc --- /dev/null +++ b/back/.env.example @@ -0,0 +1,5 @@ +DB_NAME= +DB_USER= +DB_PASSWORD= +DB_HOST= +DB_PORT= \ No newline at end of file diff --git a/back/api/settings.py b/back/api/settings.py index 571815f..e1d980d 100644 --- a/back/api/settings.py +++ b/back/api/settings.py @@ -29,11 +29,15 @@ SECRET_KEY = "django-insecure-ruo!wst&sb8(f9)j5u4rda-w!673lj_-c0a%gx_t@)ff*q*2ze DEBUG = True ALLOWED_HOSTS = [] - +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:3000', +] # Application definition INSTALLED_APPS = [ + "corsheaders", + "rest_framework", "inventory", "django.contrib.admin", "django.contrib.auth", @@ -41,7 +45,6 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", - "rest_framework", ] MIDDLEWARE = [ @@ -49,6 +52,8 @@ MIDDLEWARE = [ "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.common.CommonMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", diff --git a/back/inventory/views.py b/back/inventory/views.py index f655f21..543f7e7 100644 --- a/back/inventory/views.py +++ b/back/inventory/views.py @@ -40,6 +40,7 @@ class PartnerViewSet(viewsets.ModelViewSet): parsed_data = data.json() return Response(parsed_data["value"]) except Exception as e: + logger.error(e) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -50,3 +51,57 @@ class ElementViewSet(viewsets.ModelViewSet): queryset = Element.objects.all() serializer_class = ElementSerializer + + @action(detail=False, methods=["get"], url_path=r"external_categories") + def get_remote_categories(self, request): + try: + params = { + "$format": "json", + "$select": ",".join(["Description", "Ref_Key", "Parent_Key"]), + "$filter": "Parent_Key eq guid'a6aadfe8-7e0f-11ee-ab5a-a47a2bd811cb'", + } + remote_url = ( + "https://1c.svs-tech.pro/UNF/odata/standard.odata/Catalog_КатегорииНоменклатуры?" + + "&".join([f"{p}={params[p]}" for p in params]) + ) + data = requests.get( + remote_url, headers={"Authorization": settings.ODATA_AUTH} + ) + parsed_data = data.json() + + params["$filter"] = " or ".join( + [f"Parent_Key eq guid'{v['Ref_Key']}'" for v in parsed_data["value"]] + ) + remote_url = ( + "https://1c.svs-tech.pro/UNF/odata/standard.odata/Catalog_КатегорииНоменклатуры?" + + "&".join([f"{p}={params[p]}" for p in params]) + ) + data = requests.get( + remote_url, headers={"Authorization": settings.ODATA_AUTH} + ) + parsed_data = data.json() + return Response(parsed_data["value"]) + except Exception as e: + logger.error(e) + return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @action(detail=False, methods=["get"], url_path=r"external/(?P[^/.]+)") + def get_remote_element(self, request, pk=None, cat_id=None): + try: + params = { + "$format": "json", + "$select": ",".join(["Description", "Ref_Key", "Parent_Key"]), + "$filter": f"Parent_Key eq guid'{cat_id}'", + } + remote_url = ( + "https://1c.svs-tech.pro/UNF/odata/standard.odata/Catalog_Номенклатура?" + + "&".join([f"{p}={params[p]}" for p in params]) + ) + data = requests.get( + remote_url, headers={"Authorization": settings.ODATA_AUTH} + ) + parsed_data = data.json() + return Response(parsed_data["value"]) + except Exception as e: + logger.error(e) + return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/front/pages/organization/new.vue b/front/pages/organization/new.vue index 4ed0a51..2144873 100644 --- a/front/pages/organization/new.vue +++ b/front/pages/organization/new.vue @@ -2,9 +2,9 @@ import { apiBase } from '~/helpers'; import type { ApiTypeExternalPartners } from '~/helpers'; +const loading = ref(false) const state = reactive({ organization: undefined, - password: undefined }) async function onSubmit(event: FormSubmitEvent) { // Do something with event.data @@ -12,31 +12,58 @@ async function onSubmit(event: FormSubmitEvent) { } const externalPartners = ref([]) const searchInExternal = (q: string) => { + if (!q.length) { + return externalPartners.value.splice(0, 10) + } return externalPartners.value.filter(el => { return el.Description.toLowerCase().indexOf(q.toLowerCase()) !== -1 }).slice(0, 10) } -onMounted(async () => { +const externalCategory = ref() +const externalCategories = ref([]) + +const externalElement = ref() +const externalElements = ref([]) + +const loadPartners = async () => { + loading.value = true const { data } = await useFetch(`${apiBase}/partner/external/`) if (data.value) { externalPartners.value = data.value } + loading.value = false +} +const loadElements = async () => { + loading.value = true + const { data } = await useFetch(`${apiBase}/element/external/${externalCategory.value}`) + if (data.value) { + externalElements.value = data.value + } + loading.value = false +} +onMounted(async () => { + await loadPartners() + + const { data } = await useFetch(`${apiBase}/element/external_categories/`) + externalCategories.value = data.value }) +watch(externalCategory, loadElements)