add external elements query

This commit is contained in:
aarizona 2024-05-29 12:25:36 +03:00
parent ebc48e3b87
commit 698f791920
6 changed files with 121 additions and 13 deletions

5
back/.env.example Normal file
View File

@ -0,0 +1,5 @@
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_HOST=
DB_PORT=

View File

@ -29,11 +29,15 @@ SECRET_KEY = "django-insecure-ruo!wst&sb8(f9)j5u4rda-w!673lj_-c0a%gx_t@)ff*q*2ze
DEBUG = True DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
]
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
"corsheaders",
"rest_framework",
"inventory", "inventory",
"django.contrib.admin", "django.contrib.admin",
"django.contrib.auth", "django.contrib.auth",
@ -41,7 +45,6 @@ INSTALLED_APPS = [
"django.contrib.sessions", "django.contrib.sessions",
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"rest_framework",
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -49,6 +52,8 @@ MIDDLEWARE = [
"django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware", "django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware", "django.middleware.csrf.CsrfViewMiddleware",
"corsheaders.middleware.CorsMiddleware",
"django.middleware.common.CommonMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware", "django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware",

View File

@ -40,6 +40,7 @@ class PartnerViewSet(viewsets.ModelViewSet):
parsed_data = data.json() parsed_data = data.json()
return Response(parsed_data["value"]) return Response(parsed_data["value"])
except Exception as e: except Exception as e:
logger.error(e)
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@ -50,3 +51,57 @@ class ElementViewSet(viewsets.ModelViewSet):
queryset = Element.objects.all() queryset = Element.objects.all()
serializer_class = ElementSerializer 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<cat_id>[^/.]+)")
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)

View File

@ -2,9 +2,9 @@
import { apiBase } from '~/helpers'; import { apiBase } from '~/helpers';
import type { ApiTypeExternalPartners } from '~/helpers'; import type { ApiTypeExternalPartners } from '~/helpers';
const loading = ref(false)
const state = reactive({ const state = reactive({
organization: undefined, organization: undefined,
password: undefined
}) })
async function onSubmit(event: FormSubmitEvent<Schema>) { async function onSubmit(event: FormSubmitEvent<Schema>) {
// Do something with event.data // Do something with event.data
@ -12,31 +12,58 @@ async function onSubmit(event: FormSubmitEvent<Schema>) {
} }
const externalPartners = ref<ApiTypeExternalPartners[]>([]) const externalPartners = ref<ApiTypeExternalPartners[]>([])
const searchInExternal = (q: string) => { const searchInExternal = (q: string) => {
if (!q.length) {
return externalPartners.value.splice(0, 10)
}
return externalPartners.value.filter(el => { return externalPartners.value.filter(el => {
return el.Description.toLowerCase().indexOf(q.toLowerCase()) !== -1 return el.Description.toLowerCase().indexOf(q.toLowerCase()) !== -1
}).slice(0, 10) }).slice(0, 10)
} }
onMounted(async () => { const externalCategory = ref()
const externalCategories = ref<ApiTypeExternalPartners[]>([])
const externalElement = ref()
const externalElements = ref<ApiTypeExternalPartners[]>([])
const loadPartners = async () => {
loading.value = true
const { data } = await useFetch<ApiTypeExternalPartners[]>(`${apiBase}/partner/external/`) const { data } = await useFetch<ApiTypeExternalPartners[]>(`${apiBase}/partner/external/`)
if (data.value) { if (data.value) {
externalPartners.value = data.value externalPartners.value = data.value
} }
loading.value = false
}
const loadElements = async () => {
loading.value = true
const { data } = await useFetch<ApiTypeExternalPartners[]>(`${apiBase}/element/external/${externalCategory.value}`)
if (data.value) {
externalElements.value = data.value
}
loading.value = false
}
onMounted(async () => {
await loadPartners()
const { data } = await useFetch<ApiTypeExternalPartners[]>(`${apiBase}/element/external_categories/`)
externalCategories.value = data.value
}) })
watch(externalCategory, loadElements)
</script> </script>
<template> <template>
<div class="grid grid-cols-10"> <div class="grid grid-cols-10">
<div class="col-span-3"> <div class="col-span-3">
<UForm :state="state" class="flex flex-col gap-4" @submit="onSubmit"> <UForm :state="state" class="flex flex-col gap-4" @submit="onSubmit">
<UFormGroup label="Выбрать организацию" name="organization"> <UFormGroup label="Выбрать организацию" name="organization">
<USelectMenu v-model="state.organization" <USelectMenu v-model="state.organization" :options="externalPartners" value-attribute="Ref_Key"
:options="externalPartners" value-attribute="Ref_Key" option-attribute="Description" :searchable="searchInExternal"
option-attribute="Description" searchable-placeholder="Выберите организацию из списка контрагентов" :loading="loading" />
:searchable="searchInExternal"
searchable-placeholder="Выберите организацию из списка контрагентов" />
</UFormGroup> </UFormGroup>
<UFormGroup label="Добавить элемент инвентаризации" v-if="state.organization">
<UFormGroup label="Password" name="password"> <USelectMenu v-model="externalCategory" :options="externalCategories" value-attribute="Ref_Key"
<UInput v-model="state.password" type="password" /> option-attribute="Description" :searchable="true" :loading="loading" />
<USelectMenu v-model="externalElement" :options="externalElements" value-attribute="Ref_Key"
option-attribute="Description" :searchable="true" :loading="loading"
:placeholder="`Элементы (${externalElements.length})`" />
</UFormGroup> </UFormGroup>
<UButton type="submit"> <UButton type="submit">

17
poetry.lock generated
View File

@ -158,6 +158,21 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
argon2 = ["argon2-cffi (>=19.1.0)"] argon2 = ["argon2-cffi (>=19.1.0)"]
bcrypt = ["bcrypt"] bcrypt = ["bcrypt"]
[[package]]
name = "django-cors-headers"
version = "4.3.1"
description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)."
optional = false
python-versions = ">=3.8"
files = [
{file = "django-cors-headers-4.3.1.tar.gz", hash = "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207"},
{file = "django_cors_headers-4.3.1-py3-none-any.whl", hash = "sha256:0b1fd19297e37417fc9f835d39e45c8c642938ddba1acce0c1753d3edef04f36"},
]
[package.dependencies]
asgiref = ">=3.6"
Django = ">=3.2"
[[package]] [[package]]
name = "django-filter" name = "django-filter"
version = "24.2" version = "24.2"
@ -479,4 +494,4 @@ zstd = ["zstandard (>=0.18.0)"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.10" python-versions = "^3.10"
content-hash = "b9dc2695db187043dc2603102329b9eb65ddf102794cd97236c758979e1304b1" content-hash = "470159f92c63a9db1bc186d9da1a7fd1c579103ae33a346bb3484114c047d445"

View File

@ -16,6 +16,7 @@ django-filter = "^24.2"
pillow = "^10.3.0" pillow = "^10.3.0"
python-dotenv = "^1.0.1" python-dotenv = "^1.0.1"
requests = "^2.32.2" requests = "^2.32.2"
django-cors-headers = "^4.3.1"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
taskipy = "^1.12.2" taskipy = "^1.12.2"