From 7723aad1464d62de69cd7fb5788d78460ad4a107 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 22 Nov 2025 16:17:06 +0500 Subject: [PATCH] kop narsalar qoshildi --- core/apps/shared/admin/__init__.py | 3 +- core/apps/shared/admin/district.py | 12 ++++ core/apps/shared/migrations/0002_district.py | 25 ++++++++ .../shared/migrations/0003_district_user.py | 21 +++++++ core/apps/shared/migrations/0004_place.py | 33 ++++++++++ core/apps/shared/models/__init__.py | 4 +- core/apps/shared/models/district.py | 16 +++++ core/apps/shared/models/place.py | 18 ++++++ core/apps/shared/serializers/district.py | 12 ++++ core/apps/shared/urls.py | 10 ++- core/apps/shared/views/district.py | 61 +++++++++++++++++++ 11 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 core/apps/shared/admin/district.py create mode 100644 core/apps/shared/migrations/0002_district.py create mode 100644 core/apps/shared/migrations/0003_district_user.py create mode 100644 core/apps/shared/migrations/0004_place.py create mode 100644 core/apps/shared/models/district.py create mode 100644 core/apps/shared/models/place.py create mode 100644 core/apps/shared/serializers/district.py create mode 100644 core/apps/shared/views/district.py diff --git a/core/apps/shared/admin/__init__.py b/core/apps/shared/admin/__init__.py index 08c1add..626891d 100644 --- a/core/apps/shared/admin/__init__.py +++ b/core/apps/shared/admin/__init__.py @@ -1 +1,2 @@ -from .region import * \ No newline at end of file +from .region import * +from .district import * \ No newline at end of file diff --git a/core/apps/shared/admin/district.py b/core/apps/shared/admin/district.py new file mode 100644 index 0000000..7ab1ee7 --- /dev/null +++ b/core/apps/shared/admin/district.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +# shared +from core.apps.shared.models import District + + +@admin.register(District) +class DistrictAdmin(admin.ModelAdmin): + list_display = ['name', 'user', 'created_at'] + search_fields = ['name'] + + \ No newline at end of file diff --git a/core/apps/shared/migrations/0002_district.py b/core/apps/shared/migrations/0002_district.py new file mode 100644 index 0000000..c4d6503 --- /dev/null +++ b/core/apps/shared/migrations/0002_district.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2 on 2025-11-22 09:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shared', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='District', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=200, unique=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/core/apps/shared/migrations/0003_district_user.py b/core/apps/shared/migrations/0003_district_user.py new file mode 100644 index 0000000..81da519 --- /dev/null +++ b/core/apps/shared/migrations/0003_district_user.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2 on 2025-11-22 10:25 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shared', '0002_district'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='district', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='districts', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/core/apps/shared/migrations/0004_place.py b/core/apps/shared/migrations/0004_place.py new file mode 100644 index 0000000..1920eb0 --- /dev/null +++ b/core/apps/shared/migrations/0004_place.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2 on 2025-11-22 11:16 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shared', '0003_district_user'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Place', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=200, unique=True)), + ('longitude', models.FloatField(default=0.0)), + ('latitude', models.FloatField(default=0.0)), + ('extra_location', models.JSONField()), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='places', to='shared.district')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='places', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/core/apps/shared/models/__init__.py b/core/apps/shared/models/__init__.py index 52b0b29..4873267 100644 --- a/core/apps/shared/models/__init__.py +++ b/core/apps/shared/models/__init__.py @@ -1,2 +1,4 @@ from .base import * -from .region import Region \ No newline at end of file +from .region import * +from .district import * +from .place import * \ No newline at end of file diff --git a/core/apps/shared/models/district.py b/core/apps/shared/models/district.py new file mode 100644 index 0000000..6f635c8 --- /dev/null +++ b/core/apps/shared/models/district.py @@ -0,0 +1,16 @@ +from django.db import models + +# shared +from core.apps.shared.models import BaseModel +# accounts +from core.apps.accounts.models import User + + +class District(BaseModel): + name = models.CharField(max_length=200, unique=True) + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name='districts', null=True + ) + + def __str__(self): + return self.name diff --git a/core/apps/shared/models/place.py b/core/apps/shared/models/place.py new file mode 100644 index 0000000..e1f4be1 --- /dev/null +++ b/core/apps/shared/models/place.py @@ -0,0 +1,18 @@ +from django.db import models + +# shared +from core.apps.shared.models import BaseModel, District +# accounts +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') + longitude = models.FloatField(default=0.00) + latitude = models.FloatField(default=0.00) + extra_location = models.JSONField() + + def __str__(self): + return self.name \ No newline at end of file diff --git a/core/apps/shared/serializers/district.py b/core/apps/shared/serializers/district.py new file mode 100644 index 0000000..e4fa599 --- /dev/null +++ b/core/apps/shared/serializers/district.py @@ -0,0 +1,12 @@ +from rest_framework import serializers + +# shared +from core.apps.shared.models import District + + +class DistrictSerializer(serializers.ModelSerializer): + class Meta: + model = District + fields = [ + 'id', 'name', 'created_at' + ] \ No newline at end of file diff --git a/core/apps/shared/urls.py b/core/apps/shared/urls.py index 43f0f03..c14916e 100644 --- a/core/apps/shared/urls.py +++ b/core/apps/shared/urls.py @@ -2,6 +2,8 @@ from django.urls import path, include # shared region view from core.apps.shared.views import region as region_view +# shared district view +from core.apps.shared.views import district as dis_view urlpatterns = [ @@ -10,4 +12,10 @@ urlpatterns = [ path('list/', region_view.RegionListApiView.as_view(), name='region-list-api'), ], )), -] \ No newline at end of file + path('disctrict/', include( + [ + path('list/', dis_view.DistrictListApiView.as_view(), name='district-list-api'), + path('create/', dis_view.DistrictCreateApiView.as_view(), name='district-create-api'), + ], + )), +] \ No newline at end of file diff --git a/core/apps/shared/views/district.py b/core/apps/shared/views/district.py new file mode 100644 index 0000000..9d5bf68 --- /dev/null +++ b/core/apps/shared/views/district.py @@ -0,0 +1,61 @@ +# rest framework +from rest_framework import generics, permissions + +# drf yasg +from drf_yasg.utils import swagger_auto_schema + +# shared +from core.apps.shared.models import District +from core.apps.shared.serializers import base as base_serializers +from core.apps.shared.serializers import district as district_serializers +from core.apps.shared.utils.response_mixin import ResponseMixin + + +class DistrictListApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = district_serializers.DistrictSerializer + queryset = District.objects.all() + permission_classes = [permissions.IsAuthenticated] + + @swagger_auto_schema( + responses={ + 200: base_serializers.SuccessResponseSerializer(data_serializer=district_serializers.DistrictSerializer()), + 400: base_serializers.BaseResponseSerializer(), + 500: base_serializers.BaseResponseSerializer(), + } + ) + def get(self, request): + try: + queryset = self.queryset.filter(user=request.user) + serializer = self.serializer_class(queryset, many=True) + return self.success_response(data=serializer.data, message='malumotlar fetch qilindi') + except Exception as e: + return self.error_response(data=str(e), message='xatolik') + + + +class DistrictCreateApiView(generics.CreateAPIView, ResponseMixin): + serializer_class = district_serializers.DistrictSerializer + queryset = District.objects.all() + permission_classes = [permissions.IsAuthenticated] + + @swagger_auto_schema( + responses={ + 201: base_serializers.SuccessResponseSerializer(data_serializer=district_serializers.DistrictSerializer()), + 400: base_serializers.BaseResponseSerializer(), + 500: base_serializers.BaseResponseSerializer(), + } + ) + def post(self, request): + try: + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(raise_exception=True): + name = serializer.validated_data.get('name') + obj = District.objects.create(name=name, user=request.user) + return self.success_response( + data=district_serializers.DistrictSerializer(obj), + message='malumot qoshildi', + status_code=201 + ) + return self.failure_response(data=serializer.errors, message='malumot qoshilmadi') + except Exception as e: + return self.error_response(data=str(e), message='xatolik') \ No newline at end of file