From 089f86e558419028b6cde42337e4f5e8edb58fd2 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Wed, 26 Nov 2025 18:37:50 +0500 Subject: [PATCH] doctor, district, place, plan serializerlar qoshildi --- core/apps/dashboard/serializers/district.py | 62 +++++++++ core/apps/dashboard/serializers/doctor.py | 140 ++++++++++++++++++++ core/apps/dashboard/serializers/place.py | 98 ++++++++++++++ core/apps/dashboard/serializers/plan.py | 74 +++++++++++ core/apps/shared/models/place.py | 3 +- 5 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 core/apps/dashboard/serializers/district.py create mode 100644 core/apps/dashboard/serializers/doctor.py create mode 100644 core/apps/dashboard/serializers/place.py create mode 100644 core/apps/dashboard/serializers/plan.py diff --git a/core/apps/dashboard/serializers/district.py b/core/apps/dashboard/serializers/district.py new file mode 100644 index 0000000..0136fab --- /dev/null +++ b/core/apps/dashboard/serializers/district.py @@ -0,0 +1,62 @@ +# django +from django.db import transaction + +# rest framework +from rest_framework import serializers + +# shared +from core.apps.shared.models import District +# accounts +from core.apps.accounts.models import User + + +class DistrictListSerializer(serializers.ModelSerializer): + user = serializers.SerializerMethodField() + + class Meta: + model = District + fields = [ + 'id', 'name', 'user', 'created_at' + ] + + def get_user(self, obj): + return { + "id": obj.user.id, + "first_name": obj.user.first_name, + "last_name": obj.user.last_name, + "telegram_id": obj.user.telegram_id, + } + + +class DistrictCreateSerializer(serializers.Serializer): + name = serializers.CharField() + user_id = serializers.IntegerField() + + def validate(self, data): + user = User.objects.filter(id=data['user_id']).first() + if not user: + raise serializers.ValidationError({"user_id": "Foydalanuvchi topilmadi"}) + data['user'] = user + return data + + def create(self, validated_data): + with transaction.atomic(): + return District.objects.create( + name=validated_data.get('name'), + user=validated_data.get('user'), + ) + + +class DistrictUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = District + fields = [ + 'name', 'user' + ] + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.name = validated_data.get('name', instance.name) + instance.user = validated_data.get('user', instance.user) + instance.save() + return instance diff --git a/core/apps/dashboard/serializers/doctor.py b/core/apps/dashboard/serializers/doctor.py new file mode 100644 index 0000000..04944ee --- /dev/null +++ b/core/apps/dashboard/serializers/doctor.py @@ -0,0 +1,140 @@ +# django +from django.db import transaction + +# rest framework +from rest_framework import serializers + +# shared +from core.apps.shared.models import Doctor +# accounts +from core.apps.accounts.models import User + + +class DoctorListSerializer(serializers.ModelSerializer): + district = serializers.SerializerMethodField(method_name='get_district') + place = serializers.SerializerMethodField(method_name='get_place') + user = serializers.SerializerMethodField(method_name='get_user') + + class Meta: + model = Doctor + fields = [ + 'id', + 'first_name', + 'last_name', + 'phone_number', + 'work_place', + 'sphere', + 'description', + 'district', + 'place', + 'user', + 'longitude', + 'latitude', + 'extra_location', + 'created_at' + ] + + def get_district(self, obj): + return { + 'id': obj.district.id, + 'name': obj.district.name + } + + def get_place(self, obj): + return { + 'id': obj.place.id, + 'name': obj.place.name + } + + def get_user(self, obj): + return { + 'id': obj.user.id, + 'first_name': obj.user.first_name, + 'last_name': obj.user.last_name, + } + + + +class DoctorCreateSerializer(serializers.Serializer): + first_name = serializers.CharField() + last_name = serializers.CharField() + phone_number = serializers.CharField() + work_place = serializers.CharField() + sphere = serializers.CharField() + description = serializers.CharField() + district_id = serializers.IntegerField() + place_id = serializers.IntegerField() + user_id = serializers.IntegerField() + longitude = serializers.FloatField() + latitude = serializers.FloatField() + extra_location = serializers.JSONField() + + def validate(self, data): + district = ... + if not district: + raise serializers.ValidationError({"district_id": "Tuman topilmadi"}) + + place = ... + if not place: + raise serializers.ValidationError({'place_id': "Obyekt topilmadi"}) + + user = User.objects.filter(id=data['user_id']).first() + if not user: + raise serializers.ValidationError({"user_id": "Foydalanuvchi topilmadi"}) + data['district'] = district + + data['place'] = place + data['user'] = user + return data + def create(self, validated_data): + with transaction.atomic(): + return Doctor.objects.create( + first_name=validated_data.get('first_name'), + last_name=validated_data.get('last_name'), + phone_number=validated_data.get('phone_number'), + work_place=validated_data.get('work_place'), + sphere=validated_data.get('sphere'), + description=validated_data.get('description'), + district=validated_data.get('district'), + user=validated_data.get('user'), + place=validated_data.get('place'), + longitude=validated_data.get('longitude'), + latitude=validated_data.get('latitude'), + extra_location=validated_data.get('extra_location'), + ) + + +class DoctorUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Doctor + fields = [ + 'first_name', + 'last_name', + 'phone_number', + 'work_place', + 'sphere', + 'description', + 'district', + 'place', + 'user', + 'longitude', + 'latitude', + 'extra_location', + ] + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.first_name = validated_data.get('first_name', instance.first_name) + instance.last_name = validated_data.get('last_name', instance.last_name) + instance.phone_number = validated_data.get('phone_number', instance.phone_number) + instance.work_place = validated_data.get('work_place', instance.work_place) + instance.sphere = validated_data.get('sphere', instance.sphere) + instance.description = validated_data.get('description', instance.description) + instance.user = validated_data.get('user', instance.user) + instance.district = validated_data.get('district', instance.district) + instance.place = validated_data.get('place', instance.place) + instance.longitude = validated_data.get('longitude', instance.longitude) + instance.latitude = validated_data.get('latitude', instance.latitude) + instance.extra_location = validated_data.get('extra_location', instance.extra_location) + instance.save() + return instance \ No newline at end of file diff --git a/core/apps/dashboard/serializers/place.py b/core/apps/dashboard/serializers/place.py new file mode 100644 index 0000000..184b958 --- /dev/null +++ b/core/apps/dashboard/serializers/place.py @@ -0,0 +1,98 @@ +# django +from django.db import transaction + +# rest framework +from rest_framework import serializers + +# shared +from core.apps.shared.models import Place, District +# accounts +from core.apps.accounts.models import User + + +class PlaceListSerializer(serializers.ModelSerializer): + district = serializers.SerializerMethodField(method_name='get_district') + user = serializers.SerializerMethodField(method_name='get_user') + + class Meta: + model = Place + fields = [ + 'id', + 'name', + 'district', + 'user', + 'longitude', + 'latitude', + 'extra_location', + 'created_at' + ] + + def get_district(self, obj): + return { + "id": obj.district.id, + "name": obj.district.name + } + + def get_user(self, obj): + return { + "id": obj.user.id, + "first_name": obj.user.first_name, + "last_name": obj.user.last_name + } + + +class PlaceCreateSerializer(serializers.Serializer): + district_id = serializers.IntegerField() + user_id = serializers.IntegerField() + + name = serializers.CharField() + longitude = serializers.FloatField() + latitude = serializers.FloatField() + extra_location = serializers.JSONField() + + def validate(self, data): + district = District.objects.filter(id=data['district_id']).first() + if not district: + raise serializers.ValidationError({"district_id": "Tuman topilmadi"}) + + user = User.objects.filter(id=data['user_id']).first() + if not user: + raise serializers.ValidationError({"user_id": "Foydalanuvchi topilmadi"}) + + data['user'] = user + data['district'] = district + return + + def create(self, validated_data): + with transaction.atomic(): + return Place.objects.create( + name=validated_data.get('name'), + longitude=validated_data.get('longitude'), + latitude=validated_data.get('latitude'), + extra_location=validated_data.get('extra_location'), + user=validated_data.get('user'), + district=validated_data.get('district'), + ) + + +class PlaceUpdateSerializer(serializers.ModelSerializer): + class Meta: + fields = [ + 'name', + 'district', + 'user', + 'longitude', + 'latitude', + 'extra_location', + ] + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.name = validated_data.get('name', instance.name) + instance.district = validated_data.get('district', instance.district) + instance.user = validated_data.get('user', instance.user) + instance.longitude = validated_data.get('longitude', instance.longitude) + instance.latitude = validated_data.get('latitude', instance.latitude) + instance.extra_location = validated_data.get('extra_location', instance.extra_location) + instance.save() + return instance diff --git a/core/apps/dashboard/serializers/plan.py b/core/apps/dashboard/serializers/plan.py new file mode 100644 index 0000000..a6e65fb --- /dev/null +++ b/core/apps/dashboard/serializers/plan.py @@ -0,0 +1,74 @@ +# django +from django.db import transaction + +# rest framework +from rest_framework import serializers + +# shared +from core.apps.shared.models import Plan +# accounts +from core.apps.accounts.models import User + + +class PlanListSerializer(serializers.ModelSerializer): + class Meta: + model = Plan + fields = [ + 'id', + 'title', + 'description', + 'date', + 'user', + 'created_at' + ] + + def get_user(self, obj): + return { + 'id': obj.user.id, + 'first_name': obj.user_first_name, + 'last_name': obj.user.last_name, + } + + +class PlanCreateSerializer(serializers.Serializer): + title = serializers.CharField() + description = serializers.CharField() + date = serializers.DateField() + user_id = serializers.IntegerField() + + def validate(self, data): + user = User.objects.filter(id=data['user_id']).first() + if not user: + raise serializers.ValidationError({"user_id": "Foydalanuvchi topilmadi"}) + data['user'] = user + return data + + def create(self, validated_data): + with transaction.atomic(): + return Plan.objects.create( + title=validated_data.get('title'), + description=validated_data.get('description'), + user=validated_data.get('user'), + date=validated_data.get('date'), + ) + + +class PlanUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Plan + fields = [ + 'title', + 'description', + 'date', + 'user', + ] + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.title = validated_data.get('title', instance.title) + instance.description = validated_data.get('description', instance.description) + instance.user = validated_data.get('user', instance.user) + instance.date = validated_data.get('date', instance.date) + instance.save() + return instance + \ No newline at end of file diff --git a/core/apps/shared/models/place.py b/core/apps/shared/models/place.py index e1f4be1..a098a31 100644 --- a/core/apps/shared/models/place.py +++ b/core/apps/shared/models/place.py @@ -7,9 +7,10 @@ from core.apps.accounts.models import User class Place(BaseModel): - name = models.CharField(max_length=200, unique=True) district = models.ForeignKey(District, on_delete=models.CASCADE, related_name='places') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='places') + + name = models.CharField(max_length=200, unique=True) longitude = models.FloatField(default=0.00) latitude = models.FloatField(default=0.00) extra_location = models.JSONField()