partial update

This commit is contained in:
Kseninia Mikhaylova 2024-07-22 16:51:24 +03:00
parent 65f54695d7
commit b92de6ac9f
4 changed files with 48 additions and 16 deletions

View File

@ -1,6 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from .models import TgItem from .models import TgItem, TmcField
import logging import logging
logger = logging.getLogger("root") logger = logging.getLogger("root")
@ -14,5 +14,5 @@ class TgItemSerializer(serializers.ModelSerializer):
class TmcFieldSerializer(serializers.ModelSerializer): class TmcFieldSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = TgItem model = TmcField
fields = "__all__" fields = "__all__"

View File

@ -1,6 +1,7 @@
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
import json import json
import requests
import time import time
from telegram import Update from telegram import Update
@ -22,7 +23,7 @@ logger = logging.getLogger("root")
class TgItemViewSet(viewsets.ModelViewSet): class TgItemViewSet(viewsets.ModelViewSet):
queryset = TgItem.objects.all().order_by("-updated_at") queryset = TgItem.objects.all().order_by("-updated_at")
serializer_class = TgItemSerializer serializer_class = TgItemSerializer
http_method_names = ["post", "get"] http_method_names = ["post", "get", "patch"]
def retrieve(self, request, pk=None): def retrieve(self, request, pk=None):
item = TgItem.objects.get(id=pk) item = TgItem.objects.get(id=pk)
@ -32,6 +33,10 @@ class TgItemViewSet(viewsets.ModelViewSet):
return super().retrieve(request, pk) return super().retrieve(request, pk)
# return Response(serializer.data) # return Response(serializer.data)
def partial_update(self, request, *args, **kwargs):
# logger.info(request.data['location_id'])
return super().partial_update(request)
@action(detail=False, methods=["post"], url_path=settings.TGBOT["WEBHOOK_URL"]) @action(detail=False, methods=["post"], url_path=settings.TGBOT["WEBHOOK_URL"])
def send_tg_data(self, request): def send_tg_data(self, request):
TgBotUpdater.my_queue.put( TgBotUpdater.my_queue.put(
@ -44,7 +49,10 @@ class TgItemViewSet(viewsets.ModelViewSet):
class TmcFieldViewset(viewsets.ModelViewSet): class TmcFieldViewset(viewsets.ModelViewSet):
queryset = TmcField.objects.all() queryset = TmcField.objects.all()
serializer_class = TmcFieldSerializer serializer_class = TmcFieldSerializer
http_method_names = ["get"] http_method_names = ["get", "patch"]
def partial_update(self, request, *args, **kwargs):
return super().partial_update(request)
@action(detail=False, methods=["get"], url_path=r"get_name/(?P<chat_id>[^/.]+)") @action(detail=False, methods=["get"], url_path=r"get_name/(?P<chat_id>[^/.]+)")
def get_name(self, request, chat_id): def get_name(self, request, chat_id):

View File

@ -8,8 +8,24 @@ const state = reactive({} as { name?: string, location?: { id: number, name: str
const loadData = async () => { const loadData = async () => {
const items_data = await apiCall<any>(`tgbot/${route.params.id}/`) const items_data = await apiCall<any>(`tgbot/${route.params.id}/`)
item.value = items_data item.value = items_data
state.id = items_data.id
state.name = items_data.name state.name = items_data.name
state.location = items_data.location.id state.location = items_data.location.id
state.tmc = items_data.tmc.map(el => {
return {
name: el.tmc.name,
id: el.id,
fields: el.field.map(item => {
return {
name: item.field.name,
comment: item.field.comment,
id: item.id,
text: item.text,
file_id: item.file_id
}
})
}
})
} }
const loadTer = async () => { const loadTer = async () => {
const terdeep_data = await apiCall<ApiPaged<{ id: number, name: string }>>(`tmc/terdeep/?size=1000`) const terdeep_data = await apiCall<ApiPaged<{ id: number, name: string }>>(`tmc/terdeep/?size=1000`)
@ -26,27 +42,35 @@ onMounted(async () => {
await loadData() await loadData()
loadTer() loadTer()
}) })
const patchField = async (field) => {
await apiCall(`tgbot/items/${field.id}/`, 'PATCH', { text: field.text })
}
const patchItem = async () => {
await apiCall(`tgbot/${state.id}/`, 'PATCH', { name: state.name, location: state.location })
}
</script> </script>
<template> <template>
<UForm :state="state" v-if="item"> <UForm :state="state" v-if="item">
<UFormGroup label="Название"> <UFormGroup label="Название">
<UInput v-model="state.name" /> <UInput v-model="state.name" />
</UFormGroup> </UFormGroup>
<UButton @click="patchItem">Сохранить</UButton>
<UFormGroup label="Локация"> <UFormGroup label="Локация">
<USelectMenu v-model="state.location" :options="terdeep" :searchable="search" value-attribute="id" <USelectMenu v-model="state.location" :options="terdeep" :searchable="search" value-attribute="id"
option-attribute="name" /> option-attribute="name" />
</UFormGroup> </UFormGroup>
<UFormGroup label="ТМЦ" v-if="item.tmc.length"> <UFormGroup label="ТМЦ" v-if="state.tmc">
<div v-for="el in item.tmc"> <div v-for="el in state.tmc">
<strong>{{ el.tmc.name }}</strong> <strong>{{ el.name }}</strong>
<ul> <ul>
<li v-for="i in el.field" class="grid grid-cols-3 gap-4"> <li v-for="field in el.fields" class="grid grid-cols-3 gap-4">
<span class="col-span-1"> <span class="col-span-1 flex flex-col gap-2 items-start">
{{ i.field.name }} {{ field.name }}
<UInput v-model="i.field.text" :placeholder="`Введите ${i.field.comment || 'с изображения'}`" /> <UInput v-model="field.text" :placeholder="`Введите ${field.comment || 'с изображения'}`" />
<UButton @click="patchField(field)">Сохранить</UButton>
</span> </span>
<span class="col-span-2"> <span class="col-span-2">
<GetImage :file_id="i.file_id" type="img" /> <GetImage :file_id="field.file_id" type="img" />
</span> </span>
</li> </li>
</ul> </ul>

View File

@ -1,7 +1,7 @@
import { apiBase } from '~/helpers'; import { apiBase } from '~/helpers';
export default async function<T> (path: string) { export default async function <T>(path: string, method = 'GET', body = null) {
const headers = new Headers(); const headers = new Headers();
headers.append("Content-Type", "application/json"); headers.append("Content-Type", "application/json");
return await $fetch<T>(`${apiBase}/${path}`, { headers }) return await $fetch<T>(`${apiBase}/${path}`, { method, headers, body })
} }