add external elements query
This commit is contained in:
parent
ebc48e3b87
commit
698f791920
|
@ -0,0 +1,5 @@
|
||||||
|
DB_NAME=
|
||||||
|
DB_USER=
|
||||||
|
DB_PASSWORD=
|
||||||
|
DB_HOST=
|
||||||
|
DB_PORT=
|
|
@ -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",
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue