Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions masters/apis/user_apis/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
urlpatterns = [
path('register/', users_views.RegisterAPIView.as_view(), name='register'),
path('login/', users_views.LoginAPIView.as_view(), name='login'),
path('update/', users_views.ProfileUpdateAPIView.as_view(), name='update'),
path('test/', users_views.TestAPIView.as_view(), name='test'),
]
63 changes: 48 additions & 15 deletions masters/apis/user_apis/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,50 @@
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework.parsers import MultiPartParser, FormParser

from rest_framework_simplejwt.tokens import RefreshToken

from users.serializers.user_serializers import LoginSerializer
from users.serializers.user_serializers import RegisterSerializer
from users.serializers.user_serializers import (
RegisterSerializer,
LoginSerializer,
ProfileUpdateSerializer
)

from rest_framework.generics import CreateAPIView
from users.serializers.user_serializers import WorkImageSerializer
from users.models import WorkImage


class WorkImageCreateAPIView(CreateAPIView):
queryset = WorkImage.objects.all()
serializer_class = WorkImageSerializer


class RegisterAPIView(APIView):
permission_classes = [AllowAny]
permission_classes = [AllowAny]
parser_classes = [MultiPartParser, FormParser]

def post(self, request):
serializer = RegisterSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
return Response({
"message": "İstifadəçi uğurla yaradıldı.",
"user": {
"id": user.id,
"full_name": f"{user.first_name} {user.last_name}",
"mobile_number": user.mobile_number
}
}, status=status.HTTP_201_CREATED)
print("REQUEST GƏLDİ")
try:
user = serializer.save()
return Response({
"message": "İstifadəçi uğurla yaradıldı.",
"user": {
"id": user.id,
"full_name": f"{user.first_name} {user.last_name}",
"mobile_number": user.mobile_number
}
}, status=status.HTTP_201_CREATED)
except ValidationError as e:
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
return Response({"detail": "Gözlənilməz bir xəta baş verdi."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


"""

Expand Down Expand Up @@ -81,6 +101,19 @@ def get(self, request):

if user:
return Response({'mobile_number': user.mobile_number,
'first_name': user.first_name})
'first_name': user.first_name})
else:
return Response({'detal': 'ok'})
return Response({'detal': 'ok'})



class ProfileUpdateAPIView(APIView):
permission_classes = [IsAuthenticated]

def patch(self, request):
user = request.user
serializer = ProfileUpdateSerializer(user, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
23 changes: 21 additions & 2 deletions masters/core/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Generated by Django 5.2.1 on 2025-05-27 20:23
# Generated by Django 5.2.1 on 2025-06-11 22:02

import django.db.models.deletion
from django.db import migrations, models


Expand All @@ -15,7 +16,25 @@ class Migration(migrations.Migration):
name='City',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(choices=[('baku', 'Bakı'), ('ganca', 'Gəncə'), ('sumqayit', 'Sumqayıt'), ('mingechevir', 'Mingəçevir'), ('lenkeran', 'Lənkəran'), ('shirvan', 'Şirvan'), ('nakhchivan', 'Naxçıvan'), ('sheki', 'Şəki'), ('guba', 'Quba'), ('gakh', 'Qax'), ('qabala', 'Qəbələ'), ('salyan', 'Salyan'), ('masalli', 'Masallı'), ('bilesuvar', 'Biləsuvar'), ('imisli', 'İmişli'), ('yevlakh', 'Yevlax'), ('hajigabul', 'Hacıqabul'), ('berde', 'Bərdə'), ('aghdash', 'Ağdaş'), ('sabirabad', 'Sabirabad'), ('saatli', 'Saatlı'), ('zardab', 'Zərdab'), ('shamakhi', 'Şamaxı'), ('aghsu', 'Ağsu'), ('ismayilli', 'İsmayıllı'), ('qusar', 'Qusar'), ('khachmaz', 'Xaçmaz'), ('shabran', 'Şabran'), ('oguz', 'Oğuz'), ('goychay', 'Göyçay'), ('ucar', 'Ucar'), ('zagatala', 'Zaqatala'), ('balaken', 'Balakən'), ('dashkasan', 'Daşkəsən'), ('lachin', 'Laçın'), ('kelbajar', 'Kəlbəcər'), ('terter', 'Tərtər'), ('fuzuli', 'Füzuli'), ('jabrayil', 'Cəbrayıl'), ('qubadli', 'Qubadlı'), ('zangilan', 'Zəngilan'), ('khodjavend', 'Xocavənd'), ('aghdam', 'Ağdam'), ('aghjabadi', 'Ağcabədi')], default='Bakı', max_length=50)),
('name', models.CharField(max_length=60, unique=True)),
('display_name', models.CharField(max_length=60)),
],
),
migrations.CreateModel(
name='Language',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20, unique=True)),
('display_name', models.CharField(max_length=20)),
],
),
migrations.CreateModel(
name='District',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=60, unique=True)),
('display_name', models.CharField(max_length=60, unique=True)),
('city', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='districts', to='core.city')),
],
),
]
25 changes: 25 additions & 0 deletions masters/masters/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
'rest_framework_swagger',
'drf_yasg',
'cities_light',
'corsheaders',

#Apps
'users',
Expand All @@ -41,6 +42,8 @@
]

MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',

'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
Expand All @@ -50,7 +53,29 @@
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ALLOW_HEADERS = [
'content-type',
'authorization',
'x-csrftoken',
'accept',
'origin',
'user-agent',
'x-requested-with',
]


CORS_ALLOW_ALL_ORIGINS = False

CORS_ALLOWED_ORIGINS = [
"http://localhost:5173",
"https://9459-213-172-90-209.ngrok-free.app",
]

CORS_ALLOW_CREDENTIALS = True


ROOT_URLCONF = 'masters.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
Expand Down
1 change: 1 addition & 0 deletions masters/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ coreschema==0.0.4
Django==5.2.1
django-autoslug==1.9.9
django-cities-light==3.10.1
django-cors-headers==4.7.0
django-rest-swagger==2.2.0
djangorestframework==3.16.0
djangorestframework_simplejwt==5.5.0
Expand Down
17 changes: 17 additions & 0 deletions masters/users/migrations/0009_remove_workimage_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.2.1 on 2025-06-08 21:02

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('users', '0008_rename_cits_customuser_cities'),
]

operations = [
migrations.RemoveField(
model_name='workimage',
name='order',
),
]
2 changes: 1 addition & 1 deletion masters/users/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .models import *
# from .models import *
from .models.user_model import CustomUser
from .models.language_model import Language
from .models.work_image_model import WorkImage
2 changes: 1 addition & 1 deletion masters/users/models/user_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ..validators import az_letter_validator, phone_validator
from ..user_managers import CustomUserManager

from core.models import City
from core.models.city_model import City
from .language_model import Language
from .work_image_model import WorkImage

Expand Down
6 changes: 4 additions & 2 deletions masters/users/models/work_image_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@

class WorkImage(models.Model):
image = models.ImageField(upload_to='work_images/', verbose_name="İş şəkli")
order = models.PositiveIntegerField(default=0, verbose_name="Sıra")

def __str__(self):
return f"İş Şəkli {self.image.url}"
try:
return f"İş Şəkli {self.image.url}"
except ValueError:
return "İş Şəkli (fayl yoxdur)"
Loading