This commit is contained in:
Kseninia Mikhaylova 2024-05-31 09:48:48 +03:00
parent 2e361ff919
commit 877f99f466
7 changed files with 55 additions and 41 deletions

View File

@ -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

View File

@ -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(

View File

@ -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 = [

View File

@ -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
View File

@ -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"

View File

@ -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>

View File

@ -28,7 +28,5 @@ watch(external_elements, () => {
}, { deep: true }) }, { deep: true })
</script> </script>
<template> <template>
<Suspense>
{{ name }} {{ name }}
</Suspense>
</template> </template>