plan uchun yangi fieldlar qoshildi

This commit is contained in:
behruz-dev
2025-12-03 16:48:59 +05:00
parent 2054d17332
commit 676d9c5dcd
6 changed files with 152 additions and 33 deletions

View File

@@ -33,7 +33,7 @@ class PlanListSerializer(serializers.ModelSerializer):
} }
class PlanCreateSerializer(serializers.Serializer): class AdminPlanCreateSerializer(serializers.Serializer):
title = serializers.CharField() title = serializers.CharField()
description = serializers.CharField() description = serializers.CharField()
date = serializers.DateField() date = serializers.DateField()

View File

@@ -23,7 +23,7 @@ class PlanViewSet(viewsets.GenericViewSet, ResponseMixin):
def get_serializer_class(self): def get_serializer_class(self):
if self.action == "post": if self.action == "post":
return serializers.PlanCreateSerializer return serializers.AdminPlanCreateSerializer
elif self.action in ("patch", "put"): elif self.action in ("patch", "put"):
return serializers.PlanUpdateSerializer return serializers.PlanUpdateSerializer
else: else:

View File

@@ -0,0 +1,44 @@
# Generated by Django 5.2 on 2025-12-03 11:16
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shared', '0015_support_type'),
]
operations = [
migrations.AddField(
model_name='plan',
name='comment',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='plan',
name='doctor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='plans', to='shared.doctor'),
),
migrations.AddField(
model_name='plan',
name='extra_location',
field=models.JSONField(blank=True, null=True),
),
migrations.AddField(
model_name='plan',
name='latitude',
field=models.FloatField(default=0.0),
),
migrations.AddField(
model_name='plan',
name='longitude',
field=models.FloatField(default=0.0),
),
migrations.AddField(
model_name='plan',
name='pharmacy',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='plans', to='shared.pharmacy'),
),
]

View File

@@ -1,7 +1,7 @@
from django.db import models from django.db import models
# shared # shared
from core.apps.shared.models import BaseModel from core.apps.shared.models import BaseModel, Doctor, Pharmacy
# accounts # accounts
from core.apps.accounts.models import User from core.apps.accounts.models import User
@@ -11,8 +11,15 @@ class Plan(BaseModel):
description = models.TextField() description = models.TextField()
date = models.DateField() date = models.DateField()
is_done = models.BooleanField(default=False) is_done = models.BooleanField(default=False)
comment = models.TextField(null=True, blank=True)
# relations # relations
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='plans') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='plans')
doctor = models.ForeignKey(Doctor, on_delete=models.SET_NULL, related_name='plans', null=True, blank=True)
pharmacy = models.ForeignKey(Pharmacy, on_delete=models.SET_NULL, related_name='plans', null=True, blank=True)
# location
longitude = models.FloatField(default=0.00)
latitude = models.FloatField(default=0.00)
extra_location = models.JSONField(null=True, blank=True)
def __str__(self): def __str__(self):
return self.title return self.title

View File

@@ -5,37 +5,91 @@ from django.db import transaction
from rest_framework import serializers from rest_framework import serializers
# shared # shared
from core.apps.shared.models import Plan from core.apps.shared.models import Plan, Doctor, Pharmacy
class PlanSerializer(serializers.ModelSerializer): class PlanCreateSerializer(serializers.Serializer):
class Meta: title = serializers.CharField(max_length=200)
model = Plan description = serializers.CharField()
fields = [ date = serializers.DateField()
'id', 'title', 'description', 'date', 'is_done', 'created_at' doctor_id = serializers.IntegerField(required=False, allow_null=True)
] pharmacy_id = serializers.IntegerField(required=False, allow_null=True)
longitude = serializers.FloatField(required=False, default=0.0)
latitude = serializers.FloatField(required=False, default=0.0)
extra_location = serializers.JSONField(required=False, allow_null=True)
def validate(self, data):
if data.get('doctor_id'):
doctor = Doctor.objects.filter(id=data.get('doctor_id')).first()
if not doctor:
raise serializers.ValidationError({"doctor": "Doctor not found"})
data['doctor'] = doctor
if data.get('pharmacy_id'):
pharmacy = Pharmacy.objects.filter(id=data.get('pharmacy_id')).first()
if not pharmacy:
raise serializers.ValidationError({"pharmacy_id": "Pharmacy not found"})
data['pharmacy'] = pharmacy
return data
def create(self, validated_data): def create(self, validated_data):
with transaction.atomic(): with transaction.atomic():
return Plan.objects.create( user = self.context['user']
title=validated_data.get('title'), doctor = validated_data.pop('doctor', None)
description=validated_data.get('description'), pharmacy = validated_data.pop('pharmacy', None)
date=validated_data.get('date'), plan = Plan.objects.create(
user=self.context.get('user'), user=user,
doctor=doctor,
pharmacy=pharmacy,
**validated_data
) )
return plan
class PlanSerializer(serializers.ModelSerializer):
doctor = serializers.SerializerMethodField(method_name='get_doctor')
pharmacy = serializers.SerializerMethodField(method_name='get_pharmacy')
class Meta:
model = Plan
fields = [
'id', 'title', 'description', 'date',
'comment', 'doctor', 'pharmacy',
'longitude', 'latitude', 'extra_location',
'created_at'
]
read_only_fields = ['id', 'is_done', 'created_at']
def get_doctor(self, obj):
return {
"id": obj.doctor.id,
"first_name": obj.doctor.first_name,
"last_name": obj.doctor.last_name
} if obj.doctor is not None else None
def get_pharmacy(self, obj):
return {
"id": obj.pharmacy.id,
"name": obj.pharmacy.name,
} if obj.pharmacy is not None else None
class PlanUpdateSerializer(serializers.ModelSerializer): class PlanUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Plan model = Plan
fields = [ fields = [
'title', 'description', 'date', 'is_done', 'title', 'description', 'date',
'comment', 'doctor', 'pharmacy',
'longitude', 'latitude', 'extra_location',
] ]
def update(self, instance, validated_data): def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title) for field, value in validated_data.items():
instance.description = validated_data.get('description', instance.description) setattr(instance, field, value)
instance.date = validated_data.get('date', instance.date)
instance.is_done = validated_data.get('is_done')
instance.save() instance.save()
return instance return instance
class PlanCompliteSerializer(serializers.Serializer):
comment = serializers.CharField()

