save partner to db

This commit is contained in:
aarizona 2024-05-29 17:21:15 +03:00
parent e1e353bc51
commit 8c7e4332dd
6 changed files with 77 additions and 7 deletions

View File

@ -3,14 +3,15 @@ from django.db import models
class Partner(models.Model): class Partner(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
external_id = models.CharField()
def __str__(self): def __str__(self):
return f" partner {self.id}" return f"Partner {self.id}"
class Element(models.Model): class Element(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
external_id = models.IntegerField() external_id = models.CharField()
type = models.CharField(max_length=100) type = models.CharField(max_length=100)
photo = models.ImageField(upload_to=".") photo = models.ImageField(upload_to=".")
additional_text = models.TextField() additional_text = models.TextField()

View File

@ -5,7 +5,7 @@ from .models import Partner, Element
class PartnerSerializer(serializers.ModelSerializer): class PartnerSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Partner model = Partner
fields = ["id"] fields = ["id", "external_id"]
class ElementSerializer(serializers.ModelSerializer): class ElementSerializer(serializers.ModelSerializer):
class Meta: class Meta:

View File

@ -24,6 +24,13 @@ class PartnerViewSet(viewsets.ModelViewSet):
queryset = Partner.objects.all() queryset = Partner.objects.all()
serializer_class = PartnerSerializer serializer_class = PartnerSerializer
def create(self, validated_data):
logger.info("create")
super().create(**validated_data)
def get(self, request, **kwargs):
logger.info("get")
@action(detail=False, methods=["get"], url_path=r"external") @action(detail=False, methods=["get"], url_path=r"external")
def get_remote_partners(self, request): def get_remote_partners(self, request):
params = { params = {
@ -67,6 +74,20 @@ class ElementViewSet(viewsets.ModelViewSet):
queryset = Element.objects.all() queryset = Element.objects.all()
serializer_class = ElementSerializer serializer_class = ElementSerializer
def create(self, request, **kwargs):
data = request.data
# check if partner exist
if Partner.objects.filter(external_id=data["partner"]).exists():
partner_object = Partner.objects.get(external_id=data["partner"])
else:
partner_object = Partner.objects.create(external_id=data["partner"])
partner_serializer = PartnerSerializer(partner_object, many=False)
return Response({"partner": partner_serializer.data})
@action( @action(
detail=False, detail=False,
methods=["get"], methods=["get"],

View File

@ -10,7 +10,8 @@
"@nuxt/ui": "^2.16.0", "@nuxt/ui": "^2.16.0",
"nuxt": "^3.11.2", "nuxt": "^3.11.2",
"vue": "^3.4.27", "vue": "^3.4.27",
"vue-router": "^4.3.2" "vue-router": "^4.3.2",
"yup": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"sass": "^1.77.2" "sass": "^1.77.2"
@ -9506,6 +9507,11 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/property-expr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
"integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="
},
"node_modules/protocols": { "node_modules/protocols": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz",
@ -10922,6 +10928,11 @@
"node": ">=0.8" "node": ">=0.8"
} }
}, },
"node_modules/tiny-case": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
"integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
},
"node_modules/tiny-invariant": { "node_modules/tiny-invariant": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
@ -10954,6 +10965,11 @@
"node": ">=0.6" "node": ">=0.6"
} }
}, },
"node_modules/toposort": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
"integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
},
"node_modules/totalist": { "node_modules/totalist": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
@ -12162,6 +12178,28 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/yup": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz",
"integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==",
"dependencies": {
"property-expr": "^2.0.5",
"tiny-case": "^1.0.3",
"toposort": "^2.0.2",
"type-fest": "^2.19.0"
}
},
"node_modules/yup/node_modules/type-fest": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/zhead": { "node_modules/zhead": {
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz",

View File

@ -13,7 +13,8 @@
"@nuxt/ui": "^2.16.0", "@nuxt/ui": "^2.16.0",
"nuxt": "^3.11.2", "nuxt": "^3.11.2",
"vue": "^3.4.27", "vue": "^3.4.27",
"vue-router": "^4.3.2" "vue-router": "^4.3.2",
"yup": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"sass": "^1.77.2" "sass": "^1.77.2"

View File

@ -1,6 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { object, string, type InferType } from 'yup'
import { apiBase } from '~/helpers'; import { apiBase } from '~/helpers';
import type { ApiTypeExternal } from '~/helpers'; import type { ApiTypeExternal } from '~/helpers';
import type { FormSubmitEvent } from '#ui/types'
type ExternalDataType = { type ExternalDataType = {
partner?: ApiTypeExternal[], partner?: ApiTypeExternal[],
@ -25,9 +27,16 @@ const external_data = reactive<ExternalDataType>({
categories: [], categories: [],
element: [], element: [],
}) })
const schema = object({
element: string().required('Required'),
element_id: string().required('Required')
})
type Schema = InferType<typeof schema>
async function onSubmit(event: FormSubmitEvent<Schema>) { async function onSubmit(event: FormSubmitEvent<Schema>) {
// Do something with event.data
console.log(event.data) console.log(event.data)
const data = $fetch(`${apiBase}/element/`, { method: 'POST', body: JSON.stringify(event.data) })
console.log(data)
} }
const searchInExternal = (q: string) => { const searchInExternal = (q: string) => {
@ -111,7 +120,7 @@ onMounted(async () => {
<UInput placeholder="ID" v-model="state.element_id" /> <UInput placeholder="ID" v-model="state.element_id" />
</UFormGroup> </UFormGroup>
<UButton type="submit"> <UButton type="submit" :disabled="!state.element_id">
Сохранить Сохранить
</UButton> </UButton>
</UForm> </UForm>