remove unnecessary models
This commit is contained in:
@@ -66,7 +66,7 @@ class ChoiseRoleSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
try:
|
try:
|
||||||
user = User.objects.get(phone=data.get("phone"), is_active=False)
|
user = User.objects.get(phone=data.get("phone"), is_active=True)
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
raise serializers.ValidationError({"detail": "user not found"})
|
raise serializers.ValidationError({"detail": "user not found"})
|
||||||
data['user'] = user
|
data['user'] = user
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from core.apps.contracts.models.contract import Contract, ContractFile, ContractNotification,ContractSide, ContractSignature
|
from core.apps.contracts.models.contract import Contract, ContractSide, ContractSignature
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Contract)
|
@admin.register(Contract)
|
||||||
@@ -11,13 +11,6 @@ class ContractAdmin(admin.ModelAdmin):
|
|||||||
class ContractSideAdmin(admin.ModelAdmin):
|
class ContractSideAdmin(admin.ModelAdmin):
|
||||||
list_display = ['id', 'full_name']
|
list_display = ['id', 'full_name']
|
||||||
|
|
||||||
@admin.register(ContractFile)
|
|
||||||
class ContractFileAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ['id', 'name']
|
|
||||||
|
|
||||||
@admin.register(ContractNotification)
|
|
||||||
class ContractNotificationAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ['id', 'message', 'contract']
|
|
||||||
|
|
||||||
@admin.register(ContractSignature)
|
@admin.register(ContractSignature)
|
||||||
class ContractSignatureAdmin(admin.ModelAdmin):
|
class ContractSignatureAdmin(admin.ModelAdmin):
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# Generated by Django 5.2 on 2025-07-16 14:45
|
# Generated by Django 5.2 on 2025-07-16 17:14
|
||||||
|
|
||||||
import django.contrib.postgres.fields
|
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import uuid
|
import uuid
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@@ -31,6 +30,7 @@ class Migration(migrations.Migration):
|
|||||||
('attach_file', models.BooleanField(default=False)),
|
('attach_file', models.BooleanField(default=False)),
|
||||||
('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(on_delete=django.db.models.deletion.CASCADE, related_name='c', to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'contract',
|
'verbose_name': 'contract',
|
||||||
@@ -38,43 +38,6 @@ class Migration(migrations.Migration):
|
|||||||
'db_table': 'contracts',
|
'db_table': 'contracts',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
|
||||||
name='ContractFile',
|
|
||||||
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=150)),
|
|
||||||
('file_type', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('all_files', 'all files'), ('PDF', 'pdf'), ('word_files', 'word files'), ('image', 'image')], max_length=10), blank=True, default=list, size=None)),
|
|
||||||
('user_permission', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('all', 'all'), ('add', 'add'), ('delete', 'delete')], max_length=10), blank=True, default=list, size=None)),
|
|
||||||
('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contract_files', to='contracts.contract')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'contract file',
|
|
||||||
'verbose_name_plural': 'contract files',
|
|
||||||
'db_table': 'contract_files',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='ContractNotification',
|
|
||||||
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)),
|
|
||||||
('notification_event', models.CharField(choices=[('exact_date', 'exact date'), ('counterparty_signing', 'counterparty signing'), ('signature_all_parties', 'Signature of all parties')], max_length=24)),
|
|
||||||
('type_notification', models.CharField(choices=[('sms', 'sms'), ('whatsup', 'whatsup')], max_length=8)),
|
|
||||||
('type_message', models.CharField(blank=True, choices=[('krill', 'krill'), ('latin', 'latin')], max_length=8, null=True)),
|
|
||||||
('message', models.CharField(max_length=160)),
|
|
||||||
('time', models.TimeField(blank=True, null=True)),
|
|
||||||
('date', models.DateField(blank=True, null=True)),
|
|
||||||
('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contract_notifications', to='contracts.contract')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'contract notification',
|
|
||||||
'verbose_name_plural': 'contract notifications',
|
|
||||||
'db_table': 'contract_notifications',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='ContractSide',
|
name='ContractSide',
|
||||||
fields=[
|
fields=[
|
||||||
|
|||||||
@@ -5,10 +5,7 @@ from django.contrib.postgres.fields import ArrayField
|
|||||||
from core.apps.shared.models.base import BaseModel
|
from core.apps.shared.models.base import BaseModel
|
||||||
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_file import FILE_TYPE, USER_PERMISSION
|
|
||||||
from core.apps.contracts.enums.contract_signature import SIGNATURE_TYPE, SIGNATURE_STATUS
|
from core.apps.contracts.enums.contract_signature import SIGNATURE_TYPE, SIGNATURE_STATUS
|
||||||
from core.apps.contracts.enums.contract_notification import NOTIFICATION_EVENT, TYPE_MESSAGE, TYPE_NOTIFICATION
|
|
||||||
from core.apps.accounts.validators.user import phone_regex
|
|
||||||
|
|
||||||
|
|
||||||
class Contract(BaseModel):
|
class Contract(BaseModel):
|
||||||
@@ -24,6 +21,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')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.name}'
|
return f'{self.name}'
|
||||||
|
|
||||||
@@ -55,49 +54,6 @@ class ContractSide(BaseModel):
|
|||||||
unique_together = ['contract', 'user']
|
unique_together = ['contract', 'user']
|
||||||
|
|
||||||
|
|
||||||
class ContractFile(BaseModel):
|
|
||||||
name = models.CharField(max_length=150)
|
|
||||||
file_type = ArrayField(
|
|
||||||
models.CharField(max_length=10, choices=FILE_TYPE),
|
|
||||||
default=list,
|
|
||||||
blank=True
|
|
||||||
)
|
|
||||||
user_permission = ArrayField(
|
|
||||||
models.CharField(max_length=10, choices=USER_PERMISSION),
|
|
||||||
default=list,
|
|
||||||
blank=True
|
|
||||||
)
|
|
||||||
contract = models.ForeignKey(Contract, on_delete=models.CASCADE, related_name='contract_files')
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f'{self.name} - {self.contract}'
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'contract file'
|
|
||||||
verbose_name_plural = 'contract files'
|
|
||||||
db_table = 'contract_files'
|
|
||||||
|
|
||||||
|
|
||||||
class ContractNotification(BaseModel):
|
|
||||||
notification_event = models.CharField(choices=NOTIFICATION_EVENT, max_length=24)
|
|
||||||
type_notification = models.CharField(choices=TYPE_NOTIFICATION, max_length=8)
|
|
||||||
type_message = models.CharField(null=True, blank=True, choices=TYPE_MESSAGE, max_length=8)
|
|
||||||
|
|
||||||
message = models.CharField(max_length=160)
|
|
||||||
time = models.TimeField(null=True, blank=True)
|
|
||||||
date = models.DateField(null=True, blank=True)
|
|
||||||
|
|
||||||
contract = models.ForeignKey(Contract, on_delete=models.CASCADE, related_name="contract_notifications")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f'{self.type_notification} - {self.contract}'
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'contract notification'
|
|
||||||
verbose_name_plural = 'contract notifications'
|
|
||||||
db_table = 'contract_notifications'
|
|
||||||
|
|
||||||
|
|
||||||
class ContractSignature(BaseModel):
|
class ContractSignature(BaseModel):
|
||||||
contract = models.ForeignKey(Contract, on_delete=models.CASCADE, related_name='contract_signatures')
|
contract = models.ForeignKey(Contract, on_delete=models.CASCADE, related_name='contract_signatures')
|
||||||
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='contract_users')
|
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='contract_users')
|
||||||
|
|||||||
@@ -3,7 +3,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
|
||||||
from core.apps.contracts.serializers.contract_side import ContractSideCreateSerializer
|
from core.apps.contracts.serializers.contract_side import ContractSideCreateSerializer, ContractSideListSerializer
|
||||||
|
|
||||||
|
|
||||||
class ContractCreateSerializer(serializers.Serializer):
|
class ContractCreateSerializer(serializers.Serializer):
|
||||||
@@ -18,6 +18,7 @@ class ContractCreateSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
|
user = self.context.get('user')
|
||||||
contract = Contract.objects.create(
|
contract = Contract.objects.create(
|
||||||
file=validated_data.pop('file'),
|
file=validated_data.pop('file'),
|
||||||
contract_number=validated_data.pop('contract_number'),
|
contract_number=validated_data.pop('contract_number'),
|
||||||
@@ -27,6 +28,7 @@ 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
|
||||||
)
|
)
|
||||||
return contract.id
|
return contract.id
|
||||||
|
|
||||||
@@ -37,3 +39,13 @@ class ContractListSerializer(serializers.ModelSerializer):
|
|||||||
fields = [
|
fields = [
|
||||||
'id', 'name', 'file', 'contract_number', 'sides', 'face_id', 'add_folder', 'attach_file', 'add_notification', 'created_at'
|
'id', 'name', 'file', 'contract_number', 'sides', 'face_id', 'add_folder', 'attach_file', 'add_notification', 'created_at'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class ContractDetailSerializer(serializers.ModelSerializer):
|
||||||
|
contract_sides = ContractSideListSerializer(many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Contract
|
||||||
|
fields = [
|
||||||
|
'id', 'name', 'file', 'contract_number', 'contract_sides',
|
||||||
|
]
|
||||||
@@ -23,3 +23,10 @@ class ContractSideCreateSerializer(serializers.Serializer):
|
|||||||
raise serializers.ValidationError({'detail': 'Contract not found!'})
|
raise serializers.ValidationError({'detail': 'Contract not found!'})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
class ContractSideListSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = ContractSide
|
||||||
|
fields = [
|
||||||
|
'id', 'full_name', 'user'
|
||||||
|
]
|
||||||
@@ -9,6 +9,7 @@ urlpatterns = [
|
|||||||
[
|
[
|
||||||
path('create/', contract_views.ContractCreateApiView.as_view(), name='create-contract'),
|
path('create/', contract_views.ContractCreateApiView.as_view(), name='create-contract'),
|
||||||
path('list/', contract_views.ContractListApiView.as_view(), name='list-contract'),
|
path('list/', contract_views.ContractListApiView.as_view(), name='list-contract'),
|
||||||
|
path('<uuid:id>/', contract_views.ContractDetailApiView.as_view(), name='detail-contract'),
|
||||||
]
|
]
|
||||||
)),
|
)),
|
||||||
path('contract_side/', include([
|
path('contract_side/', include([
|
||||||
|
|||||||
@@ -32,3 +32,12 @@ class ContractListApiView(generics.ListAPIView):
|
|||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return Contract.objects.filter(contract_sides__user=self.request.user)
|
return Contract.objects.filter(contract_sides__user=self.request.user)
|
||||||
|
|
||||||
|
|
||||||
|
class ContractDetailApiView(views.APIView):
|
||||||
|
def get(self, request, id):
|
||||||
|
contract = Contract.objects.filter(id=id, contract_sides__user=request.user).prefetch_related('contract_sides').first()
|
||||||
|
if not contract:
|
||||||
|
return Response({'success': False, "message": 'contract not found'}, status=404)
|
||||||
|
serializer = contract_serializer.ContractDetailSerializer(contract)
|
||||||
|
return Response(serializer.data, status=200)
|
||||||
Reference in New Issue
Block a user