diff --git a/back/api/settings.py b/back/api/settings.py index e1d980d..e25af13 100644 --- a/back/api/settings.py +++ b/back/api/settings.py @@ -31,6 +31,7 @@ DEBUG = True ALLOWED_HOSTS = [] CORS_ALLOWED_ORIGINS = [ 'http://localhost:3000', + 'http://192.168.103.159:3000' ] # Application definition diff --git a/back/inventory/models.py b/back/inventory/models.py index ac18d18..683a8c1 100644 --- a/back/inventory/models.py +++ b/back/inventory/models.py @@ -34,8 +34,8 @@ class Element(models.Model): id = models.AutoField(primary_key=True) external_id = models.CharField() element_id = models.CharField(max_length=100) - photo = models.ImageField(upload_to=".") - additional_text = models.TextField() + photo = models.ImageField(upload_to=".", null=True) + additional_text = models.TextField(null=True, blank=True, default="") created_at = models.DateTimeField(auto_now_add=True) inventory = models.ForeignKey( diff --git a/back/inventory/serializers.py b/back/inventory/serializers.py index e1aecff..87c7160 100644 --- a/back/inventory/serializers.py +++ b/back/inventory/serializers.py @@ -1,4 +1,6 @@ from rest_framework import serializers +from rest_framework.validators import UniqueValidator + from .models import Element, InventoryItem, Partner import logging @@ -37,7 +39,10 @@ class InventorySerializer(serializers.ModelSerializer): class ElementSerializer(serializers.ModelSerializer): 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: model = Element fields = [ diff --git a/back/inventory/views.py b/back/inventory/views.py index 7ff0a92..75d7424 100644 --- a/back/inventory/views.py +++ b/back/inventory/views.py @@ -158,21 +158,28 @@ class ElementViewSet(viewsets.ModelViewSet): ) inventory_serializer = InventorySerializer(inventory_object, many=False) - element_item = Element.objects.create( - inventory=inventory_object, - external_id=data["element"], - element_id=data["element_id"], - additional_text=data["element_additional_data"], - ) - element_serializer = ElementSerializer(element_item, many=False) - - return Response( - { - "partner": partner_serializer.data, - "inventory": inventory_serializer.data, - "element": element_serializer.data, - } - ) + element_data = { + "inventory": inventory_object.id, + "external_id": data["element"], + "element_id": data["element_id"], + } + if "element_additional_data" in data: + 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( + { + "partner": partner_serializer.data, + "inventory": inventory_serializer.data, + "element": element_serializer.data, + } + ) + else: + return Response( + element_serializer.errors, status=status.HTTP_500_INTERNAL_SERVER_ERROR + ) @action( detail=False, diff --git a/dev.sh b/dev.sh index 15d80e0..53b3d51 100755 --- a/dev.sh +++ b/dev.sh @@ -1,3 +1,3 @@ #!/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" \ No newline at end of file diff --git a/front/components/edit.vue b/front/components/edit.vue index 13da419..700d218 100644 --- a/front/components/edit.vue +++ b/front/components/edit.vue @@ -36,20 +36,7 @@ const external_data = reactive({ categories: [], element: [], }) - -const external_elements = reactive({}) -const loadOneElement = async (id: string) => { - const data = await $fetch(`${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 show_error = ref() const elements = ref(props.elements) const validate = (state: any): FormError[] => { @@ -60,24 +47,37 @@ const validate = (state: any): FormError[] => { errors.push({ path: 'partner', 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 } async function onSubmit(event: FormSubmitEvent) { + show_error.value = undefined const prepader_data = event.data if (!external_data || !external_data.partner) { return false } prepader_data.partner_name = external_data.partner.find(el => el.Ref_Key == state.partner)?.Description - const data = await $fetch(`${apiBase}/element/`, { method: 'POST', body: JSON.stringify(prepader_data) }) + const data = await $fetch(`${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 if (!route.params.inv_id) { navigateTo(`/organization/p_${data.partner.id}/i_${data.inventory.id}`) } else { const newElements = await $fetch(`${apiBase}/element?inventory_id=${inv_id}`, { headers }) 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 () => { - + @@ -179,11 +179,14 @@ onMounted(async () => { -
+

{{ external_data.partner?.find(el => el["Ref_Key"] == state.partner)?.Description }}

+
diff --git a/front/components/element.vue b/front/components/element.vue index da4f90e..60c540f 100644 --- a/front/components/element.vue +++ b/front/components/element.vue @@ -28,7 +28,5 @@ watch(external_elements, () => { }, { deep: true }) \ No newline at end of file