This commit is contained in:
behruz-dev
2025-11-05 13:54:25 +05:00
parent dd6c7ce9dc
commit 5626269999
12 changed files with 194 additions and 7 deletions

View File

@@ -0,0 +1,2 @@
from .contract import *
from .folder import *

View File

@@ -0,0 +1,8 @@
from django.contrib import admin
from core.apps.contracts.models.folder import Folder
@admin.register(Folder)
class FolderAdmin(admin.ModelAdmin):
list_display = ['id', 'name']

View File

@@ -6,4 +6,4 @@ class ContractsConfig(AppConfig):
name = 'core.apps.contracts' name = 'core.apps.contracts'
def ready(self): def ready(self):
import core.apps.contracts.admins.contract import core.apps.contracts.admins

View File

@@ -0,0 +1,39 @@
# Generated by Django 5.2 on 2025-11-05 12:14
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Folder',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=200)),
],
options={
'abstract': False,
},
),
migrations.AlterField(
model_name='contract',
name='company',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contracts', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='contract',
name='folder',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='countracts', to='contracts.folder'),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 5.2 on 2025-11-05 12:25
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0002_folder_alter_contract_company_contract_folder'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterModelOptions(
name='folder',
options={'verbose_name': 'Fayl', 'verbose_name_plural': 'Fayllar'},
),
migrations.AddField(
model_name='folder',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='folders', to=settings.AUTH_USER_MODEL),
),
]

View File

@@ -1 +1,2 @@
from .contract import * from .contract import *
from .folder import *

View File

@@ -6,6 +6,7 @@ from django.contrib.auth import get_user_model
from django.utils import timezone from django.utils import timezone
from core.apps.shared.models.base import BaseModel from core.apps.shared.models.base import BaseModel
from core.apps.contracts.models.folder import Folder
from core.apps.contracts.enums.contract import SIDES, STATUS from core.apps.contracts.enums.contract import SIDES, STATUS
from core.apps.contracts.enums.contract_side import ROLE from core.apps.contracts.enums.contract_side import ROLE
from core.apps.contracts.enums.contract_signature import SIGNATURE_TYPE, SIGNATURE_STATUS from core.apps.contracts.enums.contract_signature import SIGNATURE_TYPE, SIGNATURE_STATUS
@@ -24,7 +25,8 @@ class Contract(BaseModel):
add_folder = models.BooleanField(default=False) add_folder = models.BooleanField(default=False)
add_notification = models.BooleanField(default=False) add_notification = models.BooleanField(default=False)
company = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='c') company = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='contracts')
folder = models.ForeignKey(Folder, on_delete=models.SET_NULL, null=True, blank=True, related_name='countracts')
def __str__(self): def __str__(self):
return f'{self.name}' return f'{self.name}'

View File

@@ -0,0 +1,16 @@
from django.db import models
from core.apps.shared.models import BaseModel
from core.apps.accounts.models import User
class Folder(BaseModel):
name = models.CharField(max_length=200)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folders', null=True )
def __str__(self):
return f"{self.name} folder {self.user.username}"
class Meta:
verbose_name = "Fayl"
verbose_name_plural = "Fayllar"

View File

@@ -2,7 +2,7 @@ from django.db import transaction
from rest_framework import serializers from rest_framework import serializers
from core.apps.contracts.models.contract import Contract from core.apps.contracts.models.contract import Contract, Folder
from core.apps.contracts.serializers.contract_side import ContractSideCreateSerializer, ContractSideListSerializer from core.apps.contracts.serializers.contract_side import ContractSideCreateSerializer, ContractSideListSerializer
@@ -15,6 +15,15 @@ class ContractCreateSerializer(serializers.Serializer):
attach_file = serializers.BooleanField() attach_file = serializers.BooleanField()
add_folder = serializers.BooleanField() add_folder = serializers.BooleanField()
add_notification = serializers.BooleanField() add_notification = serializers.BooleanField()
folder_id = serializers.UUIDField(required=False)
def validate(self, data):
if data.get('folder_id'):
folder = Folder.objects.filter(id=data.get('folder_id')).first()
if not folder:
raise serializers.ValidationError("Folder not found")
data['folder'] = folder
return data
def create(self, validated_data): def create(self, validated_data):
with transaction.atomic(): with transaction.atomic():
@@ -28,7 +37,8 @@ class ContractCreateSerializer(serializers.Serializer):
attach_file=validated_data.pop('attach_file'), attach_file=validated_data.pop('attach_file'),
add_folder=validated_data.pop('add_folder'), add_folder=validated_data.pop('add_folder'),
add_notification=validated_data.pop('add_notification'), add_notification=validated_data.pop('add_notification'),
company=user company=user,
folder=validated_data.get('folder'),
) )
return contract.id return contract.id

View File

@@ -0,0 +1,31 @@
from rest_framework import serializers
from core.apps.contracts.models import Folder
class FolderListSerializer(serializers.ModelSerializer):
class Meta:
model = Folder
fields = [
'id', 'name'
]
class FolderSerializer(serializers.ModelSerializer):
class Meta:
model = Folder
fields = [
'name'
]
def create(self, validated_data):
folder = Folder.objects.create(
name=validated_data.get('name'),
user=self.context.get('user'),
)
return folder
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.save()
return instance

View File

@@ -3,7 +3,7 @@ from django.urls import path, include
from core.apps.contracts.views import contract as contract_views from core.apps.contracts.views import contract as contract_views
from core.apps.contracts.views import contract_side as contract_side_views from core.apps.contracts.views import contract_side as contract_side_views
from core.apps.contracts.views import contract_signature as contract_signature_views from core.apps.contracts.views import contract_signature as contract_signature_views
from core.apps.contracts.views import folder as folder_views
urlpatterns = [ urlpatterns = [
path('contract/', include( path('contract/', include(
@@ -22,5 +22,12 @@ urlpatterns = [
path('send_signature_code/<uuid:signature_id>/', contract_signature_views.SendContractSignatureCodeApiView.as_view(), name='send-signature-code'), path('send_signature_code/<uuid:signature_id>/', contract_signature_views.SendContractSignatureCodeApiView.as_view(), name='send-signature-code'),
path('sign_contract/', contract_signature_views.SigningContractApiView.as_view(), name='sign-contract'), path('sign_contract/', contract_signature_views.SigningContractApiView.as_view(), name='sign-contract'),
] ]
)) )),
path('folder/', include(
[
path('list/', folder_views.FolderListApiView.as_view()),
path('create/', folder_views.FolderCreateApiView.as_view()),
path('<uuid:folder_id>/update/', folder_views.FolderUpdateApiView.as_view()),
]
)),
] ]

View File

@@ -0,0 +1,46 @@
from django.shortcuts import get_object_or_404
from rest_framework import generics, views
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from core.apps.contracts.models.folder import Folder
from core.apps.contracts.serializers import folder as serializers
class FolderListApiView(views.APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
user = request.user
folders = Folder.objects.filter(user=user)
serializer = serializers.FolderListSerializer(folders, many=True)
return Response(serializer.data, status=200)
class FolderCreateApiView(generics.GenericAPIView):
serializer_class = serializers.FolderSerializer
queryset = Folder.objects.all()
permission_classes = [IsAuthenticated]
def post(self, request):
user = request.user
serializer = self.serializer_class(data=request.data, context={"user": user})
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response({"message":"Folder qoshild"}, status=200)
return Response(serializer.errors, status=400)
class FolderUpdateApiView(generics.GenericAPIView):
serializer_class = serializers.FolderSerializer
queryset = Folder.objects.all()
permission_classes = [IsAuthenticated]
def patch(self, request, folder_id):
user = request.user
folder = get_object_or_404(Folder, id=folder_id, user=user)
serializer = self.serializer_class(data=request.data, instance=folder)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response({"message":"Folder tahrirlandi"}, status=200)
return Response(serializer.errors, status=400)