uniq
This commit is contained in:
parent
2e361ff919
commit
877f99f466
|
@ -31,6 +31,7 @@ DEBUG = True
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = []
|
||||||
CORS_ALLOWED_ORIGINS = [
|
CORS_ALLOWED_ORIGINS = [
|
||||||
'http://localhost:3000',
|
'http://localhost:3000',
|
||||||
|
'http://192.168.103.159:3000'
|
||||||
]
|
]
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
|
|
|
@ -34,8 +34,8 @@ class Element(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
external_id = models.CharField()
|
external_id = models.CharField()
|
||||||
element_id = models.CharField(max_length=100)
|
element_id = models.CharField(max_length=100)
|
||||||
photo = models.ImageField(upload_to=".")
|
photo = models.ImageField(upload_to=".", null=True)
|
||||||
additional_text = models.TextField()
|
additional_text = models.TextField(null=True, blank=True, default="")
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
inventory = models.ForeignKey(
|
inventory = models.ForeignKey(
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.validators import UniqueValidator
|
||||||
|
|
||||||
from .models import Element, InventoryItem, Partner
|
from .models import Element, InventoryItem, Partner
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -37,7 +39,10 @@ class InventorySerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class ElementSerializer(serializers.ModelSerializer):
|
class ElementSerializer(serializers.ModelSerializer):
|
||||||
inventory_name = serializers.CharField(source="inventory.name", read_only=True)
|
inventory_name = serializers.CharField(source="inventory.name", read_only=True)
|
||||||
|
element_id = serializers.CharField(
|
||||||
|
max_length=100,
|
||||||
|
validators=[UniqueValidator(queryset=Element.objects.all())]
|
||||||
|
)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Element
|
model = Element
|
||||||
fields = [
|
fields = [
|
||||||
|
|
|
@ -158,14 +158,17 @@ class ElementViewSet(viewsets.ModelViewSet):
|
||||||
)
|
)
|
||||||
inventory_serializer = InventorySerializer(inventory_object, many=False)
|
inventory_serializer = InventorySerializer(inventory_object, many=False)
|
||||||
|
|
||||||
element_item = Element.objects.create(
|
element_data = {
|
||||||
inventory=inventory_object,
|
"inventory": inventory_object.id,
|
||||||
external_id=data["element"],
|
"external_id": data["element"],
|
||||||
element_id=data["element_id"],
|
"element_id": data["element_id"],
|
||||||
additional_text=data["element_additional_data"],
|
}
|
||||||
)
|
if "element_additional_data" in data:
|
||||||
element_serializer = ElementSerializer(element_item, many=False)
|
element_data["additional_text"] = data["element_additional_data"]
|
||||||
|
element_serializer = ElementSerializer(data=element_data, many=False)
|
||||||
|
if element_serializer.is_valid():
|
||||||
|
element_data["inventory"] = inventory_object
|
||||||
|
Element.objects.create(**element_data)
|
||||||
return Response(
|
return Response(
|
||||||
{
|
{
|
||||||
"partner": partner_serializer.data,
|
"partner": partner_serializer.data,
|
||||||
|
@ -173,6 +176,10 @@ class ElementViewSet(viewsets.ModelViewSet):
|
||||||
"element": element_serializer.data,
|
"element": element_serializer.data,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
return Response(
|
||||||
|
element_serializer.errors, status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
||||||
|
)
|
||||||
|
|
||||||
@action(
|
@action(
|
||||||
detail=False,
|
detail=False,
|
||||||
|
|
2
dev.sh
2
dev.sh
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
x-terminal-emulator -title "To Invetory FRONT" -e "cd front && npm run dev"&
|
x-terminal-emulator -title "To Invetory FRONT" -e "cd front && npm run dev -- --host"&
|
||||||
x-terminal-emulator -title "To Invetory BACK" -e "poetry run task server"
|
x-terminal-emulator -title "To Invetory BACK" -e "poetry run task server"
|
|
@ -36,20 +36,7 @@ const external_data = reactive<ExternalDataType>({
|
||||||
categories: [],
|
categories: [],
|
||||||
element: [],
|
element: [],
|
||||||
})
|
})
|
||||||
|
const show_error = ref()
|
||||||
const external_elements = reactive<any>({})
|
|
||||||
const loadOneElement = async (id: string) => {
|
|
||||||
const data = await $fetch<ApiTypeExternal>(`${apiBase}/element/external/id/${id}`)
|
|
||||||
external_elements[id] = data.Description
|
|
||||||
|
|
||||||
}
|
|
||||||
const getExternalElementName = (id: string) => {
|
|
||||||
if (!external_elements[id]) {
|
|
||||||
loadOneElement(id)
|
|
||||||
return id
|
|
||||||
}
|
|
||||||
return external_elements[id]
|
|
||||||
}
|
|
||||||
|
|
||||||
const elements = ref(props.elements)
|
const elements = ref(props.elements)
|
||||||
const validate = (state: any): FormError[] => {
|
const validate = (state: any): FormError[] => {
|
||||||
|
@ -60,24 +47,37 @@ const validate = (state: any): FormError[] => {
|
||||||
errors.push({ path: 'partner', message: txt })
|
errors.push({ path: 'partner', message: txt })
|
||||||
}
|
}
|
||||||
if (!state.element_id) errors.push({ path: 'element_id', message: txt })
|
if (!state.element_id) errors.push({ path: 'element_id', message: txt })
|
||||||
if (!state.element_additional_data) errors.push({ path: 'element_additional_data', message: txt })
|
// if (!state.element_additional_data) errors.push({ path: 'element_additional_data', message: txt })
|
||||||
return errors
|
return errors
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onSubmit(event: FormSubmitEvent<any>) {
|
async function onSubmit(event: FormSubmitEvent<any>) {
|
||||||
|
show_error.value = undefined
|
||||||
const prepader_data = event.data
|
const prepader_data = event.data
|
||||||
if (!external_data || !external_data.partner) {
|
if (!external_data || !external_data.partner) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
prepader_data.partner_name = external_data.partner.find(el => el.Ref_Key == state.partner)?.Description
|
prepader_data.partner_name = external_data.partner.find(el => el.Ref_Key == state.partner)?.Description
|
||||||
|
|
||||||
const data = await $fetch<ApiElementSave>(`${apiBase}/element/`, { method: 'POST', body: JSON.stringify(prepader_data) })
|
const data = await $fetch<ApiElementSave>(`${apiBase}/element/`, {
|
||||||
|
method: 'POST', body: JSON.stringify(prepader_data), onResponseError: (error) => {
|
||||||
|
if (error.response.status == 500) {
|
||||||
|
show_error.value = Object.entries(error.response._data).map(el => `${el[0]}: ${el[1]}`).join('\n')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
const inv_id = route.params.inv_id || data.inventory?.id
|
const inv_id = route.params.inv_id || data.inventory?.id
|
||||||
if (!route.params.inv_id) {
|
if (!route.params.inv_id) {
|
||||||
navigateTo(`/organization/p_${data.partner.id}/i_${data.inventory.id}`)
|
navigateTo(`/organization/p_${data.partner.id}/i_${data.inventory.id}`)
|
||||||
} else {
|
} else {
|
||||||
const newElements = await $fetch<ApiTypeList>(`${apiBase}/element?inventory_id=${inv_id}`, { headers })
|
const newElements = await $fetch<ApiTypeList>(`${apiBase}/element?inventory_id=${inv_id}`, { headers })
|
||||||
elements.value = newElements.results
|
elements.value = newElements.results
|
||||||
|
external_data.element = []
|
||||||
|
external_data.categories = []
|
||||||
|
state.categories = []
|
||||||
|
state.element = undefined
|
||||||
|
state.element_id = undefined
|
||||||
|
state.element_additional_data = undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ onMounted(async () => {
|
||||||
<UInput placeholder="ID" v-model="state.element_id" />
|
<UInput placeholder="ID" v-model="state.element_id" />
|
||||||
</UFormGroup>
|
</UFormGroup>
|
||||||
<UFormGroup label="Дополнительные сведения" name="element_additional_data">
|
<UFormGroup label="Дополнительные сведения" name="element_additional_data">
|
||||||
<UTextarea placeholder="ID" v-model="state.element_additional_data" />
|
<UTextarea placeholder="Дополнительные сведения" v-model="state.element_additional_data" />
|
||||||
</UFormGroup>
|
</UFormGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -179,11 +179,14 @@ onMounted(async () => {
|
||||||
</UButton>
|
</UButton>
|
||||||
</UForm>
|
</UForm>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-7">
|
<div class="col-span-7 flex flex-col gap-4">
|
||||||
<h2>{{ external_data.partner?.find(el => el["Ref_Key"] == state.partner)?.Description }}</h2>
|
<h2>{{ external_data.partner?.find(el => el["Ref_Key"] == state.partner)?.Description }}</h2>
|
||||||
|
<UAlert v-if="show_error" title="Server error" :description="show_error" color="primary" />
|
||||||
<dl v-if="elements?.length">
|
<dl v-if="elements?.length">
|
||||||
<template v-for="item in elements">
|
<template v-for="item in elements">
|
||||||
<dt><Element :id="item.external_id"/></dt>
|
<dt>
|
||||||
|
<Element :id="item.external_id" />
|
||||||
|
</dt>
|
||||||
<dd>{{ item.element_id }}</dd>
|
<dd>{{ item.element_id }}</dd>
|
||||||
<dd>{{ item.additional_data }}</dd>
|
<dd>{{ item.additional_data }}</dd>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -28,7 +28,5 @@ watch(external_elements, () => {
|
||||||
}, { deep: true })
|
}, { deep: true })
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<Suspense>
|
|
||||||
{{ name }}
|
{{ name }}
|
||||||
</Suspense>
|
|
||||||
</template>
|
</template>
|
Loading…
Reference in New Issue