partial update
This commit is contained in:
parent
65f54695d7
commit
b92de6ac9f
|
@ -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__"
|
|
@ -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)
|
||||||
|
@ -31,6 +32,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):
|
||||||
|
@ -44,8 +49,11 @@ 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):
|
||||||
TgBotUpdater.my_queue.put({"name": "admin_get_name", "queryset": chat_id})
|
TgBotUpdater.my_queue.put({"name": "admin_get_name", "queryset": chat_id})
|
||||||
|
|
|
@ -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`)
|
||||||
|
@ -17,7 +33,7 @@ const loadTer = async () => {
|
||||||
}
|
}
|
||||||
const search = (q: string) => {
|
const search = (q: string) => {
|
||||||
if (q) {
|
if (q) {
|
||||||
return terdeep.value.filter((el:any) => el.name.toLowerCase().indexOf(q.toLowerCase()) !== -1).slice(0, 10)
|
return terdeep.value.filter((el: any) => el.name.toLowerCase().indexOf(q.toLowerCase()) !== -1).slice(0, 10)
|
||||||
} else {
|
} else {
|
||||||
return terdeep.value.slice(0, 10)
|
return terdeep.value.slice(0, 10)
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
|
|
@ -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 })
|
||||||
}
|
}
|
Loading…
Reference in New Issue