View File

@@ -10,16 +10,21 @@ from drf_yasg import openapi
# shared # shared
from core.apps.shared.models import Plan from core.apps.shared.models import Plan
from core.apps.shared.serializers.base import BaseResponseSerializer, SuccessResponseSerializer from core.apps.shared.serializers.base import BaseResponseSerializer, SuccessResponseSerializer
from core.apps.shared.serializers.plan import PlanSerializer, PlanUpdateSerializer from core.apps.shared.serializers.plan import PlanSerializer, PlanUpdateSerializer, PlanCreateSerializer, PlanCompliteSerializer
from core.apps.shared.utils.response_mixin import ResponseMixin from core.apps.shared.utils.response_mixin import ResponseMixin
class PlanApiView(generics.GenericAPIView, ResponseMixin): class PlanApiView(generics.GenericAPIView, ResponseMixin):
serializer_class = PlanSerializer
queryset = Plan.objects.all() queryset = Plan.objects.all()
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
def get_serializer_class(self):
if self.request.method == 'POST':
return PlanCreateSerializer
else:
return PlanSerializer
@swagger_auto_schema( @swagger_auto_schema(
operation_description="date boyicha filter bor, ?date=date", operation_description="date boyicha filter bor, ?date=date",
responses={ responses={
@@ -34,7 +39,7 @@ class PlanApiView(generics.GenericAPIView, ResponseMixin):
queryset = self.queryset.filter(user=request.user) queryset = self.queryset.filter(user=request.user)
if date: if date:
queryset = queryset.filter(date=date) queryset = queryset.filter(date=date)
serializer = self.serializer_class(queryset, many=True) serializer = self.get_serializer(queryset, many=True)
return self.success_response(data=serializer.data, message='malumotlar fetch qilindi') return self.success_response(data=serializer.data, message='malumotlar fetch qilindi')
except Exception as e: except Exception as e:
return self.error_response(data=str(e), message='xatolik') return self.error_response(data=str(e), message='xatolik')
@@ -48,7 +53,7 @@ class PlanApiView(generics.GenericAPIView, ResponseMixin):
) )
def post(self, request): def post(self, request):
try: try:
serializer = self.serializer_class(data=request.data, context={'user': request.user}) serializer = self.get_serializer(data=request.data, context={'user': request.user})
if serializer.is_valid(): if serializer.is_valid():
obj = serializer.save() obj = serializer.save()
created_data = PlanSerializer(obj).data created_data = PlanSerializer(obj).data
@@ -63,7 +68,7 @@ class PlanApiView(generics.GenericAPIView, ResponseMixin):
class ComplitePlanApiView(generics.GenericAPIView, ResponseMixin): class ComplitePlanApiView(generics.GenericAPIView, ResponseMixin):
serializer_class = None serializer_class = PlanCompliteSerializer
queryset = Plan.objects.all() queryset = Plan.objects.all()
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
@@ -80,12 +85,21 @@ class ComplitePlanApiView(generics.GenericAPIView, ResponseMixin):
def post(self, request, id): def post(self, request, id):
try: try:
obj = get_object_or_404(Plan, id=id, user=request.user) obj = get_object_or_404(Plan, id=id, user=request.user)
obj.is_done = True serializer = self.serializer_class(data=request.data)
obj.save() if serializer.is_valid():
return self.success_response( comment = serializer.validated_data.get('comment')
data=PlanSerializer(obj).data, obj.is_done = True
message='malumot yangilandi' obj.comment = comment
) obj.save()
return self.success_response(
data=PlanSerializer(obj).data,
message='malumot yangilandi'
)
else:
return self.failure_response(
data=serializer.errors,
message="malumot yangilanmadi"
)
except Exception as e: except Exception as e:
return self.error_response(data=str(e), message='xatolik') return self.error_response(data=str(e), message='xatolik')